Skip to content

Commit e422824

Browse files
committed
RTX - update to v4.79 for Cortex-M
Changes to the original kernel: Cortex-M requires to define __CMSIS_OS_RTX, and __MBED_CMSIS_RTOS_CM. The macro __MBED_CMSIS_RTOS_CM is mbed specific macro, to track changes to the kernel. This should keep us aware what has changed. For instance, one breaking change was thread adding instances variable, which were not in mbed. This can be find as it's protected via __MBED_CMSIS_RTOS_CM ifdef. ``` // added for mbed compatibility // original RTX code ``` Startup for toolchains - mbed defines own stack pointer (set_main_stack()), therefore it should be called in the startup. IAR added low level init calls and dynamic intialization to the IAR startup. All defined in RTX_CM_lib.h. The timer thread has task id 0x01, main task 0x02. There are exception for main task not to check for overflows. This is mbed specific, was reapplied from mbed code base. IAR fixed SVC calls, this fix had to be reapplied (repo mbed PR 736 for more information).
1 parent a215fe4 commit e422824

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+2250
-1258
lines changed

core/mbed-rtos/rtx/TARGET_CORTEX_M/HAL_CM.c

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
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:
@@ -33,7 +33,7 @@
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

102124
static __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
137159
void 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
149171
void 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
160182
void 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

Comments
 (0)