Ethernetwebsoc

Dependencies:   C12832_lcd LM75B WebSocketClient mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HAL_CM0.c Source File

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.50
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