diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index acf5fbdef..a4e00ec73 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -204,6 +204,7 @@ void setup(void); void loop(void); void yield(void); + void optimistic_yield(uint32_t interval_us); #define _PORT_GPIO16 1 diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index 850d9b95a..a95c4b2c1 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -37,7 +37,6 @@ extern "C" { #define LOOP_TASK_PRIORITY 1 #define LOOP_QUEUE_SIZE 1 -#define OPTIMISTIC_YIELD_TIME_US 16000 extern "C" void call_user_start(); extern void loop(); @@ -58,7 +57,7 @@ cont_t* g_pcont __attribute__((section(".noinit"))); static os_event_t s_loop_queue[LOOP_QUEUE_SIZE]; /* Used to implement optimistic_yield */ -static uint32_t s_micros_at_task_start; +static uint32_t s_cycles_at_yield_start; /* For ets_intr_lock_nest / ets_intr_unlock_nest * Max nesting seen by SDK so far is 2. @@ -97,6 +96,7 @@ extern "C" bool can_yield() { static inline void esp_yield_within_cont() __attribute__((always_inline)); static void esp_yield_within_cont() { cont_yield(g_pcont); + s_cycles_at_yield_start = ESP.getCycleCount(); run_scheduled_recurrent_functions(); } @@ -125,14 +125,19 @@ extern "C" void __yield() { extern "C" void yield(void) __attribute__ ((weak, alias("__yield"))); extern "C" void optimistic_yield(uint32_t interval_us) { - if (can_yield() && - (system_get_time() - s_micros_at_task_start) > interval_us) + const uint32_t intvl_cycles = interval_us * +#if defined(F_CPU) + clockCyclesPerMicrosecond(); +#else + ESP.getCpuFreqMHz(); +#endif + if ((ESP.getCycleCount() - s_cycles_at_yield_start) > intvl_cycles && + can_yield()) { yield(); } } - // Replace ets_intr_(un)lock with nestable versions extern "C" void IRAM_ATTR ets_intr_lock() { if (ets_intr_lock_stack_ptr < ETS_INTR_LOCK_NEST_MAX) @@ -183,7 +188,7 @@ static void loop_wrapper() { static void loop_task(os_event_t *events) { (void) events; - s_micros_at_task_start = system_get_time(); + s_cycles_at_yield_start = ESP.getCycleCount(); cont_run(g_pcont, &loop_wrapper); if (cont_check(g_pcont) != 0) { panic(); @@ -211,7 +216,7 @@ extern void __unhandled_exception(const char *str); static void __unhandled_exception_cpp() { #ifndef __EXCEPTIONS - abort(); + abort(); #else static bool terminating; if (terminating)