Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Projekt AVR - RTOS pytania podstawowe.

tadzik85 18 Apr 2010 12:04 2770 8
Tespol
  • #1
    tadzik85
    Level 38  
    Witam.

    Od dawna zajmuje się procesorami AVR. Głownie projektowaniem sterowników.
    Obecnie projektuje pewien sterownik. W jego skład w chodzą 4 siłowniki zamka centralnego, 4 krańcówki związane z ich zadziałaniem. Wyjście i wejście alarmowe. Wejścia sabotażowe. RTC oraz EEPROM 24c256. Buzzer. Wyświetlacz LCD oraz klawiatura 4x4. Komunikacja z PCtem. Układ powstaje w oparciu o Mega64.

    Podczas przeglądania tego forum i internetu zauważyłem ze istnieje wiele systemów operacyjnych, które można zaimplementować na tych procesorach. A fakt ze nie mam żadnego pojęcia o nich mam do kolegów kilka pytań:

    1. Czy w tym projekcie warto zastosować RTOS? Problemem jest w nim dla mnie fakt, że liczniki wykorzystuje chyba maksymalnie co stanowi dla mnie największy problem. RTOS pewnie załatwiłby ten problem?
    2. Przy jak zaawansowanych projektach warto realizować je na RTOSie. Oraz co przemawia za jego zastosowaniem.
    3. Mimo wszystko chciałbym zapoznać się z jakimś przystępnym RTOsem na AVR.
    Jaki wybrać? Od czego zacząć. Polecicie jakąś literaturę?
  • Tespol
  • Helpful post
    #2
    nenpa8lo
    Level 17  
    1. Wg mnie jest to wystarczająco złożony projekt by zastosować RTOS. RTOS zazwyczaj ma ustawialny system tick, możesz go wykorzystać na swoje potrzeby. Ma to jednak sens do pewnej granicy, bo na pewno nie ma sensu robienia system tick na poziomie mikrosekund. Taką rozdzielczość musiał byś zrobić w swoim zakresie na poziomie aplikacji.
    2. Trudno powiedzieć dokładnie w jakim momencie należy używać RTOS, widziałem złożony system alarmowy bez RTOSa i znacznie bardziej prosty na RTOSie. Faktem jest że system z RTOSem ułatwia debugowanie programu. RTOS po prostu daje większą stabilność/obliczalność systemu.
    3. Polecam FreeRTOS.
  • Tespol
  • #3
    tadzik85
    Level 38  
    A jakieś przykłady literatura kursy?
    W tej dziedzinie jestem naprawdę zielony.
  • #4
    tmf
    Moderator of Microcontroller designs
    Napisałeś jak zbudowany jest twój układ (swoją droga nie jest zbyt skomplikowany), natomiast nie napisałeś co on ma robić. A to będzie determinować czy wykorzystanie RTOS jest uzasadnione. IMHO niepotrzebnie ładujesz się w kłopoty, lepiej to zrobić klasycznie.
  • #5
    tadzik85
    Level 38  
    Tak projekt już powstał i jest na ukończeniu.
    Co ma robić? to sterownik multimetru.
    System logowania użytkowników:
    32kasjerów
    9 kierowników
    1 główny

    4 szuflady z ustawianą zwłoką otwarcia, czasem na otwarcie i czasem na zamkniecie. Historia zdarzeń (2000) pozycji.
    Sygnał alarmowy po wprowadzeniu kodu o 1 większego lub mniejszego. Wejście alarmowe umożliwiające zablokowanie szuflad lub doliczenie dodatkowe zwłoki. Ustawiany maksymalny czas pracy użytkownika (autowylogowanie). Wygaszacz LCD wraz z powrotem menu na poziom najwyższy. To tak w skrócie.

    Wiem ze wszystko można jednak zrobić klasycznie. A przypuszczam, ze znając jakiegoś RTOSa można coś zrobić szybciej.
  • #6
    tmf
    Moderator of Microcontroller designs
    RTOS to dużo dodatkowych kłopotów - zarządzanie pamięcią, problem jednoczesnego dostępu do zasobów itd. W twoim przypadku nie widzę jakiegoś sensownego podziału na oddzielne zadania, co by uzasadniało zabawe z RTOS. Weź też pod uwagę, że na AVR debugowanie takiej aplikacji jest praktycznie niemożliwe - żaden debugger nie wspiera takich rzeczy, a zabawa w sekwencyjne śledzenie wykonywania programu i potem analizowanie ramek na stosie itd. jest mocno nieciekawa.
  • #7
    tadzik85
    Level 38  
    Ok. Wiec nie RTOS. Ale głównym problemem w tym projekcie są zależności czasowe.
    Max czas pracy jest zrealizowany w godzinach (0-99) wykorzystałem w tym celu alarm z PCFka. Potem wygaszacz 1minuta zrealizowany na T1 i sygnale zegarowym 1024 z PCF. Najgorszej gdy wchodzę w opcje otwierania. Tam tych czasów jest mnóstwo. Czas do otwarcia. Czas na otwarcie (oczekiwanie na potwierdzenie), czas na zamkniecie. Jeden licznik 8-bit pracuje taktując odczyt klawiatury. Inny 16bitowy zarezerwowany na czas zwarcia wyjścia alarmowego. Drugi 16-bitowy w przerwaniu co 1s instrumentuje zmienną i wg niej ustalam wszelakie czasu w pętli opcji otwierania. Często przerwania z trybu CTC wykorzystuje bez wrzucania na stos wartości rejestrów i innych modyfikując np zmienną menu i wywołując funkcję pętli głównej. Strasznie zawile się to zrobiło.

    Jak wy radzicie sobie z dusza ilością zależności czasowych? szczególnie gdy liczników jest mało a czasu dość duże?
  • Helpful post
    #8
    BoskiDialer
    Level 34  
    Przy czasach na poziomie sekund, minut to nie jest to żaden problem. Jeden timer ustawić na stałe przerwanie np co 100ms, w przerwaniu od tego timera przeglądać jakąś tablicę, w której każdy jeden element odpowiada jednemu programowemu licznikowi. Zmniejszać liczniki w elementach w tej tablicy, po czym po wyzerowaniu się wywołać jakąś funkcję. W moich zastosowaniach zazwyczaj jest to lista struktur, każda zawiera: wskaźnik na następny timer, liczba taktów do wywołania funkcji, wskaźnik na funkcję oraz dodatkowe pole przekazywane do funkcji. Przy przerwaniu przeglądana jest cała lista, każdy element ma zmniejszany licznik taktów o 1, gdy ten się wyzeruje, wywoływana jest funkcja zadana wskaźnikiem, do której przekazywane są 2 parametry: wskaźnik na timer oraz wartość dodatkowego pola (przydatne, gdy jedna funkcja jest wywoływana w kilku kontekstach). Wystarczy, że utworzę strukturę, wpiszę 3 wartości oraz wywołam funkcję typu timer_register, funkcja się wykona w przyszłości. Brak ograniczeń na liczbę programowych timerów. W innej implementacji timerów miałem listy timerów pogrupowane po czasie jaki pozostał do wykonania, teraz w bardziej skomplikowanym projekcie trzymam listę posortowaną po czasie realizacji, dzięki czemu w przerwaniu do przeglądania jest zawsze tylko kilka początkowych elementów (taka struktura jest wymagana, gdyż timery mam tam sprawdzane praktycznie co 1ms)

    Jeśli każdy programowy licznik będzie oparty o zmienną 32-bitową, to maksymalny czas timera wyniesie wystarczająco dużo (13 lat)
  • #9
    tadzik85
    Level 38  
    Dzięki wielkie. Po pracy z procesorem taktowanym 150Mhz mam chyba problem z tym ze AVR postrzegam jako wolną maszynę. :D Trzeba zmienić podejście.

    Dodano po 12 [minuty]:

    Temacik zamykam. Dziękuje za porady.