From 414ed09763a265cbe692128ac4097cfaffc78d56 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 16 Jul 2019 11:37:30 +0200 Subject: [PATCH 1/8] Make delay() and yield() overridable, and add pluggable loop_end() --- cores/esp32/esp32-hal-misc.c | 8 ++++++-- cores/esp32/main.cpp | 8 ++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index ae06edc3378..02a168b73cd 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -44,11 +44,13 @@ float temperatureRead() return (temprature_sens_read() - 32) / 1.8; } -void yield() +void __yield() { vPortYield(); } +void yield() __attribute__ ((weak, alias("__yield"))); + #if CONFIG_AUTOSTART_ARDUINO extern TaskHandle_t loopTaskHandle; @@ -139,11 +141,13 @@ unsigned long IRAM_ATTR millis() return (unsigned long) (esp_timer_get_time() / 1000ULL); } -void delay(uint32_t ms) +void __delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); } +void delay(uint32_t ms) __attribute__ ((weak, alias("__delay"))); + void IRAM_ATTR delayMicroseconds(uint32_t us) { uint32_t m = micros(); diff --git a/cores/esp32/main.cpp b/cores/esp32/main.cpp index 3a455c8a878..8cabbbb953c 100644 --- a/cores/esp32/main.cpp +++ b/cores/esp32/main.cpp @@ -9,6 +9,13 @@ TaskHandle_t loopTaskHandle = NULL; bool loopTaskWDTEnabled; +extern "C" void __loop_end(void) +{ + /* do nothing by default */ +} + +extern "C" void loop_end(void) __attribute__((weak, alias("__loop_end"))); + void loopTask(void *pvParameters) { setup(); @@ -17,6 +24,7 @@ void loopTask(void *pvParameters) esp_task_wdt_reset(); } loop(); + loop_end(); } } From fb335c3c2a135108560c172e8abd99ffb378ca72 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 24 Jul 2019 13:48:13 +0200 Subject: [PATCH 2/8] Improved loop() extension plugin scheme. --- cores/esp32/main.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cores/esp32/main.cpp b/cores/esp32/main.cpp index 8cabbbb953c..4be466b6aa2 100644 --- a/cores/esp32/main.cpp +++ b/cores/esp32/main.cpp @@ -9,13 +9,11 @@ TaskHandle_t loopTaskHandle = NULL; bool loopTaskWDTEnabled; -extern "C" void __loop_end(void) -{ - /* do nothing by default */ +extern "C" void esp_loop(void) __attribute__((weak)); +extern "C" void esp_loop(void) { + loop(); } -extern "C" void loop_end(void) __attribute__((weak, alias("__loop_end"))); - void loopTask(void *pvParameters) { setup(); @@ -23,8 +21,7 @@ void loopTask(void *pvParameters) if(loopTaskWDTEnabled){ esp_task_wdt_reset(); } - loop(); - loop_end(); + esp_loop(); } } From 63ac77637dc5c6dd8ac9bd1a33e21cf55925a388 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 11 Sep 2019 20:52:04 +0200 Subject: [PATCH 3/8] Reverted change for weak loop() binding. Added Arduino compatible serialEventRun according to review comment (instead). --- cores/esp32/HardwareSerial.h | 2 ++ cores/esp32/main.cpp | 8 ++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index 89eacf85d0e..5adf7eea511 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -97,6 +97,8 @@ class HardwareSerial: public Stream uart_t* _uart; }; +extern void serialEventRun(void) __attribute__((weak)); + #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL) extern HardwareSerial Serial; extern HardwareSerial Serial1; diff --git a/cores/esp32/main.cpp b/cores/esp32/main.cpp index 4be466b6aa2..41f1985b94c 100644 --- a/cores/esp32/main.cpp +++ b/cores/esp32/main.cpp @@ -9,11 +9,6 @@ TaskHandle_t loopTaskHandle = NULL; bool loopTaskWDTEnabled; -extern "C" void esp_loop(void) __attribute__((weak)); -extern "C" void esp_loop(void) { - loop(); -} - void loopTask(void *pvParameters) { setup(); @@ -21,7 +16,8 @@ void loopTask(void *pvParameters) if(loopTaskWDTEnabled){ esp_task_wdt_reset(); } - esp_loop(); + loop(); + if (serialEventRun) serialEventRun(); } } From c04448bed61afc1c17e82f727c31f3562222d4a8 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Thu, 12 Sep 2019 23:43:11 +0200 Subject: [PATCH 4/8] (Temporarliy) revert weak delay binding, until a comprehensive solution is found, discussed and acceptable to maintainer --- cores/esp32/esp32-hal-misc.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 02a168b73cd..be08e4b7313 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -141,13 +141,11 @@ unsigned long IRAM_ATTR millis() return (unsigned long) (esp_timer_get_time() / 1000ULL); } -void __delay(uint32_t ms) +void delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); } -void delay(uint32_t ms) __attribute__ ((weak, alias("__delay"))); - void IRAM_ATTR delayMicroseconds(uint32_t us) { uint32_t m = micros(); From c347d77c73cb53278c5b8d4a1feec17e9470178d Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 16 Sep 2019 11:14:17 +0200 Subject: [PATCH 5/8] Comment --- cores/esp32/HardwareSerial.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/HardwareSerial.h b/cores/esp32/HardwareSerial.h index 5adf7eea511..5f886650816 100644 --- a/cores/esp32/HardwareSerial.h +++ b/cores/esp32/HardwareSerial.h @@ -105,4 +105,4 @@ extern HardwareSerial Serial1; extern HardwareSerial Serial2; #endif -#endif +#endif // HardwareSerial_h From 92c501089ed091f19900ed8045ed36a6f0541d4e Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Thu, 19 Sep 2019 15:46:21 +0200 Subject: [PATCH 6/8] yield() on end of delay() for minimum Arduino compatibility. --- cores/esp32/esp32-hal-misc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index be08e4b7313..704fc6b8e97 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -144,6 +144,7 @@ unsigned long IRAM_ATTR millis() void delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); + yield(); } void IRAM_ATTR delayMicroseconds(uint32_t us) From dfb67ee1c5ebe2207e41449d8be35f193bf5c1f5 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Thu, 19 Sep 2019 16:19:08 +0200 Subject: [PATCH 7/8] yield() on end of delay() only if yield() is overridden. --- cores/esp32/esp32-hal-misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 704fc6b8e97..19d51bd0b13 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -144,7 +144,7 @@ unsigned long IRAM_ATTR millis() void delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); - yield(); + if (yield != __yield) yield(); } void IRAM_ATTR delayMicroseconds(uint32_t us) From 37dda7e5d76f0738285edfba3d7713e52e00f8bd Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 2 Oct 2019 15:01:52 +0200 Subject: [PATCH 8/8] Arduino delay() as pure FreeRTOS vTaskDelay(), no implicit yield(). --- cores/esp32/esp32-hal-misc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/cores/esp32/esp32-hal-misc.c b/cores/esp32/esp32-hal-misc.c index 19d51bd0b13..be08e4b7313 100644 --- a/cores/esp32/esp32-hal-misc.c +++ b/cores/esp32/esp32-hal-misc.c @@ -144,7 +144,6 @@ unsigned long IRAM_ATTR millis() void delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); - if (yield != __yield) yield(); } void IRAM_ATTR delayMicroseconds(uint32_t us)