; Save the context of the current task and select a new task to run.
portSAVE_CONTEXT
LDR R0, =vTaskSwitchContext
BLX R0
vPortRestoreTaskContext
portRESTORE_CONTEXT
However, nowhere in the above code, interrupts are disabled. Doesn’t it cause any problem if any other interrupt comes and moves a task into the ready queue or schedules a new task in the mean time?
Why FreeRTOS is not masking interrupts while doing a context switch in SWI_Handler?
In the file FreeRTOS_Demo/Source/FreeRTOS-Source/Portable/RVDS/ARM-CA9/portmacro.h, we have the following definition.
#define portYIELD() __asm( “SWI 0” );
Now, the corresponding SWI handler in portASM.s is
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SVC handler is used to start the scheduler and yield a task.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FreeRTOSSWIHandler
; Check whether an iterrupt can occur at this point.
PRESERVE8
Why FreeRTOS is not masking interrupts while doing a context switch in SWI_Handler?
All IRQs are disabled by the hardware, which is why you can’t find software doing it. The IRQ handler reenables interrupts so interrupts can nest but the SVC handler doesn’t.