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_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
