Lab Checkoff
Dependencies: SDFileSystem TextLCD mbed-rtos mbed wave_player FATFileSystem
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 00302
Generated on Fri Jul 15 2022 13:41:34 by 1.7.2