1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

Merge pull request #6804 from dok-net/optimistic_yield_recurrency

Fix optimistic_yield to not yield on each call after x µs
This commit is contained in:
Earle F. Philhower, III 2020-02-20 14:11:45 -08:00 committed by GitHub
commit 0a58172c6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 7 deletions

View File

@ -204,6 +204,7 @@ void setup(void);
void loop(void);
void yield(void);
void optimistic_yield(uint32_t interval_us);
#define _PORT_GPIO16 1

View File

@ -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)