]> git.gir.st - tmk_keyboard.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/rtos/rtx/TARGET_CORTEX_M/TARGET_M3/TOOLCHAIN_IAR/HAL_CM3.s
remove experimental return, cleanup slash_question key
[tmk_keyboard.git] / tmk_core / tool / mbed / mbed-sdk / libraries / rtos / rtx / TARGET_CORTEX_M / TARGET_M3 / TOOLCHAIN_IAR / HAL_CM3.s
1 /*----------------------------------------------------------------------------
2 * RL-ARM - RTX
3 *----------------------------------------------------------------------------
4 * Name: HAL_CM3.S
5 * Purpose: Hardware Abstraction Layer for Cortex-M3
6 * Rev.: V4.70
7 *----------------------------------------------------------------------------
8 *
9 * Copyright (c) 1999-2009 KEIL, 2009-2013 ARM Germany GmbH
10 * All rights reserved.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions are met:
13 * - Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * - Neither the name of ARM nor the names of its contributors may be used
19 * to endorse or promote products derived from this software without
20 * specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *---------------------------------------------------------------------------*/
34
35 NAME HAL_CM3.S
36
37 #define TCB_TSTACK 40
38
39 EXTERN os_flags
40 EXTERN os_tsk
41 EXTERN rt_alloc_box
42 EXTERN rt_free_box
43 EXTERN rt_stk_check
44 EXTERN rt_pop_req
45 EXTERN rt_systick
46 EXTERN os_tick_irqack
47 EXTERN SVC_Table
48 EXTERN SVC_Count
49
50 /*----------------------------------------------------------------------------
51 * Functions
52 *---------------------------------------------------------------------------*/
53
54 SECTION .text:CODE:NOROOT(2)
55 THUMB
56
57 /*--------------------------- rt_set_PSP ------------------------------------*/
58
59 ; void rt_set_PSP (U32 stack);
60
61 PUBLIC rt_set_PSP
62 rt_set_PSP:
63
64 MSR PSP,R0
65 BX LR
66
67
68 /*--------------------------- rt_get_PSP ------------------------------------*/
69
70 ; U32 rt_get_PSP (void);
71
72 PUBLIC rt_get_PSP
73 rt_get_PSP:
74
75 MRS R0,PSP
76 BX LR
77
78
79 /*--------------------------- os_set_env ------------------------------------*/
80
81 ; void os_set_env (void);
82 /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
83
84 PUBLIC os_set_env
85 os_set_env:
86
87 MOV R0,SP /* PSP = MSP */
88 MSR PSP,R0
89 LDR R0,=os_flags
90 LDRB R0,[R0]
91 LSLS R0,#31
92 ITE NE
93 MOVNE R0,#0x02 /* Privileged Thread mode, use PSP */
94 MOVEQ R0,#0x03 /* Unprivileged Thread mode, use PSP */
95 MSR CONTROL,R0
96 BX LR
97
98
99 /*--------------------------- _alloc_box ------------------------------------*/
100
101 ; void *_alloc_box (void *box_mem);
102 /* Function wrapper for Unprivileged/Privileged mode. */
103
104 PUBLIC _alloc_box
105 _alloc_box:
106
107 LDR R12,=rt_alloc_box
108 MRS R3,IPSR
109 LSLS R3,#24
110 IT NE
111 BXNE R12
112 MRS R3,CONTROL
113 LSLS R3,#31
114 IT EQ
115 BXEQ R12
116 SVC 0
117 BX LR
118
119
120 /*--------------------------- _free_box -------------------------------------*/
121
122 ; int _free_box (void *box_mem, void *box);
123 /* Function wrapper for Unprivileged/Privileged mode. */
124
125 PUBLIC _free_box
126 _free_box:
127
128 LDR R12,=rt_free_box
129 MRS R3,IPSR
130 LSLS R3,#24
131 IT NE
132 BXNE R12
133 MRS R3,CONTROL
134 LSLS R3,#31
135 IT EQ
136 BXEQ R12
137 SVC 0
138 BX LR
139
140
141 /*-------------------------- SVC_Handler ------------------------------------*/
142
143 ; void SVC_Handler (void);
144
145 PUBLIC SVC_Handler
146 SVC_Handler:
147
148 MRS R0,PSP /* Read PSP */
149 LDR R1,[R0,#24] /* Read Saved PC from Stack */
150 LDRB R1,[R1,#-2] /* Load SVC Number */
151 CBNZ R1,SVC_User
152
153 LDM R0,{R0-R3,R12} /* Read R0-R3,R12 from stack */
154 BLX R12 /* Call SVC Function */
155
156 MRS R12,PSP /* Read PSP */
157 STM R12,{R0-R2} /* Store return values */
158
159 LDR R3,=os_tsk
160 LDM R3,{R1,R2} /* os_tsk.run, os_tsk.new */
161 CMP R1,R2
162 BEQ SVC_Exit /* no task switch */
163
164 CBZ R1,SVC_Next /* Runtask deleted? */
165 STMDB R12!,{R4-R11} /* Save Old context */
166 STR R12,[R1,#TCB_TSTACK] /* Update os_tsk.run->tsk_stack */
167
168 PUSH {R2,R3}
169 BL rt_stk_check /* Check for Stack overflow */
170 POP {R2,R3}
171
172 SVC_Next:
173 STR R2,[R3] /* os_tsk.run = os_tsk.new */
174
175 LDR R12,[R2,#TCB_TSTACK] /* os_tsk.new->tsk_stack */
176 LDMIA R12!,{R4-R11} /* Restore New Context */
177 MSR PSP,R12 /* Write PSP */
178
179 SVC_Exit:
180 MVN LR,#~0xFFFFFFFD /* set EXC_RETURN value */
181 BX LR
182
183 /*------------------- User SVC ------------------------------*/
184
185 SVC_User:
186 PUSH {R4,LR} /* Save Registers */
187 LDR R2,=SVC_Count
188 LDR R2,[R2]
189 CMP R1,R2
190 BHI SVC_Done /* Overflow */
191
192 LDR R4,=SVC_Table-4
193 LDR R4,[R4,R1,LSL #2] /* Load SVC Function Address */
194
195 LDM R0,{R0-R3,R12} /* Read R0-R3,R12 from stack */
196 BLX R4 /* Call SVC Function */
197
198 MRS R12,PSP
199 STM R12,{R0-R3} /* Function return values */
200 SVC_Done:
201 POP {R4,PC} /* RETI */
202
203
204 /*-------------------------- PendSV_Handler ---------------------------------*/
205
206 ; void PendSV_Handler (void);
207
208 PUBLIC PendSV_Handler
209 PendSV_Handler:
210
211 BL rt_pop_req
212
213 Sys_Switch:
214 LDR R3,=os_tsk
215 LDM R3,{R1,R2} /* os_tsk.run, os_tsk.new */
216 CMP R1,R2
217 BEQ Sys_Exit
218
219 MRS R12,PSP /* Read PSP */
220 STMDB R12!,{R4-R11} /* Save Old context */
221 STR R12,[R1,#TCB_TSTACK] /* Update os_tsk.run->tsk_stack */
222
223 PUSH {R2,R3}
224 BL rt_stk_check /* Check for Stack overflow */
225 POP {R2,R3}
226
227 STR R2,[R3] /* os_tsk.run = os_tsk.new */
228
229 LDR R12,[R2,#TCB_TSTACK] /* os_tsk.new->tsk_stack */
230 LDMIA R12!,{R4-R11} /* Restore New Context */
231 MSR PSP,R12 /* Write PSP */
232
233 Sys_Exit:
234 MVN LR,#~0xFFFFFFFD /* set EXC_RETURN value */
235 BX LR /* Return to Thread Mode */
236
237
238 /*-------------------------- SysTick_Handler --------------------------------*/
239
240 ; void SysTick_Handler (void);
241
242 PUBLIC SysTick_Handler
243 SysTick_Handler:
244
245 BL rt_systick
246 B Sys_Switch
247
248
249 /*-------------------------- OS_Tick_Handler --------------------------------*/
250
251 ; void OS_Tick_Handler (void);
252
253 PUBLIC OS_Tick_Handler
254 OS_Tick_Handler:
255
256 BL os_tick_irqack
257 BL rt_systick
258 B Sys_Switch
259
260
261 END
262
263 /*----------------------------------------------------------------------------
264 * end of file
265 *---------------------------------------------------------------------------*/
Imprint / Impressum