]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/STR91x/ISR_Support.h
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Source / portable / IAR / STR91x / ISR_Support.h
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29         EXTERN pxCurrentTCB\r
30         EXTERN ulCriticalNesting\r
31 \r
32 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
33 ; Context save and restore macro definitions\r
34 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
35 \r
36 portSAVE_CONTEXT MACRO\r
37 \r
38         ; Push R0 as we are going to use the register.                                  \r
39         STMDB   SP!, {R0}\r
40 \r
41         ; Set R0 to point to the task stack pointer.                                    \r
42         STMDB   SP, {SP}^\r
43         NOP\r
44         SUB             SP, SP, #4\r
45         LDMIA   SP!, {R0}\r
46 \r
47         ; Push the return address onto the stack.                                               \r
48         STMDB   R0!, {LR}\r
49 \r
50         ; Now we have saved LR we can use it instead of R0.                             \r
51         MOV             LR, R0\r
52 \r
53         ; Pop R0 so we can save it onto the system mode stack.                  \r
54         LDMIA   SP!, {R0}\r
55 \r
56         ; Push all the system mode registers onto the task stack.               \r
57         STMDB   LR, {R0-LR}^\r
58         NOP\r
59         SUB             LR, LR, #60\r
60 \r
61         ; Push the SPSR onto the task stack.                                                    \r
62         MRS             R0, SPSR\r
63         STMDB   LR!, {R0}\r
64 \r
65         LDR             R0, =ulCriticalNesting \r
66         LDR             R0, [R0]\r
67         STMDB   LR!, {R0}\r
68 \r
69         ; Store the new top of stack for the task.                                              \r
70         LDR             R1, =pxCurrentTCB\r
71         LDR             R0, [R1]\r
72         STR             LR, [R0]\r
73 \r
74         ENDM\r
75 \r
76 \r
77 portRESTORE_CONTEXT MACRO\r
78 \r
79         ; Set the LR to the task stack.                                                                         \r
80         LDR             R1, =pxCurrentTCB\r
81         LDR             R0, [R1]\r
82         LDR             LR, [R0]\r
83 \r
84         ; The critical nesting depth is the first item on the stack.    \r
85         ; Load it into the ulCriticalNesting variable.                                  \r
86         LDR             R0, =ulCriticalNesting\r
87         LDMFD   LR!, {R1}\r
88         STR             R1, [R0]\r
89 \r
90         ; Get the SPSR from the stack.                                                                  \r
91         LDMFD   LR!, {R0}\r
92         MSR             SPSR_cxsf, R0\r
93 \r
94         ; Restore all system mode registers for the task.                               \r
95         LDMFD   LR, {R0-R14}^\r
96         NOP\r
97 \r
98         ; Restore the return address.                                                                   \r
99         LDR             LR, [LR, #+60]\r
100 \r
101         ; And return - correcting the offset in the LR to obtain the    \r
102         ; correct address.                                                                                              \r
103         SUBS    PC, LR, #4\r
104 \r
105         ENDM\r
106 \r