ESP32 STEP 3. freeRTOS
Wprowadzenie
FreeRTOS to systemem operacyjnym czasu rzeczywistego (ang. real time operating system) dla mikrokontrolerów takich jak ESP32.
Istotną cechą FreeRTOS jest wielozadaniowość , tzn. możliwość wykonywania wielu zadań w tym samym czasie. Polega to na przydzielaniu zadań do rdzeni procesora i przełączanie się pomiędzy kolejnymi zadaniami tak szybko, że mamy wrażenie jakby zadania wykonywały się równocześnie.
W środowisku espressif IDF freeRTOS jest standardem, warto się z nim zapoznać przed rozpoczęciem skomplikowanego projektu w którym wielozadaniowość osiągana dzięki freeRTOS jest bardzo cenna.
Żeby wyjaśnić wielozadaniowość pokaże przykład kodu Arduino:
void loop() {
printf("In Super Loop...\n");
delay(1000); // czekamy sekunę
printf("In Super Loop...\n");
delay(1000); // czekamy sekunę
printf("In Super Loop...\n");
delay(1000); // czekamy sekunę
}
taki kod jak powyżej będzie wykonywał się w pętli 3 sekundy. podczas delay
urządzenie będzie całkowicie niedostępne. Taki przykładowydelay
to oczwiście może być kod którego wykonanie trwa, np. połączenie wifi, mqtt czy czytanie wartości czujnika z GPIO.
A teraz podobny kod w IDF kożystający z wielozadaniowości freeRTOS:
void task1(void *arg){
while (1){
printf("In task1 Loop...\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void task2(void *arg){
while (1){
printf("In task2 Loop...\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void task3(void *arg){
while (1){
printf("In task3 Loop...\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void app_main(void)
{
vTaskDelay(2000 / portTICK_PERIOD_MS);
printf("Hello freeRTOS world!\n");
xTaskCreate( task1, "task1", 4096, NULL, 10, NULL);
xTaskCreate( task2, "task2", 4096, NULL, 10, NULL);
xTaskCreate( task3, "task3", 4096, NULL, 10, NULL);
}
w tym kodzie tworzymy 3 zadania które w trzech niskończonych pętlach wykonują swoje zadania (logują tekst na wyjściu i czekają 1 sekundę). Istotne jest to, że dzięki freeRTOS zadania są wykonywane jednocześnie - podczas gdy w jednej pętli mamy vTaskDelay wykonywany jest kod z kolejnej pętli itd…
Łatwo wyobrazić sobie sytuacje w której jedno zadanie to utrzymanie połączenia wifi, drugie to pobierania danych z czujnika a trzecie to raportowanie po mqtt do systemu typu HA.
Kod
Ten przykładowy kod dostępny jest w reposytorium w katalogu step3-freertos
:
jak zwykle nie trzeba nic instalować tylko wystarczy otworzyć projekt w kontenerze, tak samo jak to zostało opisane w step1 i step2:
Zakończenie
Systemy operacyjne działające na mikrokontrolerach są szeroko stosowane w każdej branży. Urządzenia z których kożystamy na codzień, takie jak: drukarka, zmywarka czy pralka także działa w oparciu o mini system operacyjny. Wraz z rozwojem IoT takich urządzeń przybywa coraz więcej, a FreeRTOS jest jednym wiodących rozwiązań.
Amazon przejeło FreeRTOS w 2017: