1: 问题现象 在STM32F103RCT6运行uCOS_II应用程序,发现一个奇怪的问题,就是将一个任务的栈由64改为512,导致程序跑飞。 OS_STK SysLedTaskStk[64]; // OK OS_STK SysLedTaskStk[512]; // Not OK 2: 问题分析 开始以为是栈溢出,但把任务的栈增大,同时把系统栈也增大,问题依然存在,因此不应该是栈溢出的问题,而是内存越界的问题。 3:问题原因 STM32F103的栈是从大往小的,即从高地址往低地址,且OS_STK的数据类型为int,因此任务的栈指针为SysLedTaskStk的最后一个元素的地址。 &SysLedTaskStk[512 - 1],错误代码为: OSTaskCreate((void (*)(void *))SysLed_App_Task, NULL, (OS_STK *)&SysLedTaskStk[sizeof(SysLedTaskStk)- 1], APP_SYS_LED_TASK_PRIO); 4: 解决办法 OSTaskCreate((void (*)(void *))SysLed_App_Task, NULL, (OS_STK *)&SysLedTaskStk[sizeof(SysLedTaskStk)/sizeof(SysLedTaskStk[0])- 1], APP_SYS_LED_TASK_PRIO); 或者 \#define APP_SYS_LED_TASK_STK_SIZE 512 OSTaskCreate((void (*)(void *))SysLed_App_Task, NULL, (OS_STK *)&SysLedTaskStk[APP_SYS_LED_TASK_STK_SIZE - 1], APP_SYS_LED_TASK_PRIO);

标签: none

评论已关闭