1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-06 05:21:22 +03:00
esp8266/tests/host/common/Arduino.cpp
Dirk O. Kaar c312a2eaf1
Implement esp_yield() as a replacement for delay(0)
esp_yield() now also calls esp_schedule(), original esp_yield() function renamed to esp_suspend().

Don't use delay(0) in the Core internals, libraries and examples. Use yield() when the code is
supposed to be called from CONT, use esp_yield() when the code can be called from either CONT or SYS.
Clean-up esp_yield() and esp_schedule() declarations across the code and use coredecls.h instead.

Implement helper functions for libraries that were previously using esp_yield(), esp_schedule() and
esp_delay() directly to wait for certain SYS context tasks to complete. Correctly use esp_delay()
for timeouts, make sure scheduled functions have a chance to run (e.g. LwIP_Ethernet uses recurrent)

Related issues:
- #6107 - discussion about the esp_yield() and esp_delay() usage in ClientContext
- #6212 - discussion about replacing delay() with a blocking loop
- #6680 - pull request introducing LwIP-based Ethernet
- #7146 - discussion that originated UART code changes
- #7969 - proposal to remove delay(0) from the example code
- #8291 - discussion related to the run_scheduled_recurrent_functions() usage in LwIP Ethernet
- #8317 - yieldUntil() implementation, similar to the esp_delay() overload with a timeout and a 0 interval
2021-10-17 00:19:01 +03:00

105 lines
2.2 KiB
C++

/*
Arduino.cpp - Mocks for common Arduino APIs
Copyright © 2016 Ivan Grokhotkov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
*/
#include <sys/time.h>
#include "Arduino.h"
#include <functional>
#include <unistd.h>
static struct timeval gtod0 = { 0, 0 };
extern "C" unsigned long millis()
{
timeval time;
gettimeofday(&time, NULL);
if (gtod0.tv_sec == 0)
memcpy(&gtod0, &time, sizeof gtod0);
return ((time.tv_sec - gtod0.tv_sec) * 1000) + ((time.tv_usec - gtod0.tv_usec) / 1000);
}
extern "C" unsigned long micros()
{
timeval time;
gettimeofday(&time, NULL);
if (gtod0.tv_sec == 0)
memcpy(&gtod0, &time, sizeof gtod0);
return ((time.tv_sec - gtod0.tv_sec) * 1000000) + time.tv_usec - gtod0.tv_usec;
}
extern "C" void yield()
{
}
extern "C" bool can_yield()
{
return true;
}
extern "C" void optimistic_yield (uint32_t interval_us)
{
(void)interval_us;
}
extern "C" void esp_suspend()
{
}
extern "C" void esp_schedule()
{
}
extern "C" void esp_yield()
{
}
extern "C" void esp_delay (unsigned long ms)
{
usleep(ms * 1000);
}
bool esp_try_delay(const uint32_t start_ms, const uint32_t timeout_ms, const uint32_t intvl_ms) {
uint32_t expired = millis() - start_ms;
if (expired >= timeout_ms) {
return true;
}
esp_delay(std::min((timeout_ms - expired), intvl_ms));
return false;
}
extern "C" void __panic_func(const char* file, int line, const char* func) {
(void)file;
(void)line;
(void)func;
abort();
}
extern "C" void delay(unsigned long ms)
{
esp_delay(ms);
}
extern "C" void delayMicroseconds(unsigned int us)
{
usleep(us);
}
#include "cont.h"
cont_t* g_pcont = NULL;
extern "C" void cont_suspend(cont_t*)
{
}