Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.

Upstream: https://github.com/ARMmbed/DAPLink

Committer:
Pawel Zarembski
Date:
Tue Apr 07 12:55:42 2020 +0200
Revision:
0:01f31e923fe2
hani: DAPLink with reset workaround

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:01f31e923fe2 1 /**
Pawel Zarembski 0:01f31e923fe2 2 * @file HAL_CM3.c
Pawel Zarembski 0:01f31e923fe2 3 * @brief HAL for Cortex-M4
Pawel Zarembski 0:01f31e923fe2 4 *
Pawel Zarembski 0:01f31e923fe2 5 * DAPLink Interface Firmware
Pawel Zarembski 0:01f31e923fe2 6 * Copyright (c) 2009-2016, ARM Limited, All Rights Reserved
Pawel Zarembski 0:01f31e923fe2 7 * SPDX-License-Identifier: Apache-2.0
Pawel Zarembski 0:01f31e923fe2 8 *
Pawel Zarembski 0:01f31e923fe2 9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
Pawel Zarembski 0:01f31e923fe2 10 * not use this file except in compliance with the License.
Pawel Zarembski 0:01f31e923fe2 11 * You may obtain a copy of the License at
Pawel Zarembski 0:01f31e923fe2 12 *
Pawel Zarembski 0:01f31e923fe2 13 * http://www.apache.org/licenses/LICENSE-2.0
Pawel Zarembski 0:01f31e923fe2 14 *
Pawel Zarembski 0:01f31e923fe2 15 * Unless required by applicable law or agreed to in writing, software
Pawel Zarembski 0:01f31e923fe2 16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Pawel Zarembski 0:01f31e923fe2 17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Pawel Zarembski 0:01f31e923fe2 18 * See the License for the specific language governing permissions and
Pawel Zarembski 0:01f31e923fe2 19 * limitations under the License.
Pawel Zarembski 0:01f31e923fe2 20 */
Pawel Zarembski 0:01f31e923fe2 21
Pawel Zarembski 0:01f31e923fe2 22 #include "rt_TypeDef.h"
Pawel Zarembski 0:01f31e923fe2 23 #include "RTX_Config.h"
Pawel Zarembski 0:01f31e923fe2 24 #include "rt_System.h"
Pawel Zarembski 0:01f31e923fe2 25 #include "rt_HAL_CM.h"
Pawel Zarembski 0:01f31e923fe2 26 #include "rt_Task.h"
Pawel Zarembski 0:01f31e923fe2 27 #include "rt_List.h"
Pawel Zarembski 0:01f31e923fe2 28 #include "rt_MemBox.h"
Pawel Zarembski 0:01f31e923fe2 29
Pawel Zarembski 0:01f31e923fe2 30
Pawel Zarembski 0:01f31e923fe2 31 /*----------------------------------------------------------------------------
Pawel Zarembski 0:01f31e923fe2 32 * Global Variables
Pawel Zarembski 0:01f31e923fe2 33 *---------------------------------------------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 34
Pawel Zarembski 0:01f31e923fe2 35 BIT dbg_msg;
Pawel Zarembski 0:01f31e923fe2 36
Pawel Zarembski 0:01f31e923fe2 37 /*----------------------------------------------------------------------------
Pawel Zarembski 0:01f31e923fe2 38 * Functions
Pawel Zarembski 0:01f31e923fe2 39 *---------------------------------------------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 40
Pawel Zarembski 0:01f31e923fe2 41
Pawel Zarembski 0:01f31e923fe2 42 /*--------------------------- rt_set_PSP ------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 43
Pawel Zarembski 0:01f31e923fe2 44 __asm void rt_set_PSP (U32 stack) {
Pawel Zarembski 0:01f31e923fe2 45 MSR PSP,R0
Pawel Zarembski 0:01f31e923fe2 46 BX LR
Pawel Zarembski 0:01f31e923fe2 47 }
Pawel Zarembski 0:01f31e923fe2 48
Pawel Zarembski 0:01f31e923fe2 49
Pawel Zarembski 0:01f31e923fe2 50 /*--------------------------- rt_get_PSP ------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 51
Pawel Zarembski 0:01f31e923fe2 52 __asm U32 rt_get_PSP (void) {
Pawel Zarembski 0:01f31e923fe2 53 MRS R0,PSP
Pawel Zarembski 0:01f31e923fe2 54 BX LR
Pawel Zarembski 0:01f31e923fe2 55 }
Pawel Zarembski 0:01f31e923fe2 56
Pawel Zarembski 0:01f31e923fe2 57
Pawel Zarembski 0:01f31e923fe2 58 /*--------------------------- os_set_env ------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 59
Pawel Zarembski 0:01f31e923fe2 60 __asm void os_set_env (void) {
Pawel Zarembski 0:01f31e923fe2 61 /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
Pawel Zarembski 0:01f31e923fe2 62 MOV R0,SP ; PSP = MSP
Pawel Zarembski 0:01f31e923fe2 63 MSR PSP,R0
Pawel Zarembski 0:01f31e923fe2 64 LDR R0,=__cpp(&os_flags)
Pawel Zarembski 0:01f31e923fe2 65 LDRB R0,[R0]
Pawel Zarembski 0:01f31e923fe2 66 LSLS R0,#31
Pawel Zarembski 0:01f31e923fe2 67 MOVNE R0,#0x02 ; Privileged Thread mode, use PSP
Pawel Zarembski 0:01f31e923fe2 68 MOVEQ R0,#0x03 ; Unprivileged Thread mode, use PSP
Pawel Zarembski 0:01f31e923fe2 69 MSR CONTROL,R0
Pawel Zarembski 0:01f31e923fe2 70 BX LR
Pawel Zarembski 0:01f31e923fe2 71
Pawel Zarembski 0:01f31e923fe2 72 ALIGN
Pawel Zarembski 0:01f31e923fe2 73 }
Pawel Zarembski 0:01f31e923fe2 74
Pawel Zarembski 0:01f31e923fe2 75
Pawel Zarembski 0:01f31e923fe2 76 /*--------------------------- _alloc_box ------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 77
Pawel Zarembski 0:01f31e923fe2 78 __asm void *_alloc_box (void *box_mem) {
Pawel Zarembski 0:01f31e923fe2 79 /* Function wrapper for Unprivileged/Privileged mode. */
Pawel Zarembski 0:01f31e923fe2 80 LDR R12,=__cpp(rt_alloc_box)
Pawel Zarembski 0:01f31e923fe2 81 MRS R3,IPSR
Pawel Zarembski 0:01f31e923fe2 82 LSLS R3,#24
Pawel Zarembski 0:01f31e923fe2 83 BXNE R12
Pawel Zarembski 0:01f31e923fe2 84 MRS R3,CONTROL
Pawel Zarembski 0:01f31e923fe2 85 LSLS R3,#31
Pawel Zarembski 0:01f31e923fe2 86 BXEQ R12
Pawel Zarembski 0:01f31e923fe2 87 SVC 0
Pawel Zarembski 0:01f31e923fe2 88 BX LR
Pawel Zarembski 0:01f31e923fe2 89
Pawel Zarembski 0:01f31e923fe2 90 ALIGN
Pawel Zarembski 0:01f31e923fe2 91 }
Pawel Zarembski 0:01f31e923fe2 92
Pawel Zarembski 0:01f31e923fe2 93
Pawel Zarembski 0:01f31e923fe2 94 /*--------------------------- _free_box -------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 95
Pawel Zarembski 0:01f31e923fe2 96 __asm int _free_box (void *box_mem, void *box) {
Pawel Zarembski 0:01f31e923fe2 97 /* Function wrapper for Unprivileged/Privileged mode. */
Pawel Zarembski 0:01f31e923fe2 98 LDR R12,=__cpp(rt_free_box)
Pawel Zarembski 0:01f31e923fe2 99 MRS R3,IPSR
Pawel Zarembski 0:01f31e923fe2 100 LSLS R3,#24
Pawel Zarembski 0:01f31e923fe2 101 BXNE R12
Pawel Zarembski 0:01f31e923fe2 102 MRS R3,CONTROL
Pawel Zarembski 0:01f31e923fe2 103 LSLS R3,#31
Pawel Zarembski 0:01f31e923fe2 104 BXEQ R12
Pawel Zarembski 0:01f31e923fe2 105 SVC 0
Pawel Zarembski 0:01f31e923fe2 106 BX LR
Pawel Zarembski 0:01f31e923fe2 107
Pawel Zarembski 0:01f31e923fe2 108 ALIGN
Pawel Zarembski 0:01f31e923fe2 109 }
Pawel Zarembski 0:01f31e923fe2 110
Pawel Zarembski 0:01f31e923fe2 111
Pawel Zarembski 0:01f31e923fe2 112 /*-------------------------- SVC_Handler ------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 113
Pawel Zarembski 0:01f31e923fe2 114 __asm void SVC_Handler (void) {
Pawel Zarembski 0:01f31e923fe2 115 PRESERVE8
Pawel Zarembski 0:01f31e923fe2 116
Pawel Zarembski 0:01f31e923fe2 117 #ifdef IFX_XMC4XXX
Pawel Zarembski 0:01f31e923fe2 118 EXPORT SVC_Handler_Veneer
Pawel Zarembski 0:01f31e923fe2 119 SVC_Handler_Veneer
Pawel Zarembski 0:01f31e923fe2 120 #endif
Pawel Zarembski 0:01f31e923fe2 121
Pawel Zarembski 0:01f31e923fe2 122 IMPORT SVC_Count
Pawel Zarembski 0:01f31e923fe2 123 IMPORT SVC_Table
Pawel Zarembski 0:01f31e923fe2 124 IMPORT rt_stk_check
Pawel Zarembski 0:01f31e923fe2 125
Pawel Zarembski 0:01f31e923fe2 126 MRS R0,PSP ; Read PSP
Pawel Zarembski 0:01f31e923fe2 127 LDR R1,[R0,#24] ; Read Saved PC from Stack
Pawel Zarembski 0:01f31e923fe2 128 LDRB R1,[R1,#-2] ; Load SVC Number
Pawel Zarembski 0:01f31e923fe2 129 CBNZ R1,SVC_User
Pawel Zarembski 0:01f31e923fe2 130
Pawel Zarembski 0:01f31e923fe2 131 PUSH {R4,LR} ; Save EXC_RETURN
Pawel Zarembski 0:01f31e923fe2 132 LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
Pawel Zarembski 0:01f31e923fe2 133 BLX R12 ; Call SVC Function
Pawel Zarembski 0:01f31e923fe2 134 POP {R4,LR} ; Restore EXC_RETURN
Pawel Zarembski 0:01f31e923fe2 135
Pawel Zarembski 0:01f31e923fe2 136 MRS R12,PSP ; Read PSP
Pawel Zarembski 0:01f31e923fe2 137 LDR R3,=__cpp(&os_tsk)
Pawel Zarembski 0:01f31e923fe2 138 LDM R3,{R1,R2} ; os_tsk.run, os_tsk.new
Pawel Zarembski 0:01f31e923fe2 139 CMP R1,R2
Pawel Zarembski 0:01f31e923fe2 140 BEQ SVC_Exit ; no task switch
Pawel Zarembski 0:01f31e923fe2 141
Pawel Zarembski 0:01f31e923fe2 142 CBZ R1,SVC_Restore ; Runtask deleted?
Pawel Zarembski 0:01f31e923fe2 143
Pawel Zarembski 0:01f31e923fe2 144 PUSH {R2,R3}
Pawel Zarembski 0:01f31e923fe2 145 TST LR,#0x10 ; is it extended frame?
Pawel Zarembski 0:01f31e923fe2 146 VSTMDBEQ R12!,{S16-S31} ; yes, stack also VFP hi-regs
Pawel Zarembski 0:01f31e923fe2 147 MOVEQ R3,#0x03 ; os_tsk->ret_upd val
Pawel Zarembski 0:01f31e923fe2 148 MOVNE R3,#0x01
Pawel Zarembski 0:01f31e923fe2 149
Pawel Zarembski 0:01f31e923fe2 150 STRB R3,[R1,#TCB_RETUPD] ; os_tsk.run->ret_upd = val
Pawel Zarembski 0:01f31e923fe2 151 STMDB R12!,{R4-R11} ; Save Old context
Pawel Zarembski 0:01f31e923fe2 152 STR R12,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
Pawel Zarembski 0:01f31e923fe2 153 BL rt_stk_check ; Check for Stack overflow
Pawel Zarembski 0:01f31e923fe2 154 POP {R2,R3}
Pawel Zarembski 0:01f31e923fe2 155
Pawel Zarembski 0:01f31e923fe2 156 SVC_Restore
Pawel Zarembski 0:01f31e923fe2 157 STR R2,[R3] ; os_tsk.run = os_tsk.new
Pawel Zarembski 0:01f31e923fe2 158
Pawel Zarembski 0:01f31e923fe2 159 LDR R12,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack
Pawel Zarembski 0:01f31e923fe2 160 LDMIA R12!,{R4-R11} ; Restore New Context
Pawel Zarembski 0:01f31e923fe2 161 LDRB R3,[R2,#TCB_RETUPD] ; Update ret_val?
Pawel Zarembski 0:01f31e923fe2 162
Pawel Zarembski 0:01f31e923fe2 163 TST R3,#0x02 ; VFP Active?
Pawel Zarembski 0:01f31e923fe2 164 VLDMIANE R12!,{S16-S31} ; restore VFP hi-registers
Pawel Zarembski 0:01f31e923fe2 165 MVNNE LR,#:NOT:0xFFFFFFED ; set EXC_RETURN value
Pawel Zarembski 0:01f31e923fe2 166 MVNEQ LR,#:NOT:0xFFFFFFFD
Pawel Zarembski 0:01f31e923fe2 167 MSR PSP,R12 ; Write PSP
Pawel Zarembski 0:01f31e923fe2 168
Pawel Zarembski 0:01f31e923fe2 169 TST R3,#0x01
Pawel Zarembski 0:01f31e923fe2 170 #ifdef IFX_XMC4XXX
Pawel Zarembski 0:01f31e923fe2 171 PUSHEQ {LR}
Pawel Zarembski 0:01f31e923fe2 172 POPEQ {PC}
Pawel Zarembski 0:01f31e923fe2 173 #else
Pawel Zarembski 0:01f31e923fe2 174 BXEQ LR ; RETI
Pawel Zarembski 0:01f31e923fe2 175 #endif
Pawel Zarembski 0:01f31e923fe2 176
Pawel Zarembski 0:01f31e923fe2 177 LDRB R0,[R2,#TCB_RETVAL] ; Write os_tsk.new->ret_val
Pawel Zarembski 0:01f31e923fe2 178 SVC_Exit
Pawel Zarembski 0:01f31e923fe2 179 STR R0,[R12] ; Function return value
Pawel Zarembski 0:01f31e923fe2 180 #ifdef IFX_XMC4XXX
Pawel Zarembski 0:01f31e923fe2 181 PUSH {LR}
Pawel Zarembski 0:01f31e923fe2 182 POP {PC}
Pawel Zarembski 0:01f31e923fe2 183 #else
Pawel Zarembski 0:01f31e923fe2 184 BX LR
Pawel Zarembski 0:01f31e923fe2 185 #endif
Pawel Zarembski 0:01f31e923fe2 186
Pawel Zarembski 0:01f31e923fe2 187 /*------------------- User SVC ------------------------------*/
Pawel Zarembski 0:01f31e923fe2 188
Pawel Zarembski 0:01f31e923fe2 189 SVC_User
Pawel Zarembski 0:01f31e923fe2 190 PUSH {R4,LR} ; Save Registers
Pawel Zarembski 0:01f31e923fe2 191 LDR R2,=SVC_Count
Pawel Zarembski 0:01f31e923fe2 192 LDR R2,[R2]
Pawel Zarembski 0:01f31e923fe2 193 CMP R1,R2
Pawel Zarembski 0:01f31e923fe2 194 BHI SVC_Done ; Overflow
Pawel Zarembski 0:01f31e923fe2 195
Pawel Zarembski 0:01f31e923fe2 196 LDR R4,=SVC_Table-4
Pawel Zarembski 0:01f31e923fe2 197 LDR R4,[R4,R1,LSL #2] ; Load SVC Function Address
Pawel Zarembski 0:01f31e923fe2 198
Pawel Zarembski 0:01f31e923fe2 199 LDM R0,{R0-R3,R12} ; Read R0-R3,R12 from stack
Pawel Zarembski 0:01f31e923fe2 200 BLX R4 ; Call SVC Function
Pawel Zarembski 0:01f31e923fe2 201
Pawel Zarembski 0:01f31e923fe2 202 MRS R12,PSP
Pawel Zarembski 0:01f31e923fe2 203 STM R12,{R0-R3} ; Function return values
Pawel Zarembski 0:01f31e923fe2 204 SVC_Done
Pawel Zarembski 0:01f31e923fe2 205 POP {R4,PC} ; RETI
Pawel Zarembski 0:01f31e923fe2 206
Pawel Zarembski 0:01f31e923fe2 207 ALIGN
Pawel Zarembski 0:01f31e923fe2 208 }
Pawel Zarembski 0:01f31e923fe2 209
Pawel Zarembski 0:01f31e923fe2 210
Pawel Zarembski 0:01f31e923fe2 211 /*-------------------------- PendSV_Handler ---------------------------------*/
Pawel Zarembski 0:01f31e923fe2 212
Pawel Zarembski 0:01f31e923fe2 213 __asm void PendSV_Handler (void) {
Pawel Zarembski 0:01f31e923fe2 214 PRESERVE8
Pawel Zarembski 0:01f31e923fe2 215
Pawel Zarembski 0:01f31e923fe2 216 #ifdef IFX_XMC4XXX
Pawel Zarembski 0:01f31e923fe2 217 EXPORT PendSV_Handler_Veneer
Pawel Zarembski 0:01f31e923fe2 218 PendSV_Handler_Veneer
Pawel Zarembski 0:01f31e923fe2 219 #endif
Pawel Zarembski 0:01f31e923fe2 220
Pawel Zarembski 0:01f31e923fe2 221 PUSH {R4,LR} ; Save EXC_RETURN
Pawel Zarembski 0:01f31e923fe2 222 BL __cpp(rt_pop_req)
Pawel Zarembski 0:01f31e923fe2 223
Pawel Zarembski 0:01f31e923fe2 224 Sys_Switch
Pawel Zarembski 0:01f31e923fe2 225 POP {R4,LR} ; Restore EXC_RETURN
Pawel Zarembski 0:01f31e923fe2 226
Pawel Zarembski 0:01f31e923fe2 227 LDR R3,=__cpp(&os_tsk)
Pawel Zarembski 0:01f31e923fe2 228 LDM R3,{R1,R2} ; os_tsk.run, os_tsk.new
Pawel Zarembski 0:01f31e923fe2 229 CMP R1,R2
Pawel Zarembski 0:01f31e923fe2 230 #ifdef IFX_XMC4XXX
Pawel Zarembski 0:01f31e923fe2 231 PUSHEQ {LR}
Pawel Zarembski 0:01f31e923fe2 232 POPEQ {PC}
Pawel Zarembski 0:01f31e923fe2 233 #else
Pawel Zarembski 0:01f31e923fe2 234 BXEQ LR ; RETI, no task switch
Pawel Zarembski 0:01f31e923fe2 235 #endif
Pawel Zarembski 0:01f31e923fe2 236
Pawel Zarembski 0:01f31e923fe2 237 PUSH {R2,R3}
Pawel Zarembski 0:01f31e923fe2 238 MRS R12,PSP ; Read PSP
Pawel Zarembski 0:01f31e923fe2 239 TST LR,#0x10 ; is it extended frame?
Pawel Zarembski 0:01f31e923fe2 240 VSTMDBEQ R12!,{S16-S31} ; yes, stack also VFP hi-regs
Pawel Zarembski 0:01f31e923fe2 241 MOVEQ R3,#0x02 ; os_tsk->ret_upd val
Pawel Zarembski 0:01f31e923fe2 242 MOVNE R3,#0x00
Pawel Zarembski 0:01f31e923fe2 243
Pawel Zarembski 0:01f31e923fe2 244 STRB R3,[R1,#TCB_RETUPD] ; os_tsk.run->ret_upd = 0
Pawel Zarembski 0:01f31e923fe2 245 STMDB R12!,{R4-R11} ; Save Old context
Pawel Zarembski 0:01f31e923fe2 246 STR R12,[R1,#TCB_TSTACK] ; Update os_tsk.run->tsk_stack
Pawel Zarembski 0:01f31e923fe2 247 BL rt_stk_check ; Check for Stack overflow
Pawel Zarembski 0:01f31e923fe2 248
Pawel Zarembski 0:01f31e923fe2 249 POP {R2,R3}
Pawel Zarembski 0:01f31e923fe2 250 STR R2,[R3] ; os_tsk.run = os_tsk.new
Pawel Zarembski 0:01f31e923fe2 251
Pawel Zarembski 0:01f31e923fe2 252 LDR R12,[R2,#TCB_TSTACK] ; os_tsk.new->tsk_stack
Pawel Zarembski 0:01f31e923fe2 253 LDMIA R12!,{R4-R11} ; Restore New Context
Pawel Zarembski 0:01f31e923fe2 254 LDRB R3,[R2,#TCB_RETUPD] ; Update ret_val?
Pawel Zarembski 0:01f31e923fe2 255
Pawel Zarembski 0:01f31e923fe2 256 TST R3,#0x02 ; VFP Active?
Pawel Zarembski 0:01f31e923fe2 257 VLDMIANE R12!,{S16-S31} ; restore VFP hi-regs
Pawel Zarembski 0:01f31e923fe2 258 MVNNE LR,#:NOT:0xFFFFFFED ; set EXC_RETURN value
Pawel Zarembski 0:01f31e923fe2 259 MVNEQ LR,#:NOT:0xFFFFFFFD
Pawel Zarembski 0:01f31e923fe2 260 MSR PSP,R12 ; Write PSP
Pawel Zarembski 0:01f31e923fe2 261
Pawel Zarembski 0:01f31e923fe2 262 TST R3,#0x01
Pawel Zarembski 0:01f31e923fe2 263 LDRBNE R3,[R2,#TCB_RETVAL] ; Write os_tsk.new->ret_val
Pawel Zarembski 0:01f31e923fe2 264 STRNE R3,[R12]
Pawel Zarembski 0:01f31e923fe2 265 #ifdef IFX_XMC4XXX
Pawel Zarembski 0:01f31e923fe2 266 PUSH {LR}
Pawel Zarembski 0:01f31e923fe2 267 POP {PC}
Pawel Zarembski 0:01f31e923fe2 268 #else
Pawel Zarembski 0:01f31e923fe2 269 BX LR ; Return to Thread Mode
Pawel Zarembski 0:01f31e923fe2 270 #endif
Pawel Zarembski 0:01f31e923fe2 271
Pawel Zarembski 0:01f31e923fe2 272 ALIGN
Pawel Zarembski 0:01f31e923fe2 273 }
Pawel Zarembski 0:01f31e923fe2 274
Pawel Zarembski 0:01f31e923fe2 275
Pawel Zarembski 0:01f31e923fe2 276 /*-------------------------- SysTick_Handler --------------------------------*/
Pawel Zarembski 0:01f31e923fe2 277
Pawel Zarembski 0:01f31e923fe2 278 __asm void SysTick_Handler (void) {
Pawel Zarembski 0:01f31e923fe2 279 PRESERVE8
Pawel Zarembski 0:01f31e923fe2 280
Pawel Zarembski 0:01f31e923fe2 281 #ifdef IFX_XMC4XXX
Pawel Zarembski 0:01f31e923fe2 282 EXPORT SysTick_Handler_Veneer
Pawel Zarembski 0:01f31e923fe2 283 SysTick_Handler_Veneer
Pawel Zarembski 0:01f31e923fe2 284 #endif
Pawel Zarembski 0:01f31e923fe2 285
Pawel Zarembski 0:01f31e923fe2 286 PUSH {R4,LR} ; Save EXC_RETURN
Pawel Zarembski 0:01f31e923fe2 287 BL __cpp(rt_systick)
Pawel Zarembski 0:01f31e923fe2 288 B Sys_Switch
Pawel Zarembski 0:01f31e923fe2 289
Pawel Zarembski 0:01f31e923fe2 290 ALIGN
Pawel Zarembski 0:01f31e923fe2 291 }
Pawel Zarembski 0:01f31e923fe2 292
Pawel Zarembski 0:01f31e923fe2 293
Pawel Zarembski 0:01f31e923fe2 294 /*-------------------------- OS_Tick_Handler --------------------------------*/
Pawel Zarembski 0:01f31e923fe2 295
Pawel Zarembski 0:01f31e923fe2 296 __asm void OS_Tick_Handler (void) {
Pawel Zarembski 0:01f31e923fe2 297 PRESERVE8
Pawel Zarembski 0:01f31e923fe2 298
Pawel Zarembski 0:01f31e923fe2 299 PUSH {R4,LR} ; Save EXC_RETURN
Pawel Zarembski 0:01f31e923fe2 300 BL __cpp(os_tick_irqack)
Pawel Zarembski 0:01f31e923fe2 301 BL __cpp(rt_systick)
Pawel Zarembski 0:01f31e923fe2 302 B Sys_Switch
Pawel Zarembski 0:01f31e923fe2 303
Pawel Zarembski 0:01f31e923fe2 304 ALIGN
Pawel Zarembski 0:01f31e923fe2 305 }
Pawel Zarembski 0:01f31e923fe2 306
Pawel Zarembski 0:01f31e923fe2 307
Pawel Zarembski 0:01f31e923fe2 308 /*--------------------------- rt_init_stack ---------------------------------*/
Pawel Zarembski 0:01f31e923fe2 309
Pawel Zarembski 0:01f31e923fe2 310 void rt_init_stack (P_TCB p_TCB, FUNCP task_body) {
Pawel Zarembski 0:01f31e923fe2 311 /* Prepare TCB and saved context for a first time start of a task. */
Pawel Zarembski 0:01f31e923fe2 312 U32 *stk,i,size;
Pawel Zarembski 0:01f31e923fe2 313
Pawel Zarembski 0:01f31e923fe2 314 /* Prepare a complete interrupt frame for first task start */
Pawel Zarembski 0:01f31e923fe2 315 size = p_TCB->priv_stack >> 2;
Pawel Zarembski 0:01f31e923fe2 316 if (size == 0) {
Pawel Zarembski 0:01f31e923fe2 317 size = (U16)os_stackinfo >> 2;
Pawel Zarembski 0:01f31e923fe2 318 }
Pawel Zarembski 0:01f31e923fe2 319
Pawel Zarembski 0:01f31e923fe2 320 /* Write to the top of stack. */
Pawel Zarembski 0:01f31e923fe2 321 stk = &p_TCB->stack[size];
Pawel Zarembski 0:01f31e923fe2 322
Pawel Zarembski 0:01f31e923fe2 323 /* Auto correct to 8-byte stack alignment. */
Pawel Zarembski 0:01f31e923fe2 324 if ((U32)stk & 0x04) {
Pawel Zarembski 0:01f31e923fe2 325 stk--;
Pawel Zarembski 0:01f31e923fe2 326 }
Pawel Zarembski 0:01f31e923fe2 327
Pawel Zarembski 0:01f31e923fe2 328 stk -= 16;
Pawel Zarembski 0:01f31e923fe2 329
Pawel Zarembski 0:01f31e923fe2 330 /* Default xPSR and initial PC */
Pawel Zarembski 0:01f31e923fe2 331 stk[15] = INITIAL_xPSR;
Pawel Zarembski 0:01f31e923fe2 332 stk[14] = (U32)task_body;
Pawel Zarembski 0:01f31e923fe2 333
Pawel Zarembski 0:01f31e923fe2 334 /* Clear R1-R12,LR registers. */
Pawel Zarembski 0:01f31e923fe2 335 for (i = 0; i < 14; i++) {
Pawel Zarembski 0:01f31e923fe2 336 stk[i] = 0;
Pawel Zarembski 0:01f31e923fe2 337 }
Pawel Zarembski 0:01f31e923fe2 338
Pawel Zarembski 0:01f31e923fe2 339 /* Assign a void pointer to R0. */
Pawel Zarembski 0:01f31e923fe2 340 stk[8] = (U32)p_TCB->msg;
Pawel Zarembski 0:01f31e923fe2 341
Pawel Zarembski 0:01f31e923fe2 342 /* Initial Task stack pointer. */
Pawel Zarembski 0:01f31e923fe2 343 p_TCB->tsk_stack = (U32)stk;
Pawel Zarembski 0:01f31e923fe2 344
Pawel Zarembski 0:01f31e923fe2 345 /* Task entry point. */
Pawel Zarembski 0:01f31e923fe2 346 p_TCB->ptask = task_body;
Pawel Zarembski 0:01f31e923fe2 347
Pawel Zarembski 0:01f31e923fe2 348 /* Set a magic word for checking of stack overflow. */
Pawel Zarembski 0:01f31e923fe2 349 p_TCB->stack[0] = MAGIC_WORD;
Pawel Zarembski 0:01f31e923fe2 350 }
Pawel Zarembski 0:01f31e923fe2 351
Pawel Zarembski 0:01f31e923fe2 352
Pawel Zarembski 0:01f31e923fe2 353 /*--------------------------- dbg_init --------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 354
Pawel Zarembski 0:01f31e923fe2 355 void dbg_init (void) {
Pawel Zarembski 0:01f31e923fe2 356 if ((DEMCR & DEMCR_TRCENA) &&
Pawel Zarembski 0:01f31e923fe2 357 (ITM_CONTROL & ITM_ITMENA) &&
Pawel Zarembski 0:01f31e923fe2 358 (ITM_ENABLE & (1UL << 31))) {
Pawel Zarembski 0:01f31e923fe2 359 dbg_msg = __TRUE;
Pawel Zarembski 0:01f31e923fe2 360 }
Pawel Zarembski 0:01f31e923fe2 361 }
Pawel Zarembski 0:01f31e923fe2 362
Pawel Zarembski 0:01f31e923fe2 363
Pawel Zarembski 0:01f31e923fe2 364 /*--------------------------- dbg_task_notify -------------------------------*/
Pawel Zarembski 0:01f31e923fe2 365
Pawel Zarembski 0:01f31e923fe2 366 void dbg_task_notify (P_TCB p_tcb, BOOL create) {
Pawel Zarembski 0:01f31e923fe2 367 while (ITM_PORT31_U32 == 0);
Pawel Zarembski 0:01f31e923fe2 368 ITM_PORT31_U32 = (U32)p_tcb->ptask;
Pawel Zarembski 0:01f31e923fe2 369 while (ITM_PORT31_U32 == 0);
Pawel Zarembski 0:01f31e923fe2 370 ITM_PORT31_U16 = (create << 8) | p_tcb->task_id;
Pawel Zarembski 0:01f31e923fe2 371 }
Pawel Zarembski 0:01f31e923fe2 372
Pawel Zarembski 0:01f31e923fe2 373
Pawel Zarembski 0:01f31e923fe2 374 /*--------------------------- dbg_task_switch -------------------------------*/
Pawel Zarembski 0:01f31e923fe2 375
Pawel Zarembski 0:01f31e923fe2 376 void dbg_task_switch (U32 task_id) {
Pawel Zarembski 0:01f31e923fe2 377 while (ITM_PORT31_U32 == 0);
Pawel Zarembski 0:01f31e923fe2 378 ITM_PORT31_U8 = task_id;
Pawel Zarembski 0:01f31e923fe2 379 }
Pawel Zarembski 0:01f31e923fe2 380
Pawel Zarembski 0:01f31e923fe2 381
Pawel Zarembski 0:01f31e923fe2 382 /*----------------------------------------------------------------------------
Pawel Zarembski 0:01f31e923fe2 383 * end of file
Pawel Zarembski 0:01f31e923fe2 384 *---------------------------------------------------------------------------*/
Pawel Zarembski 0:01f31e923fe2 385