NRF com

Dependencies:   mbed nRF24L01P

Committer:
vmihalcut
Date:
Mon May 27 06:06:31 2013 +0000
Revision:
0:fdfe93cb9255
NRF24L01 receiver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vmihalcut 0:fdfe93cb9255 1 /*----------------------------------------------------------------------------
vmihalcut 0:fdfe93cb9255 2 * RL-ARM - RTX
vmihalcut 0:fdfe93cb9255 3 *----------------------------------------------------------------------------
vmihalcut 0:fdfe93cb9255 4 * Name: HAL_CM0.S
vmihalcut 0:fdfe93cb9255 5 * Purpose: Hardware Abstraction Layer for Cortex-M0
vmihalcut 0:fdfe93cb9255 6 * Rev.: V4.60
vmihalcut 0:fdfe93cb9255 7 *----------------------------------------------------------------------------
vmihalcut 0:fdfe93cb9255 8 *
vmihalcut 0:fdfe93cb9255 9 * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
vmihalcut 0:fdfe93cb9255 10 * All rights reserved.
vmihalcut 0:fdfe93cb9255 11 * Redistribution and use in source and binary forms, with or without
vmihalcut 0:fdfe93cb9255 12 * modification, are permitted provided that the following conditions are met:
vmihalcut 0:fdfe93cb9255 13 * - Redistributions of source code must retain the above copyright
vmihalcut 0:fdfe93cb9255 14 * notice, this list of conditions and the following disclaimer.
vmihalcut 0:fdfe93cb9255 15 * - Redistributions in binary form must reproduce the above copyright
vmihalcut 0:fdfe93cb9255 16 * notice, this list of conditions and the following disclaimer in the
vmihalcut 0:fdfe93cb9255 17 * documentation and/or other materials provided with the distribution.
vmihalcut 0:fdfe93cb9255 18 * - Neither the name of ARM nor the names of its contributors may be used
vmihalcut 0:fdfe93cb9255 19 * to endorse or promote products derived from this software without
vmihalcut 0:fdfe93cb9255 20 * specific prior written permission.
vmihalcut 0:fdfe93cb9255 21 *
vmihalcut 0:fdfe93cb9255 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
vmihalcut 0:fdfe93cb9255 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
vmihalcut 0:fdfe93cb9255 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
vmihalcut 0:fdfe93cb9255 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
vmihalcut 0:fdfe93cb9255 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
vmihalcut 0:fdfe93cb9255 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
vmihalcut 0:fdfe93cb9255 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
vmihalcut 0:fdfe93cb9255 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
vmihalcut 0:fdfe93cb9255 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
vmihalcut 0:fdfe93cb9255 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
vmihalcut 0:fdfe93cb9255 32 * POSSIBILITY OF SUCH DAMAGE.
vmihalcut 0:fdfe93cb9255 33 *---------------------------------------------------------------------------*/
vmihalcut 0:fdfe93cb9255 34
vmihalcut 0:fdfe93cb9255 35 .file "HAL_CM0.S"
vmihalcut 0:fdfe93cb9255 36 .syntax unified
vmihalcut 0:fdfe93cb9255 37
vmihalcut 0:fdfe93cb9255 38 .equ TCB_TSTACK, 36
vmihalcut 0:fdfe93cb9255 39
vmihalcut 0:fdfe93cb9255 40
vmihalcut 0:fdfe93cb9255 41 /*----------------------------------------------------------------------------
vmihalcut 0:fdfe93cb9255 42 * Functions
vmihalcut 0:fdfe93cb9255 43 *---------------------------------------------------------------------------*/
vmihalcut 0:fdfe93cb9255 44
vmihalcut 0:fdfe93cb9255 45 .thumb
vmihalcut 0:fdfe93cb9255 46
vmihalcut 0:fdfe93cb9255 47 .section ".text"
vmihalcut 0:fdfe93cb9255 48 .align 2
vmihalcut 0:fdfe93cb9255 49
vmihalcut 0:fdfe93cb9255 50
vmihalcut 0:fdfe93cb9255 51 /*--------------------------- rt_set_PSP ------------------------------------*/
vmihalcut 0:fdfe93cb9255 52
vmihalcut 0:fdfe93cb9255 53 # void rt_set_PSP (U32 stack);
vmihalcut 0:fdfe93cb9255 54
vmihalcut 0:fdfe93cb9255 55 .thumb_func
vmihalcut 0:fdfe93cb9255 56 .type rt_set_PSP, %function
vmihalcut 0:fdfe93cb9255 57 .global rt_set_PSP
vmihalcut 0:fdfe93cb9255 58 rt_set_PSP:
vmihalcut 0:fdfe93cb9255 59 .fnstart
vmihalcut 0:fdfe93cb9255 60 .cantunwind
vmihalcut 0:fdfe93cb9255 61
vmihalcut 0:fdfe93cb9255 62 MSR PSP,R0
vmihalcut 0:fdfe93cb9255 63 BX LR
vmihalcut 0:fdfe93cb9255 64
vmihalcut 0:fdfe93cb9255 65 .fnend
vmihalcut 0:fdfe93cb9255 66 .size rt_set_PSP, .-rt_set_PSP
vmihalcut 0:fdfe93cb9255 67
vmihalcut 0:fdfe93cb9255 68
vmihalcut 0:fdfe93cb9255 69 /*--------------------------- rt_get_PSP ------------------------------------*/
vmihalcut 0:fdfe93cb9255 70
vmihalcut 0:fdfe93cb9255 71 # U32 rt_get_PSP (void);
vmihalcut 0:fdfe93cb9255 72
vmihalcut 0:fdfe93cb9255 73 .thumb_func
vmihalcut 0:fdfe93cb9255 74 .type rt_get_PSP, %function
vmihalcut 0:fdfe93cb9255 75 .global rt_get_PSP
vmihalcut 0:fdfe93cb9255 76 rt_get_PSP:
vmihalcut 0:fdfe93cb9255 77 .fnstart
vmihalcut 0:fdfe93cb9255 78 .cantunwind
vmihalcut 0:fdfe93cb9255 79
vmihalcut 0:fdfe93cb9255 80 MRS R0,PSP
vmihalcut 0:fdfe93cb9255 81 BX LR
vmihalcut 0:fdfe93cb9255 82
vmihalcut 0:fdfe93cb9255 83 .fnend
vmihalcut 0:fdfe93cb9255 84 .size rt_get_PSP, .-rt_get_PSP
vmihalcut 0:fdfe93cb9255 85
vmihalcut 0:fdfe93cb9255 86
vmihalcut 0:fdfe93cb9255 87 /*--------------------------- os_set_env ------------------------------------*/
vmihalcut 0:fdfe93cb9255 88
vmihalcut 0:fdfe93cb9255 89 # void os_set_env (void);
vmihalcut 0:fdfe93cb9255 90 /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
vmihalcut 0:fdfe93cb9255 91
vmihalcut 0:fdfe93cb9255 92 .thumb_func
vmihalcut 0:fdfe93cb9255 93 .type os_set_env, %function
vmihalcut 0:fdfe93cb9255 94 .global os_set_env
vmihalcut 0:fdfe93cb9255 95 os_set_env:
vmihalcut 0:fdfe93cb9255 96 .fnstart
vmihalcut 0:fdfe93cb9255 97 .cantunwind
vmihalcut 0:fdfe93cb9255 98
vmihalcut 0:fdfe93cb9255 99 MOV R0,SP /* PSP = MSP */
vmihalcut 0:fdfe93cb9255 100 MSR PSP,R0
vmihalcut 0:fdfe93cb9255 101 LDR R0,=os_flags
vmihalcut 0:fdfe93cb9255 102 LDRB R0,[R0]
vmihalcut 0:fdfe93cb9255 103 LSLS R0,#31
vmihalcut 0:fdfe93cb9255 104 BNE PrivilegedE
vmihalcut 0:fdfe93cb9255 105 MOVS R0,#0x03 /* Unprivileged Thread mode, use PSP */
vmihalcut 0:fdfe93cb9255 106 MSR CONTROL,R0
vmihalcut 0:fdfe93cb9255 107 BX LR
vmihalcut 0:fdfe93cb9255 108 PrivilegedE:
vmihalcut 0:fdfe93cb9255 109 MOVS R0,#0x02 /* Privileged Thread mode, use PSP */
vmihalcut 0:fdfe93cb9255 110 MSR CONTROL,R0
vmihalcut 0:fdfe93cb9255 111 BX LR
vmihalcut 0:fdfe93cb9255 112
vmihalcut 0:fdfe93cb9255 113 .fnend
vmihalcut 0:fdfe93cb9255 114 .size os_set_env, .-os_set_env
vmihalcut 0:fdfe93cb9255 115
vmihalcut 0:fdfe93cb9255 116
vmihalcut 0:fdfe93cb9255 117 /*--------------------------- _alloc_box ------------------------------------*/
vmihalcut 0:fdfe93cb9255 118
vmihalcut 0:fdfe93cb9255 119 # void *_alloc_box (void *box_mem);
vmihalcut 0:fdfe93cb9255 120 /* Function wrapper for Unprivileged/Privileged mode. */
vmihalcut 0:fdfe93cb9255 121
vmihalcut 0:fdfe93cb9255 122 .thumb_func
vmihalcut 0:fdfe93cb9255 123 .type _alloc_box, %function
vmihalcut 0:fdfe93cb9255 124 .global _alloc_box
vmihalcut 0:fdfe93cb9255 125 _alloc_box:
vmihalcut 0:fdfe93cb9255 126 .fnstart
vmihalcut 0:fdfe93cb9255 127 .cantunwind
vmihalcut 0:fdfe93cb9255 128
vmihalcut 0:fdfe93cb9255 129 LDR R3,=rt_alloc_box
vmihalcut 0:fdfe93cb9255 130 MOV R12,R3
vmihalcut 0:fdfe93cb9255 131 MRS R3,IPSR
vmihalcut 0:fdfe93cb9255 132 LSLS R3,#24
vmihalcut 0:fdfe93cb9255 133 BNE PrivilegedA
vmihalcut 0:fdfe93cb9255 134 MRS R3,CONTROL
vmihalcut 0:fdfe93cb9255 135 LSLS R3,#31
vmihalcut 0:fdfe93cb9255 136 BEQ PrivilegedA
vmihalcut 0:fdfe93cb9255 137 SVC 0
vmihalcut 0:fdfe93cb9255 138 BX LR
vmihalcut 0:fdfe93cb9255 139 PrivilegedA:
vmihalcut 0:fdfe93cb9255 140 BX R12
vmihalcut 0:fdfe93cb9255 141
vmihalcut 0:fdfe93cb9255 142 .fnend
vmihalcut 0:fdfe93cb9255 143 .size _alloc_box, .-_alloc_box
vmihalcut 0:fdfe93cb9255 144
vmihalcut 0:fdfe93cb9255 145
vmihalcut 0:fdfe93cb9255 146 /*--------------------------- _free_box -------------------------------------*/
vmihalcut 0:fdfe93cb9255 147
vmihalcut 0:fdfe93cb9255 148 # int _free_box (void *box_mem, void *box);
vmihalcut 0:fdfe93cb9255 149 /* Function wrapper for Unprivileged/Privileged mode. */
vmihalcut 0:fdfe93cb9255 150
vmihalcut 0:fdfe93cb9255 151 .thumb_func
vmihalcut 0:fdfe93cb9255 152 .type _free_box, %function
vmihalcut 0:fdfe93cb9255 153 .global _free_box
vmihalcut 0:fdfe93cb9255 154 _free_box:
vmihalcut 0:fdfe93cb9255 155 .fnstart
vmihalcut 0:fdfe93cb9255 156 .cantunwind
vmihalcut 0:fdfe93cb9255 157
vmihalcut 0:fdfe93cb9255 158 LDR R3,=rt_free_box
vmihalcut 0:fdfe93cb9255 159 MOV R12,R3
vmihalcut 0:fdfe93cb9255 160 MRS R3,IPSR
vmihalcut 0:fdfe93cb9255 161 LSLS R3,#24
vmihalcut 0:fdfe93cb9255 162 BNE PrivilegedF
vmihalcut 0:fdfe93cb9255 163 MRS R3,CONTROL
vmihalcut 0:fdfe93cb9255 164 LSLS R3,#31
vmihalcut 0:fdfe93cb9255 165 BEQ PrivilegedF
vmihalcut 0:fdfe93cb9255 166 SVC 0
vmihalcut 0:fdfe93cb9255 167 BX LR
vmihalcut 0:fdfe93cb9255 168 PrivilegedF:
vmihalcut 0:fdfe93cb9255 169 BX R12
vmihalcut 0:fdfe93cb9255 170
vmihalcut 0:fdfe93cb9255 171 .fnend
vmihalcut 0:fdfe93cb9255 172 .size _free_box, .-_free_box
vmihalcut 0:fdfe93cb9255 173
vmihalcut 0:fdfe93cb9255 174
vmihalcut 0:fdfe93cb9255 175 /*-------------------------- SVC_Handler ------------------------------------*/
vmihalcut 0:fdfe93cb9255 176
vmihalcut 0:fdfe93cb9255 177 # void SVC_Handler (void);
vmihalcut 0:fdfe93cb9255 178
vmihalcut 0:fdfe93cb9255 179 .thumb_func
vmihalcut 0:fdfe93cb9255 180 .type SVC_Handler, %function
vmihalcut 0:fdfe93cb9255 181 .global SVC_Handler
vmihalcut 0:fdfe93cb9255 182 SVC_Handler:
vmihalcut 0:fdfe93cb9255 183 .fnstart
vmihalcut 0:fdfe93cb9255 184 .cantunwind
vmihalcut 0:fdfe93cb9255 185
vmihalcut 0:fdfe93cb9255 186 MRS R0,PSP /* Read PSP */
vmihalcut 0:fdfe93cb9255 187 LDR R1,[R0,#24] /* Read Saved PC from Stack */
vmihalcut 0:fdfe93cb9255 188 SUBS R1,R1,#2 /* Point to SVC Instruction */
vmihalcut 0:fdfe93cb9255 189 LDRB R1,[R1] /* Load SVC Number */
vmihalcut 0:fdfe93cb9255 190 CMP R1,#0
vmihalcut 0:fdfe93cb9255 191 BNE SVC_User /* User SVC Number > 0 */
vmihalcut 0:fdfe93cb9255 192
vmihalcut 0:fdfe93cb9255 193 MOV LR,R4
vmihalcut 0:fdfe93cb9255 194 LDMIA R0,{R0-R3,R4} /* Read R0-R3,R12 from stack */
vmihalcut 0:fdfe93cb9255 195 MOV R12,R4
vmihalcut 0:fdfe93cb9255 196 MOV R4,LR
vmihalcut 0:fdfe93cb9255 197 BLX R12 /* Call SVC Function */
vmihalcut 0:fdfe93cb9255 198
vmihalcut 0:fdfe93cb9255 199 MRS R3,PSP /* Read PSP */
vmihalcut 0:fdfe93cb9255 200 STMIA R3!,{R0-R2} /* Store return values */
vmihalcut 0:fdfe93cb9255 201
vmihalcut 0:fdfe93cb9255 202 LDR R3,=os_tsk
vmihalcut 0:fdfe93cb9255 203 LDMIA R3!,{R1,R2} /* os_tsk.run, os_tsk.new */
vmihalcut 0:fdfe93cb9255 204 CMP R1,R2
vmihalcut 0:fdfe93cb9255 205 BEQ SVC_Exit /* no task switch */
vmihalcut 0:fdfe93cb9255 206
vmihalcut 0:fdfe93cb9255 207 SUBS R3,#8
vmihalcut 0:fdfe93cb9255 208 CMP R1,#0 /* Runtask deleted? */
vmihalcut 0:fdfe93cb9255 209 BEQ SVC_Next
vmihalcut 0:fdfe93cb9255 210
vmihalcut 0:fdfe93cb9255 211 MRS R0,PSP /* Read PSP */
vmihalcut 0:fdfe93cb9255 212 SUBS R0,R0,#32 /* Adjust Start Address */
vmihalcut 0:fdfe93cb9255 213 STR R0,[R1,#TCB_TSTACK] /* Update os_tsk.run->tsk_stack */
vmihalcut 0:fdfe93cb9255 214 STMIA R0!,{R4-R7} /* Save old context (R4-R7) */
vmihalcut 0:fdfe93cb9255 215 MOV R4,R8
vmihalcut 0:fdfe93cb9255 216 MOV R5,R9
vmihalcut 0:fdfe93cb9255 217 MOV R6,R10
vmihalcut 0:fdfe93cb9255 218 MOV R7,R11
vmihalcut 0:fdfe93cb9255 219 STMIA R0!,{R4-R7} /* Save old context (R8-R11) */
vmihalcut 0:fdfe93cb9255 220
vmihalcut 0:fdfe93cb9255 221 PUSH {R2,R3}
vmihalcut 0:fdfe93cb9255 222 BL rt_stk_check /* Check for Stack overflow */
vmihalcut 0:fdfe93cb9255 223 POP {R2,R3}
vmihalcut 0:fdfe93cb9255 224
vmihalcut 0:fdfe93cb9255 225 SVC_Next:
vmihalcut 0:fdfe93cb9255 226 STR R2,[R3] /* os_tsk.run = os_tsk.new */
vmihalcut 0:fdfe93cb9255 227
vmihalcut 0:fdfe93cb9255 228 LDR R0,[R2,#TCB_TSTACK] /* os_tsk.new->tsk_stack */
vmihalcut 0:fdfe93cb9255 229 ADDS R0,R0,#16 /* Adjust Start Address */
vmihalcut 0:fdfe93cb9255 230 LDMIA R0!,{R4-R7} /* Restore new Context (R8-R11) */
vmihalcut 0:fdfe93cb9255 231 MOV R8,R4
vmihalcut 0:fdfe93cb9255 232 MOV R9,R5
vmihalcut 0:fdfe93cb9255 233 MOV R10,R6
vmihalcut 0:fdfe93cb9255 234 MOV R11,R7
vmihalcut 0:fdfe93cb9255 235 MSR PSP,R0 /* Write PSP */
vmihalcut 0:fdfe93cb9255 236 SUBS R0,R0,#32 /* Adjust Start Address */
vmihalcut 0:fdfe93cb9255 237 LDMIA R0!,{R4-R7} /* Restore new Context (R4-R7) */
vmihalcut 0:fdfe93cb9255 238
vmihalcut 0:fdfe93cb9255 239 SVC_Exit:
vmihalcut 0:fdfe93cb9255 240 MOVS R0,#~0xFFFFFFFD /* Set EXC_RETURN value */
vmihalcut 0:fdfe93cb9255 241 MVNS R0,R0
vmihalcut 0:fdfe93cb9255 242 BX R0 /* RETI to Thread Mode, use PSP */
vmihalcut 0:fdfe93cb9255 243
vmihalcut 0:fdfe93cb9255 244 /*------------------- User SVC ------------------------------*/
vmihalcut 0:fdfe93cb9255 245
vmihalcut 0:fdfe93cb9255 246 SVC_User:
vmihalcut 0:fdfe93cb9255 247 PUSH {R4,LR} /* Save Registers */
vmihalcut 0:fdfe93cb9255 248 LDR R2,=SVC_Count
vmihalcut 0:fdfe93cb9255 249 LDR R2,[R2]
vmihalcut 0:fdfe93cb9255 250 CMP R1,R2
vmihalcut 0:fdfe93cb9255 251 BHI SVC_Done /* Overflow */
vmihalcut 0:fdfe93cb9255 252
vmihalcut 0:fdfe93cb9255 253 LDR R4,=SVC_Table-4
vmihalcut 0:fdfe93cb9255 254 LSLS R1,R1,#2
vmihalcut 0:fdfe93cb9255 255 LDR R4,[R4,R1] /* Load SVC Function Address */
vmihalcut 0:fdfe93cb9255 256 MOV LR,R4
vmihalcut 0:fdfe93cb9255 257
vmihalcut 0:fdfe93cb9255 258 LDMIA R0,{R0-R3,R4} /* Read R0-R3,R12 from stack */
vmihalcut 0:fdfe93cb9255 259 MOV R12,R4
vmihalcut 0:fdfe93cb9255 260 BLX LR /* Call SVC Function */
vmihalcut 0:fdfe93cb9255 261
vmihalcut 0:fdfe93cb9255 262 MRS R4,PSP /* Read PSP */
vmihalcut 0:fdfe93cb9255 263 STMIA R4!,{R0-R3} /* Function return values */
vmihalcut 0:fdfe93cb9255 264 SVC_Done:
vmihalcut 0:fdfe93cb9255 265 POP {R4,PC} /* RETI */
vmihalcut 0:fdfe93cb9255 266
vmihalcut 0:fdfe93cb9255 267 .fnend
vmihalcut 0:fdfe93cb9255 268 .size SVC_Handler, .-SVC_Handler
vmihalcut 0:fdfe93cb9255 269
vmihalcut 0:fdfe93cb9255 270
vmihalcut 0:fdfe93cb9255 271 /*-------------------------- PendSV_Handler ---------------------------------*/
vmihalcut 0:fdfe93cb9255 272
vmihalcut 0:fdfe93cb9255 273 # void PendSV_Handler (void);
vmihalcut 0:fdfe93cb9255 274
vmihalcut 0:fdfe93cb9255 275 .thumb_func
vmihalcut 0:fdfe93cb9255 276 .type PendSV_Handler, %function
vmihalcut 0:fdfe93cb9255 277 .global PendSV_Handler
vmihalcut 0:fdfe93cb9255 278 .global Sys_Switch
vmihalcut 0:fdfe93cb9255 279 PendSV_Handler:
vmihalcut 0:fdfe93cb9255 280 .fnstart
vmihalcut 0:fdfe93cb9255 281 .cantunwind
vmihalcut 0:fdfe93cb9255 282
vmihalcut 0:fdfe93cb9255 283 BL rt_pop_req
vmihalcut 0:fdfe93cb9255 284
vmihalcut 0:fdfe93cb9255 285 Sys_Switch:
vmihalcut 0:fdfe93cb9255 286 LDR R3,=os_tsk
vmihalcut 0:fdfe93cb9255 287 LDMIA R3!,{R1,R2} /* os_tsk.run, os_tsk.new */
vmihalcut 0:fdfe93cb9255 288 CMP R1,R2
vmihalcut 0:fdfe93cb9255 289 BEQ Sys_Exit /* no task switch */
vmihalcut 0:fdfe93cb9255 290
vmihalcut 0:fdfe93cb9255 291 SUBS R3,#8
vmihalcut 0:fdfe93cb9255 292
vmihalcut 0:fdfe93cb9255 293 MRS R0,PSP /* Read PSP */
vmihalcut 0:fdfe93cb9255 294 SUBS R0,R0,#32 /* Adjust Start Address */
vmihalcut 0:fdfe93cb9255 295 STR R0,[R1,#TCB_TSTACK] /* Update os_tsk.run->tsk_stack */
vmihalcut 0:fdfe93cb9255 296 STMIA R0!,{R4-R7} /* Save old context (R4-R7) */
vmihalcut 0:fdfe93cb9255 297 MOV R4,R8
vmihalcut 0:fdfe93cb9255 298 MOV R5,R9
vmihalcut 0:fdfe93cb9255 299 MOV R6,R10
vmihalcut 0:fdfe93cb9255 300 MOV R7,R11
vmihalcut 0:fdfe93cb9255 301 STMIA R0!,{R4-R7} /* Save old context (R8-R11) */
vmihalcut 0:fdfe93cb9255 302
vmihalcut 0:fdfe93cb9255 303 PUSH {R2,R3}
vmihalcut 0:fdfe93cb9255 304 BL rt_stk_check /* Check for Stack overflow */
vmihalcut 0:fdfe93cb9255 305 POP {R2,R3}
vmihalcut 0:fdfe93cb9255 306
vmihalcut 0:fdfe93cb9255 307 STR R2,[R3] /* os_tsk.run = os_tsk.new */
vmihalcut 0:fdfe93cb9255 308
vmihalcut 0:fdfe93cb9255 309 LDR R0,[R2,#TCB_TSTACK] /* os_tsk.new->tsk_stack */
vmihalcut 0:fdfe93cb9255 310 ADDS R0,R0,#16 /* Adjust Start Address */
vmihalcut 0:fdfe93cb9255 311 LDMIA R0!,{R4-R7} /* Restore new Context (R8-R11) */
vmihalcut 0:fdfe93cb9255 312 MOV R8,R4
vmihalcut 0:fdfe93cb9255 313 MOV R9,R5
vmihalcut 0:fdfe93cb9255 314 MOV R10,R6
vmihalcut 0:fdfe93cb9255 315 MOV R11,R7
vmihalcut 0:fdfe93cb9255 316 MSR PSP,R0 /* Write PSP */
vmihalcut 0:fdfe93cb9255 317 SUBS R0,R0,#32 /* Adjust Start Address */
vmihalcut 0:fdfe93cb9255 318 LDMIA R0!,{R4-R7} /* Restore new Context (R4-R7) */
vmihalcut 0:fdfe93cb9255 319
vmihalcut 0:fdfe93cb9255 320 Sys_Exit:
vmihalcut 0:fdfe93cb9255 321 MOVS R0,#~0xFFFFFFFD /* Set EXC_RETURN value */
vmihalcut 0:fdfe93cb9255 322 MVNS R0,R0
vmihalcut 0:fdfe93cb9255 323 BX R0 /* RETI to Thread Mode, use PSP */
vmihalcut 0:fdfe93cb9255 324
vmihalcut 0:fdfe93cb9255 325 .fnend
vmihalcut 0:fdfe93cb9255 326 .size PendSV_Handler, .-PendSV_Handler
vmihalcut 0:fdfe93cb9255 327
vmihalcut 0:fdfe93cb9255 328
vmihalcut 0:fdfe93cb9255 329 /*-------------------------- SysTick_Handler --------------------------------*/
vmihalcut 0:fdfe93cb9255 330
vmihalcut 0:fdfe93cb9255 331 # void SysTick_Handler (void);
vmihalcut 0:fdfe93cb9255 332
vmihalcut 0:fdfe93cb9255 333 .thumb_func
vmihalcut 0:fdfe93cb9255 334 .type SysTick_Handler, %function
vmihalcut 0:fdfe93cb9255 335 .global SysTick_Handler
vmihalcut 0:fdfe93cb9255 336 SysTick_Handler:
vmihalcut 0:fdfe93cb9255 337 .fnstart
vmihalcut 0:fdfe93cb9255 338 .cantunwind
vmihalcut 0:fdfe93cb9255 339
vmihalcut 0:fdfe93cb9255 340 BL rt_systick
vmihalcut 0:fdfe93cb9255 341 B Sys_Switch
vmihalcut 0:fdfe93cb9255 342
vmihalcut 0:fdfe93cb9255 343 .fnend
vmihalcut 0:fdfe93cb9255 344 .size SysTick_Handler, .-SysTick_Handler
vmihalcut 0:fdfe93cb9255 345
vmihalcut 0:fdfe93cb9255 346
vmihalcut 0:fdfe93cb9255 347 /*-------------------------- OS_Tick_Handler --------------------------------*/
vmihalcut 0:fdfe93cb9255 348
vmihalcut 0:fdfe93cb9255 349 # void OS_Tick_Handler (void);
vmihalcut 0:fdfe93cb9255 350
vmihalcut 0:fdfe93cb9255 351 .thumb_func
vmihalcut 0:fdfe93cb9255 352 .type OS_Tick_Handler, %function
vmihalcut 0:fdfe93cb9255 353 .global OS_Tick_Handler
vmihalcut 0:fdfe93cb9255 354 OS_Tick_Handler:
vmihalcut 0:fdfe93cb9255 355 .fnstart
vmihalcut 0:fdfe93cb9255 356 .cantunwind
vmihalcut 0:fdfe93cb9255 357
vmihalcut 0:fdfe93cb9255 358 BL os_tick_irqack
vmihalcut 0:fdfe93cb9255 359 BL rt_systick
vmihalcut 0:fdfe93cb9255 360 B Sys_Switch
vmihalcut 0:fdfe93cb9255 361
vmihalcut 0:fdfe93cb9255 362 .fnend
vmihalcut 0:fdfe93cb9255 363 .size OS_Tick_Handler, .-OS_Tick_Handler
vmihalcut 0:fdfe93cb9255 364
vmihalcut 0:fdfe93cb9255 365
vmihalcut 0:fdfe93cb9255 366 .end
vmihalcut 0:fdfe93cb9255 367
vmihalcut 0:fdfe93cb9255 368 /*----------------------------------------------------------------------------
vmihalcut 0:fdfe93cb9255 369 * end of file
vmihalcut 0:fdfe93cb9255 370 *---------------------------------------------------------------------------*/