czwartek, 13 stycznia 2022

STM32G0 - Bare Metal - portowanie FreeRTOS-a na przykładzie IDE SEGGER

FreeRTOS-a nie trzeba nikomu przedstawiać to jeden z najbardziej popularnych RTOS-ów na rynku. Jest wiele kursów z obsługi tego systemu , więc wiedzę można na jego temat zdobyć bez problemu. Umiejętność posługiwania się RTOS-ami w świecie MCU jest wielce pożądaną umiejętnością.  FreeRTOS jest zintegrowany z STM32 CUBE MX czy z MPLAB HARMONY w przypadku Microchipa. Na rynku istnieją też komercyjne RTOS-y takie jak np. embOS firmy SEGGER czy RTX Keil'a. W przypadku embOS używanie dla celów niekomercyjnych jest bezpłatne. Komercyjne RTOS-y posiadają m.in certyfikaty w zakresie bezpieczeństwa funkcjonalnego, które jest wymagane dla systemów i urządzeń np. w przemyśle, automotive. FreeRTOS nie posiada certyfikatów w zakresie bezpieczeństwa funkcjonalnego dlatego nie wszędzie można go zastosować . No ale to już jako ciekawostkę przyrodniczą podaję bo dla nas hobbystów nie ma to znaczenia żadnego. W artykule pokażę jakie czynności należy wykonać aby portować FreeRTOS-a dla MCU STM32G0 w środowisku SEGGER-a . Dla innych IDE portowanie będzie przebiegać analogicznie. 

Pierwszą czynnością jest pobranie paczki z FreeRTOS ze strony producenta . Następnie tworzymy sobie nowy pusty projekt w IDE SEGGER-a a w nim katalog FreeRTOS. U mnie wygląda to jak na obrazku poniżej :


Do folderu FreeRTOS wrzucamy folder Source z pobranej paczki. W folderze Source/Portable zostawiamy tylko folder MemMang oraz folder odpowiadający używanemu kompilatorowi – w tym wypadku jest to GCC. W folderze GCC pozostawiamy tylko folder odpowiadający naszemu mikrokontrolerowi – w typ wypadku jest to STM32G0, który jest oparty na rdzeniu ARM Cortex-M0+, więc zostawiamy folder ARM_M0. W folderze MemMang mamy przykładowe implementacje zarządzania pamięcią – należy zostawić tylko jeden z nich, a pozostałe usunąć. Zalecany wybór to heap_4.c.



Każdy projekt wymaga dołączenia pliku konfiguracyjnego o nazwie FreeRTOSConfig.h. Typową strukturę tego pliku znajdziemy tutaj. Można też podpatrzeć jak ten plik wygląda w przykładach jakie są dołączone w katalogu Demo. Ja właśnie z tego katalogu wybrałem sobie obraz pliku konfiguracyjnego dla STM32 a dokładnie z katalogu CORTEX_M0_STM32F0518_IAR i go trochę zmodyfikowałem. Plik konfiguracyjny musi być umieszczony w głównym katalogu aplikacji a nie w katalogu FreeRTOS !. Ja go umieściłem jak poniżej :


W pliku konfiguracyjnym m.in ustawiłem wartość zegara core dla mojego MCU (STM32G071) na 16 MHz i wyzerowałem wszystko co jest związane z Hook-ami.

Warto jeszcze się upewnić czy wybraliśmy dla naszego projektu  odpowiedni kompilator czyli GCC zgodnie z wybranym trybem pracy FreeRTOS-a.


Aby nasz pusty projekt z dołączonym FreeRTOS poprawnie się kompilował musimy podać ścieżki . Wybieramy na nazwie naszego projektu Options  >  Code  > Preprocessor > User Include Directories. Wyskoczy okienko w którym wpisujemy dokładnie to co ja wpisałem poniżej (ta mała kropeczka w pierwszym wierszu musi być) :
 


Zatwierdzamy i kompilujemy projekt. Jeśli wszystko zrobiliśmy poprawnie to efektem będzie poprawna kompilacja bez żadnych błędów.


Teraz czas przysposobić plik main.c do współpracy z FreeRTOS-em :


FreeRTOS zajął ok 8.5 kB Flash i 8.7 kB RAM. Stos na poziomie 2kB, kompilacja bez optymalizacji -O0.


Nazwy zmiennych w FreeRTOS

Nazwy zmiennych są poprzedzane pierwszą literą typu zmiennej, jak np. c dla char (np. cName), s dla short lub l dla long. Nazwy zmiennych wskaźnikowych dodatkowo poprzedzane są znakiem p. Jest jeszcze charakterystyczny prefiks x, który jest wykorzystywany do specjalnych typów zdefiniowanych w systemie.

Nazwy funkcji w FreeRTOS

Każda funkcja poprzedzona jest przedrostkiem pochodzącym od typu zwracanej wartości oraz pliku w jakim została zdefiniowana. Dla przykładu vTaskStartScheduler(): v pochodzi od void, a Task, ponieważ jest zdefiniowana w pliku task.c. Wykorzystywany jest także specjalny prefiks prv, który przeznaczony jest dla funkcji statycznych (prywatnych): static void prvSetupHardware().

 
Na koniec sprawdzam czy FreeRTOS zadziała po portowaniu. Piszę w tym celu prosty program :



Dioda LED miga co 500 ms. Wszystko działa cacy. Miejmy na uwadze, że delay RTOS-owo nie wstrzymuje działania programu tak jak zwykły delay.

W STM32 Cube MX , FreeRTOS jest standardowo portowany do CMISIS RTOS v1 lub v2. Czyli Cube zmusza nas do nauki  kolejnej biblioteki zamiast natywnie rozmawiać w standardzie FreeRTOS-a. Jak dla mnie to kolejne ograniczenie wolności i chyba nie jest to kompatybilne z naszą Konstytucją :) . Zatem IDE SEGGERA + FreeRTOS rulez..!!.  Warto zauważyć jeszcze , że SEGGER ma jedne z najlepszych narzędzi do debugowania RTOS-ów. I to już chyba tyle w temacie. 

Pamiętajmy jednak, że RTOS to narzędzie ,które fajnie i wygodnie rozwiązuje problem blokowania kodu ale niesie ze sobą inne nowe problemy na których można się wyłożyć. Każdy kij ma dwa końce a moneta dwie strony :).


Pozdrawiam

PICmajster
picmajster.blog@gmail.com

Brak komentarzy:

Prześlij komentarz