Skip to content

Commit

Permalink
freertos: ensure interrupts are disabled before enabling tick timer
Browse files Browse the repository at this point in the history
xPortStartScheduler calls vPortSetupTimer -> _frxt_tick_timer_init,
which enables tick timer interrupt and sets up the first timeout.
From that point on, the interrupt can fire. If the interrupt happens
while _frxt_dispatch is running, the scheduler will enter an infinite
loop. This is because _frxt_dispatch isn't supposed to be preemptable,
and the tick interrupt will overwrite some of the registers used by
_frxt_dispatch.
Note that this situation doesn't practically occur on the real
hardware, where the execution of vPortSetupTimer and _frxt_dispatch
happens quickly enough. However it can be reproduced on an emulator
if the tick period is set to 1ms.

Add an explicit call to portDISABLE_INTERRUPTS in xPortStartScheduler
to guarantee that _frxt_dispatch doesn't run with interrupts enabled.
This is similar to the esprv_intc_int_set_threshold(1); call in
RISC-V version of port.c.
  • Loading branch information
igrr committed Dec 20, 2021
1 parent 2a8ef21 commit 5d32e80
Showing 1 changed file with 1 addition and 0 deletions.
1 change: 1 addition & 0 deletions components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ extern void _xt_coproc_init(void);

BaseType_t xPortStartScheduler( void )
{
portDISABLE_INTERRUPTS();
// Interrupts are disabled at this point and stack contains PS with enabled interrupts when task context is restored

#if XCHAL_CP_NUM > 0
Expand Down

0 comments on commit 5d32e80

Please sign in to comment.