File tree Expand file tree Collapse file tree 1 file changed +20
-2
lines changed
cores/nRF5/freertos/portable/CMSIS/nrf52 Expand file tree Collapse file tree 1 file changed +20
-2
lines changed Original file line number Diff line number Diff line change @@ -227,9 +227,27 @@ void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )
227
227
diff = xExpectedIdleTime ;
228
228
}
229
229
230
- if (diff > 0 )
230
+ // nRF-provided fix for delay() wakeup 1ms spin-loop power waste
231
+ // See https://devzone.nordicsemi.com/f/nordic-q-a/63828/vtaskdelay-on-nrf52-freertos-port-wastes-cpu-power
232
+ BaseType_t switch_req = pdFALSE ;
233
+
234
+ if (diff > 1 )
235
+ {
236
+ vTaskStepTick (diff - 1 );
237
+ switch_req = xTaskIncrementTick ();
238
+ }
239
+ else if (diff == 1 )
240
+ {
241
+ switch_req = xTaskIncrementTick ();
242
+ }
243
+
244
+ /* Increment the RTOS tick as usual which checks if there is a need for rescheduling */
245
+ if ( switch_req != pdFALSE )
231
246
{
232
- vTaskStepTick (diff );
247
+ /* A context switch is required. Context switching is performed in
248
+ the PendSV interrupt. Pend the PendSV interrupt. */
249
+ SCB -> ICSR = SCB_ICSR_PENDSVSET_Msk ;
250
+ __SEV ();
233
251
}
234
252
}
235
253
}
You can’t perform that action at this time.
0 commit comments