diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index a4e00ec736..acf5fbdef1 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -204,7 +204,6 @@ 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 a95c4b2c11..850d9b95a8 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -37,6 +37,7 @@ 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(); @@ -57,7 +58,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_cycles_at_yield_start; +static uint32_t s_micros_at_task_start; /* For ets_intr_lock_nest / ets_intr_unlock_nest * Max nesting seen by SDK so far is 2. @@ -96,7 +97,6 @@ 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,19 +125,14 @@ extern "C" void __yield() { extern "C" void yield(void) __attribute__ ((weak, alias("__yield"))); extern "C" void optimistic_yield(uint32_t 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()) + if (can_yield() && + (system_get_time() - s_micros_at_task_start) > interval_us) { 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) @@ -188,7 +183,7 @@ static void loop_wrapper() { static void loop_task(os_event_t *events) { (void) events; - s_cycles_at_yield_start = ESP.getCycleCount(); + s_micros_at_task_start = system_get_time(); cont_run(g_pcont, &loop_wrapper); if (cont_check(g_pcont) != 0) { panic(); @@ -216,7 +211,7 @@ extern void __unhandled_exception(const char *str); static void __unhandled_exception_cpp() { #ifndef __EXCEPTIONS - abort(); + abort(); #else static bool terminating; if (terminating)