@@ -119,15 +119,15 @@ bool schedule_recurrent_function_us(const std::function<bool(void)>& fn,
119119 item->mFunc = fn;
120120 item->alarm = alarm;
121121
122+ esp8266::InterruptLock lockAllInterruptsInThisScope;
123+
122124// prevent new item overwriting an already expired rTarget.
123- const int32_t rRemaining = rTarget -micros ();
124- if (!rFirst || (rRemaining >0 &&static_cast <uint32_t >(rRemaining ) > item->callNow .remaining ()))
125+ const int32_t remaining = rTarget -micros ();
126+ if (!rFirst || (remaining >0 &&static_cast <uint32_t >(remaining ) > item->callNow .remaining ()))
125127 {
126128 rTarget =micros () + item->callNow .remaining ();
127129 }
128130
129- esp8266::InterruptLock lockAllInterruptsInThisScope;
130-
131131if (rLast)
132132 {
133133 rLast->mNext = item;
@@ -145,8 +145,8 @@ uint32_t get_scheduled_recurrent_delay_us()
145145{
146146if (!rFirst)return ~static_cast <uint32_t >(0 );
147147// handle already expired rTarget.
148- const int32_t rRemaining = rTarget -micros ();
149- return (rRemaining >0 ) ?static_cast <uint32_t >(rRemaining ) :0 ;
148+ const int32_t remaining = rTarget -micros ();
149+ return (remaining >0 ) ?static_cast <uint32_t >(remaining ) :0 ;
150150}
151151
152152void run_scheduled_functions ()
@@ -209,12 +209,18 @@ void run_scheduled_recurrent_functions()
209209 fence =true ;
210210 }
211211
212- rTarget = micros () + current-> callNow . remaining () ;
212+ decltype (rLast) stop ;
213213recurrent_fn_t * prev =nullptr ;
214- // prevent scheduling of new functions during this run
215- auto stop = rLast;
216-
217214bool done;
215+
216+ {
217+ esp8266::InterruptLock lockAllInterruptsInThisScope;
218+
219+ // prevent scheduling of new functions during this run
220+ stop = rLast;
221+ rTarget =micros () + (~static_cast <decltype (micros ())>(0 ) >>1 );
222+ }
223+
218224do
219225 {
220226 done = current == stop;
@@ -246,14 +252,16 @@ void run_scheduled_recurrent_functions()
246252 }
247253else
248254 {
249- prev = current ;
250- current = current-> mNext ;
255+ esp8266::InterruptLock lockAllInterruptsInThisScope ;
256+
251257// prevent current item overwriting an already expired rTarget.
252- const int32_t rRemaining = rTarget -micros ();
253- if (rRemaining >0 &&static_cast <uint32_t >(rRemaining ) > current->callNow .remaining ())
258+ const int32_t remaining = rTarget -micros ();
259+ if (remaining >0 &&static_cast <uint32_t >(remaining ) > current->callNow .remaining ())
254260 {
255261 rTarget =micros () + current->callNow .remaining ();
256262 }
263+ prev = current;
264+ current = current->mNext ;
257265 }
258266
259267if (yieldNow)