From b4cd5454aff60c2cd0cc5605a6cbb2214111ab2c Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 18 Sep 2019 16:12:28 +0200 Subject: [PATCH 1/2] Abortable Arduino delay() --- cores/esp32/esp32-hal-misc.c | 8 +++++++- cores/esp32/esp32-hal.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index ae06edc3378..647aee0bc2b 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -54,6 +54,12 @@ void yield() extern TaskHandle_t loopTaskHandle; extern bool loopTaskWDTEnabled; +void IRAM_ATTR abortLoopDelay(){ + if(loopTaskHandle != NULL){ + vTaskNotifyGiveFromISR(loopTaskHandle, NULL); + } +} + void enableLoopWDT(){ if(loopTaskHandle != NULL){ if(esp_task_wdt_add(loopTaskHandle) != ESP_OK){ @@ -141,7 +147,7 @@ unsigned long IRAM_ATTR millis() void delay(uint32_t ms) { - vTaskDelay(ms / portTICK_PERIOD_MS); + ulTaskNotifyTake(pdTRUE, ms / portTICK_PERIOD_MS); } void IRAM_ATTR delayMicroseconds(uint32_t us) diff --git a/cores/esp32/esp32-hal.h b/cores/esp32/esp32-hal.h index 4b5fb2c2ebb..167c219f022 100644 --- a/cores/esp32/esp32-hal.h +++ b/cores/esp32/esp32-hal.h @@ -74,6 +74,7 @@ void yield(void); float temperatureRead(); #if CONFIG_AUTOSTART_ARDUINO +void abortLoopDelay(); //enable/disable WDT for Arduino's setup and loop functions void enableLoopWDT(); void disableLoopWDT(); From 0cafd7cc841e6fade0e00b46c482c703c224e592 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 18 Sep 2019 16:44:28 +0200 Subject: [PATCH 2/2] Selective API between ISR and user space. --- cores/esp32/esp32-hal-misc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 647aee0bc2b..c96e644afed 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -56,7 +56,11 @@ extern bool loopTaskWDTEnabled; void IRAM_ATTR abortLoopDelay(){ if(loopTaskHandle != NULL){ - vTaskNotifyGiveFromISR(loopTaskHandle, NULL); + if (xPortInIsrContext()){ + vTaskNotifyGiveFromISR(loopTaskHandle, NULL); + } else { + xTaskNotifyGive(loopTaskHandle); + } } }