Segger embOS – RTOS dla wymagających. Najprostsza aplikacja
Coraz większa wydajność mikrokontrolerów pozwala na stosowanie rozbudowanych bibliotek ułatwiających korzystanie z zaawansowanych układów peryferyjnych wbudowanych w te mikrokontrolery. Wykorzystanie olbrzymiego potencjału tych nowoczesnych układów może być znacznie ułatwione, gdy projektant/programista zastosuje odpowiedni system operacyjny. Jednym z takich systemów jest oprogramowanie embOS firmy Segger. Najważniejsze z jego cech to:
- szeregowanie zadań z wywłaszczaniem,
- zadania o tym samym priorytecie są szeregowane wg. algorytmu round robin,
- wywłaszczanie można zablokować dla poszczególnych zadań lub fragmentów programu,
- 255 poziomów priorytetów,
- nieograniczona liczba zadań,
- nieograniczona liczba semaforów,
- nieograniczona liczba mailboxów,
- programowe timery z możliwością konfiguracji wielkości kwantu czasu,
- zarządzanie poborem energii,
- duża liczba aplikacji przykładowych i BSP,
- embOSView – narzędzie umożliwiające profilowanie, śledzenie procesów, monitorowanie obciążenia procesora itp.
Lista rodzin procesorów i mikrokontrolerów, na których może pracować embOS jest imponująca. Są na niej m.in. popularne w Polsce układy z rodzin:
- wyposażonych w rdzenie ARM7/9/11,
- wyposażonych w rdzenie ARM Cortex-M,
- wyposażonych w rdzenie ARM Cortex-A,
- AVR,
- AVR32,
- STM8,
- 8051.
Wersje próbne z przykładowymi aplikacjami zostały przygotowane zależnie od platformy sprzętowej dla różnych kompilatorów, pełna lista znajduje się na stronie producenta. Ograniczeniem wersji próbnej jest możliwość uruchomienia jednocześnie do trzech zadań, po uruchomieniu czwartego system zostanie zatrzymany po 12 godzinach pracy. Tej wersji nie można również używać do celów komercyjnych.
Aby pokazać jak łatwe jest tworzenie współbieżnie działających zadań w embOS-ie, przeanalizuję przykładowy projekt dostarczany przez producenta systemu operacyjnego. Po rozpakowaniu archiwum pobranego ze strony firmy Segger musimy odnaleźć właściwy plik projektu (jest on zależny od stosowanego sprzętu oraz środowiska programistycznego). Ja użyłem zestawu uruchomieniowego STM3240G-EVAL pokazanego na rysunku 1. Odpowiedni projekt znajduje się w katalogu embOS\Start\BoardSupport\ST\STM32F40G_Eval\ i jest przeznaczony dla środowiska Keil uVision (należy wcześniej zaopatrzyć się w wersję ewaluacyjną tego środowiska). Projekt ten należy otworzyć. Następnie otwieramy plik Start_LEDBlink.c, który znajduje się grupie Application (rysunek 2). Zgodnie ze zwyczajem pierwszy program na mikrokontroler powinien migać diodą, tak jest i w tym przypadku, migać będą nawet dwie diody, jedna z częstotliwością 2,5 Hz, druga z częstotliwością 10 Hz. „Praca” każdej z diod będzie sterowana osobnym zadaniem.
Fot. 1. Wygląd zestawu STM3240G-EVAL
Rys. 2. Lokalizacja projektu w środowisku uVision
#include "RTOS.h" #include "BSP.h" OS_STACKPTR int StackHP[128], StackLP[128]; /* Task stacks */ OS_TASK TCBHP, TCBLP; /* Task-control-blocks */ static void HPTask(void) { while (1) { BSP_ToggleLED(0); OS_Delay (50); } } static void LPTask(void) { while (1) { BSP_ToggleLED(1); OS_Delay (200); } } /********************************************************************* * * main * *********************************************************************/ int main(void) { OS_IncDI(); /* Initially disable interrupts */ OS_InitKern(); /* Initialize OS */ OS_InitHW(); /* Initialize Hardware for OS */ BSP_Init(); /* Initialize LED ports */ /* You need to create at least one task before calling OS_Start() */ OS_CREATETASK(&TCBHP, "HP Task", HPTask, 100, StackHP); OS_CREATETASK(&TCBLP, "LP Task", LPTask, 50, StackLP); OS_Start(); /* Start multitasking */ return 0; }
W powyższym przykładzie w funkcji main przed wywołaniem funkcji OS_Start są tworzone dwa zadania (HPTask i LPTask). Do utworzenia zadania jest używana funkcja OS_CREATETASK, która w zależności od konfiguracji systemu może przyjmować różne parametry. W naszym najprostszym przypadku musimy podać pięć parametrów:
- wskaźnik do struktury zawierającej informacje dotyczące zadania. Nie musimy się zagłębiać w budowę struktury, należy po prostu zadeklarować zmienną i przekazać wskaźnik do niej jako parametr
- nazwę zadania
- wskaźnik do funkcji wykonującej zadanie
- liczbę określającą priorytet zadania z zakresu 1…255 (im większa wartość, tym wyższy priorytet)
- wskaźnik do obszaru pamięci, który będzie stosem naszego zadania
Funkcje HPTask i LPTask w pętli while z opóźnieniami odpowiednio 50 i 200 ms zmieniają stan dwóch diod LED na przeciwny.
Autoryzowanym dystrybutorem firmy Segger w Polsce jest KAMAMI.pl. |