Як виправити помилку ESP32 FreeRTOS: too few arguments to function 'void vPortEnterCritical(portMUX_TYPE*)'

Проблема:

На FreeRTOS на ESP32 ви хочете використати критичну зону так:

critical_zone_usage.cpp
portENTER_CRITICAL();
// Ваш критичний код розміщується тут!
portEXIT_CRITICAL();

але під час компіляції проєкту ви бачите повідомлення про помилку на кшталт

build_error.txt
src/main.cpp: In function 'void MyFunc(size_t, int16_t)':
/home/uli/.platformio/packages/framework-arduinoespressif32@src-f2ea83e2545300b10a69ff44ef9dc6cd/tools/sdk/esp32/include/freertos/port/xtensa/include/freertos/portmacro.h:476:75: error: too few arguments to function 'void vPortEnterCritical(portMUX_TYPE*)'
 #define portENTER_CRITICAL(mux)                     vPortEnterCritical(mux)

Рішення

Вам потрібно використовувати portENTER_CRITICAL() та portEXIT_CRITICAL() зі spinlock, тобто

critical_zone_with_spinlock.cpp
portENTER_CRITICAL(&mySpinlock);
// TODO Ваш критичний код розміщується тут!
portEXIT_CRITICAL(&mySpinlock);

Щоб побачити повний приклад того, як ініціалізувати spinlock у FreeRTOS і використовувати його для критичних зон, див. наш попередній пост Приклад критичної зони ESP32 з використанням FreeRTOS / PlatformIO


Дивіться схожі статті за категоріями: Arduino ESP8266/ESP32 FreeRTOS PlatformIO