Приклад критичної зони ESP32 з використанням FreeRTOS / PlatformIO

Щоб увійти в критичну зону на ESP32 з використанням FreeRTOS, вам потрібно зробити наступне:

Глобально оголосіть spinlock:

esp32_spinlock_declare.cpp
portMUX_TYPE mySpinlock;

У setup(), ініціалізуйте spinlock:

esp32_spinlock_init.cpp
spinlock_initialize(&mySpinlock);

Тепер, де б ви не хотіли увійти в критичну зону, виконайте:

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

При використанні в обробнику переривань, використовуйте це натомість:

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

FreeRTOS гарантує, що два потоки, які використовують mySpinlock, не виконуватимуться одночасно.


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