Harmonogram zadań FreeRTOS — współbieżne zadania czujnika, BLE, OTA i watchdoga na jednym ESP32-S3
FreeRTOS to de facto standardowy system RTOS dla IoT. ESP-IDF dostarcza FreeRTOS wbudowany fabrycznie; STM32CubeMX generuje integrację z FreeRTOS. Jego opanowanie odróżnia firmware, który przetrwa 3 lata w produkcji, od takiego, który działa tylko w laboratorium.
Architektura zadań
void sensor_task(void *p) {
TickType_t last = xTaskGetTickCount();
while (1) {
sensor_data_t d = {.temp=read_temp(), .hum=read_hum()};
xQueueSend(sensor_q, &d, portMAX_DELAY);
vTaskDelayUntil(&last, pdMS_TO_TICKS(5000));
}
}
void ble_task(void *p) {
sensor_data_t d;
while (1) {
xQueueReceive(sensor_q, &d, portMAX_DELAY);
ble_transmit(&d);
xSemaphoreGive(watchdog_sem);
}
}
Wykrywanie przepełnienia stosu
#define configCHECK_FOR_STACK_OVERFLOW 2
void vApplicationStackOverflowHook(TaskHandle_t t, char *name) {
ESP_LOGE(TAG, "STACK OVERFLOW: %s", name);
esp_restart();
}
uxTaskGetStackHighWaterMark(), aby zmierzyć rzeczywiste szczytowe zużycie stosu na zadanie. Dodaj 20% zapasu. Nigdy nie zgaduj — mierz przy rzeczywistych obciążeniach, uwzględniając najgorszy przypadek wywołań zwrotnych BLE.Wzorce komunikacji między zadaniami
Poza podstawowymi kolejkami FreeRTOS udostępnia grupy zdarzeń (event groups), bufory strumieniowe (stream buffers) i bufory komunikatów (message buffers). Grupy zdarzeń idealnie nadają się do koordynowania wielu zadań wokół zestawu warunków — na przykład zadania OTA, które czeka, aż zostaną ustawione zarówno flaga połączenia WiFi, jak i flaga synchronizacji czasu, zanim pobierze aktualizację firmware'u. Jedno wywołanie xEventGroupWaitBits() zastępuje złożoną pętlę odpytywania.
Bufory strumieniowe są zoptymalizowane pod dane bajtowe pochodzące z przerwań — procedura obsługi przerwania (ISR) odbioru UART zapisuje do bufora strumieniowego, z którego czyta zadanie parsujące. ISR nigdy się nie blokuje; parser blokuje się do momentu, aż dane będą dostępne. Wzorzec ten efektywnie obsługuje pakiety danych z czujników o zmiennej długości bez dynamicznej alokacji pamięci.
Integracja watchdoga
Sprzętowy watchdog, który nie jest właściwie zintegrowany z FreeRTOS, jest gorszy niż bezużyteczny — będzie się wyzwalał losowo, gdy prawidłowo działające zadanie zajmie więcej czasu, niż oczekiwano, powodując zbędne restarty urządzenia. Watchdog zadań (TWDT) w ESP-IDF monitoruje poszczególne zadania, a nie cały system. Skonfiguruj go tak, by monitorował zadania o najwyższym priorytecie, i zasilaj go w głównej pętli każdego zadania.
esp_task_wdt_init(30, true); // 30s timeout, panic on trigger esp_task_wdt_add(sensor_task_h); // monitor sensor task esp_task_wdt_add(ble_task_h); // monitor BLE task// In each task’s main loop: esp_task_wdt_reset(); // feed watchdog
Zarządzanie pamięcią w FreeRTOS
Dynamiczna alokacja pamięci (pvPortMalloc) w FreeRTOS korzysta ze sterty. ESP-IDF udostępnia wiele implementacji sterty — domyślną jest heap_4, z alokacją metodą first-fit i scalaniem wolnych bloków. W firmwarze produkcyjnym całkowicie unikaj dynamicznej alokacji w procedurach obsługi przerwań (ISR) i minimalizuj alokację po inicjalizacji systemu. Fragmentacja przez wiele dni ciągłej pracy może powodować błędy alokacji, które są niemal niemożliwe do odtworzenia podczas testów.
Tam, gdzie liczy się przewidywalność, stosuj alokację statyczną dla kolejek, semaforów i stosów zadań. FreeRTOS obsługuje w pełni statyczną alokację (całkowicie bez sterty) przez configSUPPORT_STATIC_ALLOCATION — przydatną w zastosowaniach o kluczowym znaczeniu dla bezpieczeństwa, gdzie wyczerpanie pamięci musi być dowodliwie niemożliwe.
Przenoszenie między ESP32 a STM32
Interfejsy API FreeRTOS są identyczne na ESP32 (przez ESP-IDF) i STM32 (przez STM32CubeMX). Tworzenie zadań, operacje na kolejkach i prymitywy synchronizacji mają te same sygnatury funkcji. Jeśli zaprojektujesz warstwę aplikacji w oparciu o API FreeRTOS i ukryjesz dostęp do sprzętu za warstwą HAL, przeniesienie między rodzinami MCU zajmuje raczej dni niż tygodnie. W FSS utrzymujemy współdzielone komponenty firmware'u — klient MQTT, menedżer OTA, sterowniki czujników — które działają bez zmian na obu platformach.
Tworzysz produkt IoT?
FSS to zespół inżynierski IoT full-stack — sprzęt, firmware, chmura i aplikacje mobilne w jednym miejscu.