local fork

Dependents:   Encrypted

Fork of mbed-rtos by mbed official

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HAL_CM3.c Source File

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