Mini system operacyjny dla STM32 – wprowadzenie

Współczesne oprogramowanie dla mikrokontrolerów staje się coraz bardziej skomplikowane. Użytkownicy systemów coraz częściej oczekują graficznego interfejsu użytkownika, obsługi sieci itp. Wiele czynności w rozbudowanych aplikacjach musi być wykonywane „jednocześnie”.

W takich sytuacjach, pisząc oprogramowanie w sposób klasyczny dzielimy najczęściej zadanie na mniejsze fragmenty za pomocą maszyny stanów zrealizowanej za pomocą konstrukcji switch…case z wykorzystaniem mechanizmu zdarzeń. O ile w przypadku bardzo małych programów takie podejście jest wystarczające, to w przypadku bardziej skomplikowanych aplikacji z uwagi na konieczność tworzenia rozbudowanej maszyny stanów kodowanej w sposób ręczny, rozwiązanie to jest bardzo podatne na błędy.

 

Patrząc od strony przełączania zadań, zakodowana ręcznie maszyna stanów jest niejawnym przełącznikiem zdań (schedulerem), w którym można doszukać się lepiej lub gorzej zaimplementowanych mechanizmów komunikacji międzywątkowej. Rozwiązaniem lepszym w praktyce jest system operacyjny, odpowiedzialny za szeregowanie zadań oraz komunikację między wątkami/procesami. Dzięki takiemu podejściu aplikację możemy podzielić na podzadania bez konieczności używania skomplikowanej maszyny stanów. Aplikacja staje się bardziej czytelna, ponieważ wszystkie zadania możemy zapisać jako liniowy ciąg czynności, a więc kod staje się dużo bardziej czytelny, a całość staje się mniej podatna na błędy.

 

Przykłady wykorzystania systemu ISIX-RTOS w praktyce, napisane w C++, są dostępne tu.

Budowa systemu ISIX-RTOS

Istnieje wiele systemów operacyjnych przeznaczonych dla mikrokontrolerów. Większość z nich cechuje się rozbudowanym API, skomplikowaną konfiguracją uzależnioną od platformy, a czasami dużym rozmiarem kodu. Systemy te również najczęściej narzucają sposób pisania aplikacji. Cechy te skłoniły mnie do opracowania systemu ISIX-RTOS zawierającego proste API, którego można się nauczyć w krótkim czasie.
ISIX-RTOS jest biblioteką obsługi wątków i komunikacji między wątkowej dla mikrokontrolerów, nie narzucającym zupełnie sposobu pisania programu, czy korzystania z ulubionych bibliotek programisty. System powstał z myślą o 32-bitowych mikrokontrolerach ARM (dostępny jest istnieje port dla rdzenia Cortex-M3) oraz możliwości pisania aplikacji w języku C++.
ISIX-RTOS – klasyczny scheduler z priorytetowaniem zadań – charakteryzuje się następującymi cechami:

  • dowolna liczba priorytetów dla zadań (ograniczona jedynie pojemnością pamięci RAM),
  • wywłaszczanie zadań oraz algorytm round-robindla zadań o takim samym priorytecie,
  • komunikacja międzyprocesowa oparta o semafory i kolejki FIFO,
  • wsparcie dla języka C++ oraz wrappery klas dla języka C++,
  • inicjalizacja peryferiów mikrokontrolera poza systemem (oddzielna biblioteka),
  • bardzo małe zasoby zajmowane przez system.

 

System można pobrać ze strony domowej projektu <http://bryndza.boff.pl/index.php?dz=rozne&id=isixrtos>.

ISIX-RTOS ma budowę modułową, dzięki czemu jądro jest zupełnie niezależne od peryferiów mikrokontrolera. ISIX-RTOS składa się z trzech bibliotek linkowanych statycznie:

  • libisix (isix-1.0.tar.gz) – jądro systemu/biblioteka obsługi wątków.
  • libfoundation (libfoundation-1.0.tar.gz) – biblioteka użytecznych funkcji systemowych niezależna od platformy zawierająca lekką implementację funkcji bibliotecznych C/C++ np. printforaz implementacja funkcji niezbędnych dla prawidłowego kompilatora działania C++.
  • libstm32 (libstm32-1.0.tar.gz) – biblioteka uruchomieniowa specyficzna dla danej rodziny mikrokontrolerów zawierająca obsługę układów peryferyjnych, skrypty linkera, skrypty OpenOCD do obsługi interfejsu JTAG.

Modułowa budowa upraszcza strukturę systemu i uniezależnia jądro systemu od funkcji specyficznych dla danego typu mikrokontrolera. Umożliwia również wykorzystanie poszczególnych części zupełnie niezależnie: na przykład biblioteka libstm32 może być użyta w oddzielnym projekcie nie korzystającym z systemu. Takie podejście sprzyja wielokrotnemu użyciu tego samego kodu w wielu projektach i zmniejszeniu liczby błędów.
Biblioteka systemu operacyjnego libisix nie inicjalizuje żadnych układów peryferyjnych mikrokontrolera (poza rdzeniem). Wszystkie funkcje specyficzne znajdują się w bibliotece libstm32 i muszą być wywołane przez aplikację użytkownika.

O autorze