FreeRTOS

Za co odpowiadają poszczególne pliki? O czym należy pamiętać?

FreeRTOS nie jest tak skomplikowany jak go malują. Można go wstawiać go do własnego projektu jako "black box". Polecam jednak zapoznać się z jego posczególnymi elementami, zwłaszcza, że jest tu kilka rzeczy na które warto zwrócić uwagę. Główne pliki do umieszczenia w projekcie to:

  • FreeRTOS.h - podstawowy plik z definicjami używanymi przez inne części systemu.

  • FreeRTOSConfig.h - konfiguracja systemu, czyli dopasowanie do sprzętu (np deklaracja częstotliwości taktowania) i do potrzeb usera (np czy chcemy używać muteksów). W nowszych wersjach systemu (>7.0) tu należy umieścić mapowanie obsługi przerwań: #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler

  • portable.h - zawiera definicje funkcji systemowych, których implementacja różni się w zależności od użytego mikrokontrolera (np procedury rozpoczęcia przerania, odkładanie adresu powrotu). Definicje tych funkcji znajdują się w port.c i częściowo w heap_X.c (np w heap_3.c)

  • portmacro.h - zawiera dodatkowe deklaracje (np funkcje czasowo blokującą obsługę przerwań). Należy zwrócić uwagę na #define portBYTE_ALIGNMENT 8 oznacza to, że wartości konfiguracyjne które podajemy powinny być liczbami podzielnymi przez 8. Przykładowo nie możemy zdefiniować stosu dla zadania o wielkości 100kB, musimy wyrównać do 96 lu 104kB.

  • projdefs.h - doprecyzowuje szegóły takie jak kody błedów (treu/false, pass/fail, etc)

  • queue.h - implementuje mechanizm kolejki czyli dostępnego dla wszystkich tasków bufora na dane którymi mogą się wymieniać.

  • semphr.h - zawiera definicje mechanizmu semaforów, które ustalają dostęp do zasobów. Semaphory są rodzajem blokady na określony zasób, którą to jeden task może założyć, a inny zdjąć. Jest to niejako rozwinięcie koncepcji mutexów, gdzie blokade mógł zdjąć tylko task ( thread, funkcja,etc) zakładający.

  • task.h - zawiera definicje zadan, czyli odpowiedników pecetowych programów.

  • timers.h - zawiefa definicje timerów, m.in głównego licznika według którego zadania mogą być zawieszane i przywracane do działania

  • heap_3.c - plik źródłówy o którym łatwo zapomnieć - twórcy schowali go w katalogu z portami (/FreeRTOS/Source/portable/MemMang/), mimo, że sam w sobie nie jest portem.

    Istnieje 5 plików z rodziny heap_X.c (heap_1.c, heap_2.c, etc), różnią się one złożonością mechanizmów obsługi pamięci.

    Dla przykładu heap_1.c w ogóle nie daje możliwości usuwania tasków, a heap_5.c pozwala na łączenie pamięci zwolnionej w różnych strefach. Ja użyłem heap_3.c, ale można wybrać dowolny inny - w zależności od potrzeb.

  • event_groups.h - zarządza wykonywaniem tasków



Drobna wskazówka na koniec

W przypadku błędów kompilatora:

  • Error: registers may not be the same -- `strexb r3,r2,[r3]'
  • Error: registers may not be the same -- `strexh r3,r2,[r3]'

Należy w pliku core_cm3.c dodać znaki logicznego ilorazu & przed pierwszą nazwą symboliczną rejestru (litera r) w dwóch funkcjach: __STREXB i __STREXH :

GCC czasem ma problem z interpertacją tej funkcji, dlatego konieczne jest naniesienie tej drobnej poprawki.

Znając strukture systemu możemy się dowiedzieć jak zacząć z FreeRTOS Kwestia organizacji plików w projektach nie powinna być pomijana. Nawet jeżeli nie będziemy modyfikować tych plików dobrze jest wiedzieć do czego służą.

TAGS: FreeRTOS jak skonfigurować FreeRTOS start, Unit testy