Układy ESP32 posiadają dwa rdzenie. Do tej pory twierdziłem, że niezależne dwa rdzenie w mikrokontrolerze przeznaczonym do zastosowań hobbystycznych to przesada. Okazało się jednak, że czasami taki sprzęt może się przydać. Pisałem ostatnio prosty program obsługujący programowalne diody LED. Okazało się, że biblioteka obsługująca diody programowalne jest napisana w taki sposób, że nie toleruje żadnych opóźnień. Oznacza to tyle, że jednoczesna obsługa np. sieci WiFi oraz komunikacji z diodami LED jest praktycznie niemożliwa. Jeżeli czegoś nie da się rozwiązać programowo to może rozwiązaniem będzie wymiana sprzętowa? Poniżej przedstawię sposób na wykorzystanie obu rdzeni w układach ESP32.

Zaczynamy

Korzystając z Arduino IDE ESP32 pracuje pod kontrolą RTOS, który kontroluje wszystkie układy umożliwiając uruchomienie kodu "Arduino" na pierwszym rdzeniu. Rdzeń zerowy obsługuje niewidoczne dla nas zadania. Możemy zmusić układ to wykonywania konkretnego zadania na konkretnym rdzeniu. Wtedy będziemy mieć możliwość uruchomienia przynajmniej dwóch niezależnych wątków. Potrzebne do tego będą poniższe elementy:

TaskHandle_t Task1;
void setup()    //domyślnie pracuje na rdzeniu 1
{
     xTaskCreatePinnedToCore(Task1code,"Task1",10000,NULL,0,&Task1,0);
}

void loop()     //domyślnie pracuje na rdzeniu 1
{ 
}

void Task1code( void * pvParameters )   // pracuje na rdzeniu 0
{
 // polecenia wykonywane jak w funkcji setup()
  for(;;) 
    {
      // polecenia wykonywane jak w funkcji loop()
    }
}

 Jak widać powyżej utworzenie nowego wątku jest banalnie proste. W pierwszej kolejności tworzymy nowy task (Task1). W funkcji setup przypisujemy do niego wykonywaną funkcję (Task1code) oraz określamy na którym rdzeniu ma się ona wykonywać (ostatni parametr 0 lub 1). Po wykonaniu powyższych czynności wszystkie polecenia wpisane do funkcji Task1code będą wykonywane niezależnie od funkcji loop()/setup(). Jeżeli chcemy, żeby coś wykonało się w nowej funkcji tylko raz na początku, to umieszczamy kod w miejscu przed funkcją for(;;). Wszystko, co umieścimy wewnątrz funkcji for(;;) będzie wykonywało się w analogiczny sposób jak w domyślnej funkcji loop().

Wnioski

Jak widać zmuszenie układów ESP32 do wielozadaniowości jest bardzo proste. Możemy tworzyć nowe wątki i komunikować je pomiędzy sobą. W ten sposób tworzenie oprogramowania na mikrokontrolery wejdzie na wyższy poziom.