local fork
Fork of mbed-rtos by
Embed:
(wiki syntax)
Show/hide line numbers
HAL_CM3.c
00001 /*---------------------------------------------------------------------------- 00002 * RL-ARM - RTX 00003 *---------------------------------------------------------------------------- 00004 * Name: HAL_CM3.C 00005 * Purpose: Hardware Abstraction Layer for Cortex-M3 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 MOVNE R0,#0x02 ; Privileged Thread mode, use PSP 00074 MOVEQ R0,#0x03 ; Unprivileged Thread mode, use PSP 00075 MSR CONTROL,R0 00076 BX LR 00077 00078 ALIGN 00079 } 00080 00081 00082 /*--------------------------- _alloc_box ------------------------------------*/ 00083 00084 __asm void *_alloc_box (void *box_mem) { 00085 /* Function wrapper for Unprivileged/Privileged mode. */ 00086 LDR R12,=__cpp(rt_alloc_box) 00087 MRS R3,IPSR 00088 LSLS R3,#24 00089 BXNE R12 00090 MRS R3,CONTROL 00091 LSLS R3,#31 00092 BXEQ R12 00093 SVC 0 00094 BX LR 00095 00096 ALIGN 00097 } 00098 00099 00100 /*--------------------------- _free_box -------------------------------------*/ 00101 00102 __asm int _free_box (void *box_mem, void *box) { 00103 /* Function wrapper for Unprivileged/Privileged mode. */ 00104 LDR R12,=__cpp(rt_free_box) 00105 MRS R3,IPSR 00106 LSLS R3,#24 00107 BXNE R12 00108 MRS R3,CONTROL 00109 LSLS R3,#31 00110 BXEQ R12 00111 SVC 0 00112 BX LR 00113 00114 ALIGN 00115 } 00116 00117 00118 /*-------------------------- SVC_Handler ------------------------------------*/ 00119 00120 __asm void SVC_Handler (void) { 00121 PRESERVE8 00122 00123 IMPORT SVC_Count 00124 IMPORT SVC_Table 00125 IMPORT rt_stk_check 00126 00127 MRS R0,PSP ; Read PSP 00128 LDR R1,[R0,#24] ; Read Saved PC from Stack 00129 LDRB R1,[R1,#-2] ; Load SVC Number 00130 CBNZ R1,SVC_User 00131 00132 LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack 00133 BLX R12 ; Call SVC Function 00134 00135 MRS R12,PSP ; Read PSP 00136 STM R12,{R0-R2} ; Store return values 00137 00138 LDR R3,=__cpp(&os_tsk) 00139 LDM R3,{R1,R2} ; os_tsk.run, os_tsk.new 00140 CMP R1,R2 00141 BEQ SVC_Exit ; no task switch 00142 00143 CBZ R1,SVC_Next ; Runtask deleted? 00144 STMDB R12!,{R4-R11} ; Save Old context 00145 STR R12,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack 00146 00147 PUSH {R2,R3} 00148 BL rt_stk_check ; Check for Stack overflow 00149 POP {R2,R3} 00150 00151 SVC_Next 00152 STR R2,[R3] ; os_tsk.run = os_tsk.new 00153 00154 LDR R12,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack 00155 LDMIA R12!,{R4-R11} ; Restore New Context 00156 MSR PSP,R12 ; Write PSP 00157 00158 SVC_Exit 00159 MVN LR,#:NOT:0xFFFFFFFD ; set EXC_RETURN value 00160 BX LR 00161 00162 /*------------------- User SVC ------------------------------*/ 00163 00164 SVC_User 00165 PUSH {R4,LR} ; Save Registers 00166 LDR R2,=SVC_Count 00167 LDR R2,[R2] 00168 CMP R1,R2 00169 BHI SVC_Done ; Overflow 00170 00171 LDR R4,=SVC_Table-4 00172 LDR R4,[R4,R1,LSL #2] ; Load SVC Function Address 00173 00174 LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack 00175 BLX R4 ; Call SVC Function 00176 00177 MRS R12,PSP 00178 STM R12,{R0-R3} ; Function return values 00179 SVC_Done 00180 POP {R4,PC} ; RETI 00181 00182 ALIGN 00183 } 00184 00185 00186 /*-------------------------- PendSV_Handler ---------------------------------*/ 00187 00188 __asm void PendSV_Handler (void) { 00189 PRESERVE8 00190 00191 BL __cpp(rt_pop_req) 00192 00193 Sys_Switch 00194 LDR R3,=__cpp(&os_tsk) 00195 LDM R3,{R1,R2} ; os_tsk.run, os_tsk.new 00196 CMP R1,R2 00197 BEQ Sys_Exit 00198 00199 MRS R12,PSP ; Read PSP 00200 STMDB R12!,{R4-R11} ; Save Old context 00201 STR R12,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack 00202 00203 PUSH {R2,R3} 00204 BL rt_stk_check ; Check for Stack overflow 00205 POP {R2,R3} 00206 00207 STR R2,[R3] ; os_tsk.run = os_tsk.new 00208 00209 LDR R12,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack 00210 LDMIA R12!,{R4-R11} ; Restore New Context 00211 MSR PSP,R12 ; Write PSP 00212 00213 Sys_Exit 00214 MVN LR,#:NOT:0xFFFFFFFD ; set EXC_RETURN value 00215 BX LR ; Return to Thread Mode 00216 00217 ALIGN 00218 } 00219 00220 00221 /*-------------------------- SysTick_Handler --------------------------------*/ 00222 00223 __asm void SysTick_Handler (void) { 00224 PRESERVE8 00225 00226 BL __cpp(rt_systick) 00227 B Sys_Switch 00228 00229 ALIGN 00230 } 00231 00232 00233 /*-------------------------- OS_Tick_Handler --------------------------------*/ 00234 00235 __asm void OS_Tick_Handler (void) { 00236 PRESERVE8 00237 00238 BL __cpp(os_tick_irqack) 00239 BL __cpp(rt_systick) 00240 B Sys_Switch 00241 00242 ALIGN 00243 } 00244 00245 00246 /*---------------------------------------------------------------------------- 00247 * end of file 00248 *---------------------------------------------------------------------------*/ 00249
Generated on Wed Jul 13 2022 09:08:00 by 1.7.2