RSEG ICODE:CODE CODE32 EXTERN vPortPreemptiveTick EXTERN vTaskSwitchContext PUBLIC vPortYieldProcessor PUBLIC vPortStartFirstTask PUBLIC vPortPreemptiveTickISR #include "ISR_Support.h" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Starting the first task is just a matter of restoring the context that ; was created by pxPortInitialiseStack(). ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vPortStartFirstTask: portRESTORE_CONTEXT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Manual context switch function. This is the SWI hander. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vPortYieldProcessor: ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly ; as if the context was saved during and IRQ ; handler. portSAVE_CONTEXT ; Save the context of the current task... LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. mov lr, pc BX R0 portRESTORE_CONTEXT ; Restore the context of the selected task. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Preemptive context switch function. This will only ever get used if ; portUSE_PREEMPTION is set to 1 in portmacro.h. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vPortPreemptiveTickISR: portSAVE_CONTEXT ; Save the context of the current task. LDR R0, =vPortPreemptiveTick ; Increment the tick count - this may wake a task. MOV lr, pc BX R0 portRESTORE_CONTEXT ; Restore the context of the selected task. END