]> begriffs open source - freertos/blob - portable/IAR/STR75x/ISR_Support.h
Style: uncrusitfy
[freertos] / portable / IAR / STR75x / ISR_Support.h
1 ; /*\r
2    * ; * FreeRTOS Kernel V10.3.1\r
3    * ; * Copyright (C) 2020 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.\r
14    * ; *\r
15    * ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16    * ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17    * ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18    * ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19    * ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20    * ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21    * ; *\r
22    * ; * http://www.FreeRTOS.org\r
23    * ; * http://aws.amazon.com/freertos\r
24    * ; *\r
25    * ; */\r
26 \r
27 EXTERN pxCurrentTCB\r
28 EXTERN           ulCriticalNesting\r
29 \r
30 ;\r
31 Context          save and restore macro definitions\r
32 ;\r
33 \r
34 portSAVE_CONTEXT MACRO\r
35 \r
36 ;\r
37 Push R0 as we are going to use the register.\r
38    STMDB         SP !, { R0 }\r
39 \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 ;\r
48 Push the return address onto the stack.\r
49           STMDB R0 !, { LR }\r
50 \r
51 ;\r
52 \r
53 Now we have saved LR we can use it instead of R0.\r
54    MOV   LR, R0\r
55 \r
56 ;\r
57 Pop R0 so we can save it onto the system mode stack.\r
58    LDMIA SP !, { R0 }\r
59 \r
60 ;\r
61 Push all the system mode registers onto the task stack.\r
62    STMDB LR, { R0 - LR } ^\r
63 NOP\r
64 SUB LR, LR, # 60\r
65 \r
66 ;\r
67 Push the SPSR onto the task stack.\r
68    MRS R0, SPSR\r
69 STMDB LR !, { R0 }\r
70 \r
71 LDR R0, = ulCriticalNesting\r
72           LDR R0, [ R0 ]\r
73 STMDB LR !, { R0 }\r
74 \r
75 ;\r
76 Store the new top of stack for the task.\r
77    LDR R1, = pxCurrentTCB\r
78              LDR R0, [ R1 ]\r
79 STR LR, [ R0 ]\r
80 \r
81 ENDM\r
82 \r
83 \r
84 portRESTORE_CONTEXT MACRO\r
85 \r
86 ;\r
87 Set the LR to the task stack.\r
88    LDR R1, = pxCurrentTCB\r
89              LDR R0, [ R1 ]\r
90 LDR LR, [ R0 ]\r
91 \r
92 ;\r
93 The critical nesting depth is the first item on the stack.\r
94    ;\r
95 Load it into the ulCriticalNesting variable.\r
96    LDR R0, = ulCriticalNesting\r
97              LDMFD LR !, { R1 }\r
98 STR R1, [ R0 ]\r
99 \r
100 ;\r
101 Get the SPSR from the stack.\r
102    LDMFD LR !, { R0 }\r
103 MSR SPSR_cxsf, R0\r
104 \r
105 ;\r
106 Restore all system mode registers for the task.\r
107    LDMFD LR, { R0 - R14 } ^\r
108 NOP\r
109 \r
110 ;\r
111 Restore  the return address.\r
112           LDR LR, [ LR, # + 60 ]\r
113 \r
114 ;\r
115 \r
116 And return -correcting the offset in the LR to obtain the\r
117 ;\r
118 \r
119 correct address.\r
120    SUBS PC, LR, # 4\r
121 \r
122 ENDM\r