/* | |
* FreeRTOS Kernel V10.3.1 | |
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
* | |
* Permission is hereby granted, free of charge, to any person obtaining a copy of | |
* this software and associated documentation files (the "Software"), to deal in | |
* the Software without restriction, including without limitation the rights to | |
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
* the Software, and to permit persons to whom the Software is furnished to do so, | |
* subject to the following conditions: | |
* | |
* The above copyright notice and this permission notice shall be included in all | |
* copies or substantial portions of the Software. | |
* | |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
* | |
* http://www.FreeRTOS.org | |
* http://aws.amazon.com/freertos | |
* | |
* 1 tab == 4 spaces! | |
*/ | |
#include "PriorityDefinitions.h" | |
PUBLIC _prvStartFirstTask | |
PUBLIC ___interrupt_27 | |
EXTERN _pxCurrentTCB | |
EXTERN _vTaskSwitchContext | |
RSEG CODE:CODE(4) | |
_prvStartFirstTask: | |
/* When starting the scheduler there is nothing that needs moving to the | |
interrupt stack because the function is not called from an interrupt. | |
Just ensure the current stack is the user stack. */ | |
SETPSW U | |
/* Obtain the location of the stack associated with which ever task | |
pxCurrentTCB is currently pointing to. */ | |
MOV.L #_pxCurrentTCB, R15 | |
MOV.L [R15], R15 | |
MOV.L [R15], R0 | |
/* Restore the registers from the stack of the task pointed to by | |
pxCurrentTCB. */ | |
POP R15 | |
/* Accumulator low 32 bits. */ | |
MVTACLO R15 | |
POP R15 | |
/* Accumulator high 32 bits. */ | |
MVTACHI R15 | |
POP R15 | |
/* Floating point status word. */ | |
MVTC R15, FPSW | |
/* R1 to R15 - R0 is not included as it is the SP. */ | |
POPM R1-R15 | |
/* This pops the remaining registers. */ | |
RTE | |
NOP | |
NOP | |
/*-----------------------------------------------------------*/ | |
/* The software interrupt - overwrite the default 'weak' definition. */ | |
___interrupt_27: | |
/* Re-enable interrupts. */ | |
SETPSW I | |
/* Move the data that was automatically pushed onto the interrupt stack when | |
the interrupt occurred from the interrupt stack to the user stack. | |
R15 is saved before it is clobbered. */ | |
PUSH.L R15 | |
/* Read the user stack pointer. */ | |
MVFC USP, R15 | |
/* Move the address down to the data being moved. */ | |
SUB #12, R15 | |
MVTC R15, USP | |
/* Copy the data across, R15, then PC, then PSW. */ | |
MOV.L [ R0 ], [ R15 ] | |
MOV.L 4[ R0 ], 4[ R15 ] | |
MOV.L 8[ R0 ], 8[ R15 ] | |
/* Move the interrupt stack pointer to its new correct position. */ | |
ADD #12, R0 | |
/* All the rest of the registers are saved directly to the user stack. */ | |
SETPSW U | |
/* Save the rest of the general registers (R15 has been saved already). */ | |
PUSHM R1-R14 | |
/* Save the FPSW and accumulator. */ | |
MVFC FPSW, R15 | |
PUSH.L R15 | |
MVFACHI R15 | |
PUSH.L R15 | |
/* Middle word. */ | |
MVFACMI R15 | |
/* Shifted left as it is restored to the low order word. */ | |
SHLL #16, R15 | |
PUSH.L R15 | |
/* Save the stack pointer to the TCB. */ | |
MOV.L #_pxCurrentTCB, R15 | |
MOV.L [ R15 ], R15 | |
MOV.L R0, [ R15 ] | |
/* Ensure the interrupt mask is set to the syscall priority while the kernel | |
structures are being accessed. */ | |
MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY | |
/* Select the next task to run. */ | |
BSR.A _vTaskSwitchContext | |
/* Reset the interrupt mask as no more data structure access is required. */ | |
MVTIPL #configKERNEL_INTERRUPT_PRIORITY | |
/* Load the stack pointer of the task that is now selected as the Running | |
state task from its TCB. */ | |
MOV.L #_pxCurrentTCB,R15 | |
MOV.L [ R15 ], R15 | |
MOV.L [ R15 ], R0 | |
/* Restore the context of the new task. The PSW (Program Status Word) and | |
PC will be popped by the RTE instruction. */ | |
POP R15 | |
MVTACLO R15 | |
POP R15 | |
MVTACHI R15 | |
POP R15 | |
MVTC R15, FPSW | |
POPM R1-R15 | |
RTE | |
NOP | |
NOP | |
/*-----------------------------------------------------------*/ | |
END | |