; /* | |
* ; * 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! | |
* ; */ | |
EXTERN pxCurrentTCB | |
EXTERN ulCriticalNesting | |
; | |
Context save and restore macro definitions | |
; | |
portSAVE_CONTEXT MACRO | |
; | |
Push R0 as we are going to use the register. | |
STMDB SP !, { R0 } | |
; | |
Set R0 to point to the task stack pointer. | |
STMDB SP, { SP } ^ | |
NOP | |
SUB SP, SP, # 4 | |
LDMIA SP !, { R0 } | |
; | |
Push the return address onto the stack. | |
STMDB R0 !, { LR } | |
; | |
Now we have saved LR we can use it instead of R0. | |
MOV LR, R0 | |
; | |
Pop R0 so we can save it onto the system mode stack. | |
LDMIA SP !, { R0 } | |
; | |
Push all the system mode registers onto the task stack. | |
STMDB LR, { R0 - LR } ^ | |
NOP | |
SUB LR, LR, # 60 | |
; | |
Push the SPSR onto the task stack. | |
MRS R0, SPSR | |
STMDB LR !, { R0 } | |
LDR R0, = ulCriticalNesting | |
LDR R0, [ R0 ] | |
STMDB LR !, { R0 } | |
; | |
Store the new top of stack for the task. | |
LDR R1, = pxCurrentTCB | |
LDR R0, [ R1 ] | |
STR LR, [ R0 ] | |
ENDM | |
portRESTORE_CONTEXT MACRO | |
; | |
Set the LR to the task stack. | |
LDR R1, = pxCurrentTCB | |
LDR R0, [ R1 ] | |
LDR LR, [ R0 ] | |
; | |
The critical nesting depth is the first item on the stack. | |
; | |
Load it into the ulCriticalNesting variable. | |
LDR R0, = ulCriticalNesting | |
LDMFD LR !, { R1 } | |
STR R1, [ R0 ] | |
; | |
Get the SPSR from the stack. | |
LDMFD LR !, { R0 } | |
MSR SPSR_cxsf, R0 | |
; | |
Restore all system mode registers for the task. | |
LDMFD LR, { R0 - R14 } ^ | |
NOP | |
; | |
Restore the return address. | |
LDR LR, [ LR, # + 60 ] | |
; | |
And return -correcting the offset in the LR to obtain the | |
; | |
correct address. | |
SUBS PC, LR, # 4 | |
ENDM |