内存越界导致uCOS_II跑飞的异常现象
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);
评论已关闭