Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-rtos by
HAL_CM0.c
00001 /*---------------------------------------------------------------------------- 00002 * RL-ARM - RTX 00003 *---------------------------------------------------------------------------- 00004 * Name: HAL_CM0.C 00005 * Purpose: Hardware Abstraction Layer for Cortex-M0 00006 * Rev.: V4.60 00007 *---------------------------------------------------------------------------- 00008 * 00009 * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH 00010 * All rights reserved. 00011 * Redistribution and use in source and binary forms, with or without 00012 * modification, are permitted provided that the following conditions are met: 00013 * - Redistributions of source code must retain the above copyright 00014 * notice, this list of conditions and the following disclaimer. 00015 * - Redistributions in binary form must reproduce the above copyright 00016 * notice, this list of conditions and the following disclaimer in the 00017 * documentation and/or other materials provided with the distribution. 00018 * - Neither the name of ARM nor the names of its contributors may be used 00019 * to endorse or promote products derived from this software without 00020 * specific prior written permission. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00023 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00024 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00025 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE 00026 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00027 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00028 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00029 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00030 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00031 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 * POSSIBILITY OF SUCH DAMAGE. 00033 *---------------------------------------------------------------------------*/ 00034 00035 #include "rt_TypeDef.h" 00036 #include "RTX_Config.h" 00037 #include "rt_System.h" 00038 #include "rt_HAL_CM.h" 00039 #include "rt_Task.h" 00040 #include "rt_MemBox.h" 00041 00042 00043 /*---------------------------------------------------------------------------- 00044 * Functions 00045 *---------------------------------------------------------------------------*/ 00046 00047 00048 /*--------------------------- rt_set_PSP ------------------------------------*/ 00049 00050 __asm void rt_set_PSP (U32 stack) { 00051 MSR PSP,R0 00052 BX LR 00053 } 00054 00055 00056 /*--------------------------- rt_get_PSP ------------------------------------*/ 00057 00058 __asm U32 rt_get_PSP (void) { 00059 MRS R0,PSP 00060 BX LR 00061 } 00062 00063 00064 /*--------------------------- os_set_env ------------------------------------*/ 00065 00066 __asm void os_set_env (void) { 00067 /* Switch to Unprivileged/Privileged Thread mode, use PSP. */ 00068 MOV R0,SP ; PSP = MSP 00069 MSR PSP,R0 00070 LDR R0,=__cpp(&os_flags) 00071 LDRB R0,[R0] 00072 LSLS R0,#31 00073 BNE PrivilegedE 00074 MOVS R0,#0x03 ; Unprivileged Thread mode, use PSP 00075 MSR CONTROL,R0 00076 BX LR 00077 PrivilegedE 00078 MOVS R0,#0x02 ; Privileged Thread mode, use PSP 00079 MSR CONTROL,R0 00080 BX LR 00081 00082 ALIGN 00083 } 00084 00085 00086 /*--------------------------- _alloc_box ------------------------------------*/ 00087 00088 __asm void *_alloc_box (void *box_mem) { 00089 /* Function wrapper for Unprivileged/Privileged mode. */ 00090 LDR R3,=__cpp(rt_alloc_box) 00091 MOV R12,R3 00092 MRS R3,IPSR 00093 LSLS R3,#24 00094 BNE PrivilegedA 00095 MRS R3,CONTROL 00096 LSLS R3,#31 00097 BEQ PrivilegedA 00098 SVC 0 00099 BX LR 00100 PrivilegedA 00101 BX R12 00102 00103 ALIGN 00104 } 00105 00106 00107 /*--------------------------- _free_box -------------------------------------*/ 00108 00109 __asm int _free_box (void *box_mem, void *box) { 00110 /* Function wrapper for Unprivileged/Privileged mode. */ 00111 LDR R3,=__cpp(rt_free_box) 00112 MOV R12,R3 00113 MRS R3,IPSR 00114 LSLS R3,#24 00115 BNE PrivilegedF 00116 MRS R3,CONTROL 00117 LSLS R3,#31 00118 BEQ PrivilegedF 00119 SVC 0 00120 BX LR 00121 PrivilegedF 00122 BX R12 00123 00124 ALIGN 00125 } 00126 00127 00128 /*-------------------------- SVC_Handler ------------------------------------*/ 00129 00130 __asm void SVC_Handler (void) { 00131 PRESERVE8 00132 00133 IMPORT SVC_Count 00134 IMPORT SVC_Table 00135 IMPORT rt_stk_check 00136 00137 MRS R0,PSP ; Read PSP 00138 LDR R1,[R0,#24] ; Read Saved PC from Stack 00139 SUBS R1,R1,#2 ; Point to SVC Instruction 00140 LDRB R1,[R1] ; Load SVC Number 00141 CMP R1,#0 00142 BNE SVC_User ; User SVC Number > 0 00143 00144 MOV LR,R4 00145 LDMIA R0,{R0-R3,R4} ; Read R0-R3,R12 from stack 00146 MOV R12,R4 00147 MOV R4,LR 00148 BLX R12 ; Call SVC Function 00149 00150 MRS R3,PSP ; Read PSP 00151 STMIA R3!,{R0-R2} ; Store return values 00152 00153 LDR R3,=__cpp(&os_tsk) 00154 LDMIA R3!,{R1,R2} ; os_tsk.run, os_tsk.new 00155 CMP R1,R2 00156 BEQ SVC_Exit ; no task switch 00157 00158 SUBS R3,#8 00159 CMP R1,#0 ; Runtask deleted? 00160 BEQ SVC_Next 00161 00162 MRS R0,PSP ; Read PSP 00163 SUBS R0,R0,#32 ; Adjust Start Address 00164 STR R0,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack 00165 STMIA R0!,{R4-R7} ; Save old context (R4-R7) 00166 MOV R4,R8 00167 MOV R5,R9 00168 MOV R6,R10 00169 MOV R7,R11 00170 STMIA R0!,{R4-R7} ; Save old context (R8-R11) 00171 00172 PUSH {R2,R3} 00173 BL rt_stk_check ; Check for Stack overflow 00174 POP {R2,R3} 00175 00176 SVC_Next 00177 STR R2,[R3] ; os_tsk.run = os_tsk.new 00178 00179 LDR R0,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack 00180 ADDS R0,R0,#16 ; Adjust Start Address 00181 LDMIA R0!,{R4-R7} ; Restore new Context (R8-R11) 00182 MOV R8,R4 00183 MOV R9,R5 00184 MOV R10,R6 00185 MOV R11,R7 00186 MSR PSP,R0 ; Write PSP 00187 SUBS R0,R0,#32 ; Adjust Start Address 00188 LDMIA R0!,{R4-R7} ; Restore new Context (R4-R7) 00189 00190 SVC_Exit 00191 MOVS R0,#:NOT:0xFFFFFFFD ; Set EXC_RETURN value 00192 MVNS R0,R0 00193 BX R0 ; RETI to Thread Mode, use PSP 00194 00195 /*------------------- User SVC ------------------------------*/ 00196 00197 SVC_User 00198 PUSH {R4,LR} ; Save Registers 00199 LDR R2,=SVC_Count 00200 LDR R2,[R2] 00201 CMP R1,R2 00202 BHI SVC_Done ; Overflow 00203 00204 LDR R4,=SVC_Table-4 00205 LSLS R1,R1,#2 00206 LDR R4,[R4,R1] ; Load SVC Function Address 00207 MOV LR,R4 00208 00209 LDMIA R0,{R0-R3,R4} ; Read R0-R3,R12 from stack 00210 MOV R12,R4 00211 BLX LR ; Call SVC Function 00212 00213 MRS R4,PSP ; Read PSP 00214 STMIA R4!,{R0-R3} ; Function return values 00215 SVC_Done 00216 POP {R4,PC} ; RETI 00217 00218 ALIGN 00219 } 00220 00221 00222 /*-------------------------- PendSV_Handler ---------------------------------*/ 00223 00224 __asm void PendSV_Handler (void) { 00225 PRESERVE8 00226 00227 BL __cpp(rt_pop_req) 00228 00229 Sys_Switch 00230 LDR R3,=__cpp(&os_tsk) 00231 LDMIA R3!,{R1,R2} ; os_tsk.run, os_tsk.new 00232 CMP R1,R2 00233 BEQ Sys_Exit ; no task switch 00234 00235 SUBS R3,#8 00236 00237 MRS R0,PSP ; Read PSP 00238 SUBS R0,R0,#32 ; Adjust Start Address 00239 STR R0,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack 00240 STMIA R0!,{R4-R7} ; Save old context (R4-R7) 00241 MOV R4,R8 00242 MOV R5,R9 00243 MOV R6,R10 00244 MOV R7,R11 00245 STMIA R0!,{R4-R7} ; Save old context (R8-R11) 00246 00247 PUSH {R2,R3} 00248 BL rt_stk_check ; Check for Stack overflow 00249 POP {R2,R3} 00250 00251 STR R2,[R3] ; os_tsk.run = os_tsk.new 00252 00253 LDR R0,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack 00254 ADDS R0,R0,#16 ; Adjust Start Address 00255 LDMIA R0!,{R4-R7} ; Restore new Context (R8-R11) 00256 MOV R8,R4 00257 MOV R9,R5 00258 MOV R10,R6 00259 MOV R11,R7 00260 MSR PSP,R0 ; Write PSP 00261 SUBS R0,R0,#32 ; Adjust Start Address 00262 LDMIA R0!,{R4-R7} ; Restore new Context (R4-R7) 00263 00264 Sys_Exit 00265 MOVS R0,#:NOT:0xFFFFFFFD ; Set EXC_RETURN value 00266 MVNS R0,R0 00267 BX R0 ; RETI to Thread Mode, use PSP 00268 00269 ALIGN 00270 } 00271 00272 00273 /*-------------------------- SysTick_Handler --------------------------------*/ 00274 00275 __asm void SysTick_Handler (void) { 00276 PRESERVE8 00277 00278 BL __cpp(rt_systick) 00279 B Sys_Switch 00280 00281 ALIGN 00282 } 00283 00284 00285 /*-------------------------- OS_Tick_Handler --------------------------------*/ 00286 00287 __asm void OS_Tick_Handler (void) { 00288 PRESERVE8 00289 00290 BL __cpp(os_tick_irqack) 00291 BL __cpp(rt_systick) 00292 B Sys_Switch 00293 00294 ALIGN 00295 } 00296 00297 00298 /*---------------------------------------------------------------------------- 00299 * end of file 00300 *---------------------------------------------------------------------------*/ 00301
Generated on Wed Jul 13 2022 09:08:00 by
1.7.2
