setup main thread stack for GCC toolchains

pull/6/head
Emilio Monti 2013-05-30 10:57:27 +01:00
parent f3acb6c8fd
commit 1ac73081f6
1 changed files with 14 additions and 5 deletions

View File

@ -198,8 +198,6 @@ __attribute__((used)) void _mutex_release (OS_ID *mutex) {
extern int main (void); extern int main (void);
osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 0, NULL}; osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 0, NULL};
#if defined (__CC_ARM)
// This define should be probably moved to the CMSIS layer // This define should be probably moved to the CMSIS layer
#ifdef TARGET_LPC1768 #ifdef TARGET_LPC1768
#define INITIAL_SP (0x10008000UL) #define INITIAL_SP (0x10008000UL)
@ -215,14 +213,23 @@ osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 0, NULL}
#endif #endif
extern unsigned char Image$$RW_IRAM1$$ZI$$Limit[]; #ifdef __CC_ARM
extern unsigned char Image$$RW_IRAM1$$ZI$$Limit[];
#define HEAP_START (Image$$RW_IRAM1$$ZI$$Limit)
#elif defined(__GNUC__)
extern unsigned char __HeapLimit[];
#define HEAP_START (__HeapLimit)
#endif
void set_main_stack(void) { void set_main_stack(void) {
// That is the bottom of the main stack block: no collision detection
os_thread_def_main.stack_pointer = HEAP_START;
// Leave OS_SCHEDULERSTKSIZE words for the scheduler and interrupts // Leave OS_SCHEDULERSTKSIZE words for the scheduler and interrupts
os_thread_def_main.stack_pointer = Image$$RW_IRAM1$$ZI$$Limit; os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)HEAP_START) - (OS_SCHEDULERSTKSIZE * 4);
os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)Image$$RW_IRAM1$$ZI$$Limit) - (OS_SCHEDULERSTKSIZE * 4);
} }
#if defined (__CC_ARM)
#ifdef __MICROLIB #ifdef __MICROLIB
void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF"))); void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF")));
void _main_init (void) { void _main_init (void) {
@ -316,6 +323,7 @@ __attribute ((noreturn)) void __cs3_start_c (void){
__libc_init_array (); __libc_init_array ();
osKernelInitialize(); osKernelInitialize();
set_main_stack();
osThreadCreate(&os_thread_def_main, NULL); osThreadCreate(&os_thread_def_main, NULL);
osKernelStart(); osKernelStart();
for (;;); for (;;);
@ -337,6 +345,7 @@ __attribute__((naked)) void software_init_hook (void) {
"mov r0,r4\n" "mov r0,r4\n"
"mov r1,r5\n" "mov r1,r5\n"
"bl osKernelInitialize\n" "bl osKernelInitialize\n"
"bl set_main_stack\n"
"ldr r0,=os_thread_def_main\n" "ldr r0,=os_thread_def_main\n"
"movs r1,#0\n" "movs r1,#0\n"
"bl osThreadCreate\n" "bl osThreadCreate\n"