11/*----------------------------------------------------------------------------
2- * RL-ARM - RTX
2+ * CMSIS-RTOS - RTX
33 *----------------------------------------------------------------------------
44 * Name: HAL_CM.C
55 * Purpose: Hardware Abstraction Layer for Cortex-M
6- * Rev.: V4.60
6+ * Rev.: V4.79
77 *----------------------------------------------------------------------------
88 *
9- * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
9+ * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
1010 * All rights reserved.
1111 * Redistribution and use in source and binary forms, with or without
1212 * modification, are permitted provided that the following conditions are met:
3333 *---------------------------------------------------------------------------*/
3434
3535#include "rt_TypeDef.h"
36- #include "RTX_Conf .h"
36+ #include "RTX_Config .h"
3737#include "rt_HAL_CM.h"
3838
3939
@@ -58,12 +58,15 @@ void rt_init_stack (P_TCB p_TCB, FUNCP task_body) {
5858
5959 /* Prepare a complete interrupt frame for first task start */
6060 size = p_TCB -> priv_stack >> 2 ;
61+ if (size == 0U ) {
62+ size = (U16 )os_stackinfo >> 2 ;
63+ }
6164
6265 /* Write to the top of stack. */
6366 stk = & p_TCB -> stack [size ];
6467
6568 /* Auto correct to 8-byte ARM stack alignment. */
66- if ((U32 )stk & 0x04 ) {
69+ if ((U32 )stk & 0x04U ) {
6770 stk -- ;
6871 }
6972
@@ -74,8 +77,8 @@ void rt_init_stack (P_TCB p_TCB, FUNCP task_body) {
7477 stk [14 ] = (U32 )task_body ;
7578
7679 /* Clear R4-R11,R0-R3,R12,LR registers. */
77- for (i = 0 ; i < 14 ; i ++ ) {
78- stk [i ] = 0 ;
80+ for (i = 0U ; i < 14U ; i ++ ) {
81+ stk [i ] = 0U ;
7982 }
8083
8184 /* Assign a void pointer to R0. */
@@ -87,31 +90,50 @@ void rt_init_stack (P_TCB p_TCB, FUNCP task_body) {
8790 /* Task entry point. */
8891 p_TCB -> ptask = task_body ;
8992
93+ /* Initialize stack with magic pattern. */
94+ if (os_stackinfo & 0x10000000U ) {
95+ if (size > (16U + 1U )) {
96+ for (i = ((size - 16U )/2U ) - 1U ; i ; i -- ) {
97+ stk -= 2U ;
98+ stk [1 ] = MAGIC_PATTERN ;
99+ stk [0 ] = MAGIC_PATTERN ;
100+ }
101+ if (-- stk > p_TCB -> stack ) {
102+ * stk = MAGIC_PATTERN ;
103+ }
104+ }
105+ }
106+
107+ #ifdef __MBED_CMSIS_RTOS_CM
90108 /* Set a magic word for checking of stack overflow.
91- For the main thread (ID: 0x01 ) the stack is in a memory area shared with the
109+ For the main thread (ID: 0x02 ) the stack is in a memory area shared with the
92110 heap, therefore the last word of the stack is a moving target.
93111 We want to do stack/heap collision detection instead.
94112 */
95- if (p_TCB -> task_id != 0x01 )
113+ if (p_TCB -> task_id != 0x02 )
96114 p_TCB -> stack [0 ] = MAGIC_WORD ;
115+ #else
116+ /* Set a magic word for checking of stack overflow. */
117+ p_TCB -> stack [0 ] = MAGIC_WORD ;
118+ #endif
97119}
98120
99121
100122/*--------------------------- rt_ret_val ----------------------------------*/
101123
102124static __inline U32 * rt_ret_regs (P_TCB p_TCB ) {
103125 /* Get pointer to task return value registers (R0..R3) in Stack */
104- #if (__TARGET_FPU_VFP )
126+ #if defined (__TARGET_FPU_VFP )
105127 if (p_TCB -> stack_frame ) {
106128 /* Extended Stack Frame: R4-R11,S16-S31,R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR */
107- return (U32 * )(p_TCB -> tsk_stack + 8 * 4 + 16 * 4 );
129+ return (U32 * )(p_TCB -> tsk_stack + ( 8U * 4U ) + ( 16U * 4U ) );
108130 } else {
109131 /* Basic Stack Frame: R4-R11,R0-R3,R12,LR,PC,xPSR */
110- return (U32 * )(p_TCB -> tsk_stack + 8 * 4 );
132+ return (U32 * )(p_TCB -> tsk_stack + ( 8U * 4U ) );
111133 }
112134#else
113135 /* Stack Frame: R4-R11,R0-R3,R12,LR,PC,xPSR */
114- return (U32 * )(p_TCB -> tsk_stack + 8 * 4 );
136+ return (U32 * )(p_TCB -> tsk_stack + ( 8U * 4U ) );
115137#endif
116138}
117139
@@ -135,9 +157,9 @@ void rt_ret_val2(P_TCB p_TCB, U32 v0, U32 v1) {
135157
136158#ifdef DBG_MSG
137159void dbg_init (void ) {
138- if ((DEMCR & DEMCR_TRCENA ) &&
139- (ITM_CONTROL & ITM_ITMENA ) &&
140- (ITM_ENABLE & (1UL << 31 ))) {
160+ if ((( DEMCR & DEMCR_TRCENA ) != 0U ) &&
161+ (( ITM_CONTROL & ITM_ITMENA ) != 0U ) &&
162+ (( ITM_ENABLE & (1UL << 31 )) != 0U )) {
141163 dbg_msg = __TRUE ;
142164 }
143165}
@@ -147,24 +169,22 @@ void dbg_init (void) {
147169
148170#ifdef DBG_MSG
149171void dbg_task_notify (P_TCB p_tcb , BOOL create ) {
150- while (ITM_PORT31_U32 == 0 );
172+ while (ITM_PORT31_U32 == 0U );
151173 ITM_PORT31_U32 = (U32 )p_tcb -> ptask ;
152- while (ITM_PORT31_U32 == 0 );
153- ITM_PORT31_U16 = (create << 8 ) | p_tcb -> task_id ;
174+ while (ITM_PORT31_U32 == 0U );
175+ ITM_PORT31_U16 = (U16 )(( create << 8 ) | p_tcb -> task_id ) ;
154176}
155177#endif
156178
157179/*--------------------------- dbg_task_switch -------------------------------*/
158180
159181#ifdef DBG_MSG
160182void dbg_task_switch (U32 task_id ) {
161- while (ITM_PORT31_U32 == 0 );
162- ITM_PORT31_U8 = task_id ;
183+ while (ITM_PORT31_U32 == 0U );
184+ ITM_PORT31_U8 = ( U8 ) task_id ;
163185}
164186#endif
165187
166-
167188/*----------------------------------------------------------------------------
168189 * end of file
169190 *---------------------------------------------------------------------------*/
170-
0 commit comments