]> git.gir.st - tmk_keyboard.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/rtos/rtx/TARGET_CORTEX_M/TARGET_M3/TOOLCHAIN_ARM/HAL_CM3.c
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_ARM / HAL_CM3.c
1 /*----------------------------------------------------------------------------
2 * RL-ARM - RTX
3 *----------------------------------------------------------------------------
4 * Name: HAL_CM3.C
5 * Purpose: Hardware Abstraction Layer for Cortex-M3
6 * Rev.: V4.60
7 *----------------------------------------------------------------------------
8 *
9 * Copyright (c) 1999-2009 KEIL, 2009-2012 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 #include "rt_TypeDef.h"
36 #include "RTX_Conf.h"
37 #include "rt_System.h"
38 #include "rt_HAL_CM.h"
39 #include "rt_Task.h"
40 #include "rt_MemBox.h"
41
42
43 /*----------------------------------------------------------------------------
44 * Functions
45 *---------------------------------------------------------------------------*/
46
47
48 /*--------------------------- rt_set_PSP ------------------------------------*/
49
50 __asm void rt_set_PSP (U32 stack) {
51 MSR PSP,R0
52 BX LR
53 }
54
55
56 /*--------------------------- rt_get_PSP ------------------------------------*/
57
58 __asm U32 rt_get_PSP (void) {
59 MRS R0,PSP
60 BX LR
61 }
62
63
64 /*--------------------------- os_set_env ------------------------------------*/
65
66 __asm void os_set_env (void) {
67 /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
68 MOV R0,SP ; PSP = MSP
69 MSR PSP,R0
70 LDR R0,=__cpp(&os_flags)
71 LDRB R0,[R0]
72 LSLS R0,#31
73 MOVNE R0,#0x02 ; Privileged Thread mode, use PSP
74 MOVEQ R0,#0x03 ; Unprivileged Thread mode, use PSP
75 MSR CONTROL,R0
76 BX LR
77
78 ALIGN
79 }
80
81
82 /*--------------------------- _alloc_box ------------------------------------*/
83
84 __asm void *_alloc_box (void *box_mem) {
85 /* Function wrapper for Unprivileged/Privileged mode. */
86 LDR R12,=__cpp(rt_alloc_box)
87 MRS R3,IPSR
88 LSLS R3,#24
89 BXNE R12
90 MRS R3,CONTROL
91 LSLS R3,#31
92 BXEQ R12
93 SVC 0
94 BX LR
95
96 ALIGN
97 }
98
99
100 /*--------------------------- _free_box -------------------------------------*/
101
102 __asm int _free_box (void *box_mem, void *box) {
103 /* Function wrapper for Unprivileged/Privileged mode. */
104 LDR R12,=__cpp(rt_free_box)
105 MRS R3,IPSR
106 LSLS R3,#24
107 BXNE R12
108 MRS R3,CONTROL
109 LSLS R3,#31
110 BXEQ R12
111 SVC 0
112 BX LR
113
114 ALIGN
115 }
116
117
118 /*-------------------------- SVC_Handler ------------------------------------*/
119
120 __asm void SVC_Handler (void) {
121 PRESERVE8
122
123 IMPORT SVC_Count
124 IMPORT SVC_Table
125 IMPORT rt_stk_check
126
127 MRS R0,PSP ; Read PSP
128 LDR R1,[R0,#24] ; Read Saved PC from Stack
129 LDRB R1,[R1,#-2] ; Load SVC Number
130 CBNZ R1,SVC_User
131
132 LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
133 BLX R12 ; Call SVC Function
134
135 MRS R12,PSP ; Read PSP
136 STM R12,{R0-R2} ; Store return values
137
138 LDR R3,=__cpp(&os_tsk)
139 LDM R3,{R1,R2} ; os_tsk.run, os_tsk.new
140 CMP R1,R2
141 BEQ SVC_Exit ; no task switch
142
143 CBZ R1,SVC_Next ; Runtask deleted?
144 STMDB R12!,{R4-R11} ; Save Old context
145 STR R12,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
146
147 PUSH {R2,R3}
148 BL rt_stk_check ; Check for Stack overflow
149 POP {R2,R3}
150
151 SVC_Next
152 STR R2,[R3] ; os_tsk.run = os_tsk.new
153
154 LDR R12,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack
155 LDMIA R12!,{R4-R11} ; Restore New Context
156 MSR PSP,R12 ; Write PSP
157
158 SVC_Exit
159 MVN LR,#:NOT:0xFFFFFFFD ; set EXC_RETURN value
160 BX LR
161
162 /*------------------- User SVC ------------------------------*/
163
164 SVC_User
165 PUSH {R4,LR} ; Save Registers
166 LDR R2,=SVC_Count
167 LDR R2,[R2]
168 CMP R1,R2
169 BHI SVC_Done ; Overflow
170
171 LDR R4,=SVC_Table-4
172 LDR R4,[R4,R1,LSL #2] ; Load SVC Function Address
173
174 LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
175 BLX R4 ; Call SVC Function
176
177 MRS R12,PSP
178 STM R12,{R0-R3} ; Function return values
179 SVC_Done
180 POP {R4,PC} ; RETI
181
182 ALIGN
183 }
184
185
186 /*-------------------------- PendSV_Handler ---------------------------------*/
187
188 __asm void PendSV_Handler (void) {
189 PRESERVE8
190
191 BL __cpp(rt_pop_req)
192
193 Sys_Switch
194 LDR R3,=__cpp(&os_tsk)
195 LDM R3,{R1,R2} ; os_tsk.run, os_tsk.new
196 CMP R1,R2
197 BEQ Sys_Exit
198
199 MRS R12,PSP ; Read PSP
200 STMDB R12!,{R4-R11} ; Save Old context
201 STR R12,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
202
203 PUSH {R2,R3}
204 BL rt_stk_check ; Check for Stack overflow
205 POP {R2,R3}
206
207 STR R2,[R3] ; os_tsk.run = os_tsk.new
208
209 LDR R12,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack
210 LDMIA R12!,{R4-R11} ; Restore New Context
211 MSR PSP,R12 ; Write PSP
212
213 Sys_Exit
214 MVN LR,#:NOT:0xFFFFFFFD ; set EXC_RETURN value
215 BX LR ; Return to Thread Mode
216
217 ALIGN
218 }
219
220
221 /*-------------------------- SysTick_Handler --------------------------------*/
222
223 __asm void SysTick_Handler (void) {
224 PRESERVE8
225
226 BL __cpp(rt_systick)
227 B Sys_Switch
228
229 ALIGN
230 }
231
232
233 /*-------------------------- OS_Tick_Handler --------------------------------*/
234
235 __asm void OS_Tick_Handler (void) {
236 PRESERVE8
237
238 BL __cpp(os_tick_irqack)
239 BL __cpp(rt_systick)
240 B Sys_Switch
241
242 ALIGN
243 }
244
245
246 /*----------------------------------------------------------------------------
247 * end of file
248 *---------------------------------------------------------------------------*/
249
Imprint / Impressum