mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-21 10:26:06 +03:00
never yield within an ISR
This commit is contained in:
parent
d815c36753
commit
0b2fb8d3ee
@ -88,7 +88,8 @@ extern "C" void __yield() {
|
|||||||
extern "C" void yield(void) __attribute__ ((weak, alias("__yield")));
|
extern "C" void yield(void) __attribute__ ((weak, alias("__yield")));
|
||||||
|
|
||||||
extern "C" void optimistic_yield() {
|
extern "C" void optimistic_yield() {
|
||||||
if (system_get_time() - g_micros_at_last_task_yield > OPTIMISTIC_YIELD_TIME_US)
|
if (!ETS_INTR_WITHINISR() &&
|
||||||
|
(system_get_time() - g_micros_at_last_task_yield) > OPTIMISTIC_YIELD_TIME_US)
|
||||||
{
|
{
|
||||||
__yield();
|
__yield();
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,14 @@ typedef void (*int_handler_t)(void*);
|
|||||||
#define ETS_INTR_DISABLE(inum) \
|
#define ETS_INTR_DISABLE(inum) \
|
||||||
ets_isr_mask((1<<inum))
|
ets_isr_mask((1<<inum))
|
||||||
|
|
||||||
|
inline bool ETS_INTR_WITHINISR()
|
||||||
|
{
|
||||||
|
uint32_t ps;
|
||||||
|
__asm__ __volatile__("rsr %0,ps":"=a" (ps));
|
||||||
|
// PS.EXCM and PS.UM bit checks
|
||||||
|
return ((ps & ((1 << 4) | (1 << 5))) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
inline uint32_t ETS_INTR_ENABLED(void)
|
inline uint32_t ETS_INTR_ENABLED(void)
|
||||||
{
|
{
|
||||||
uint32_t enabled;
|
uint32_t enabled;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user