main 函数中定义了几个简单任务:
uint32_t main(){
#if FIX_TASK_OVERFLOW==1
rt_thread_t low_tid = rt_thread_create("task_low", task_low, RT_NULL, 1024 * 8, 6, 20);
if(low_tid){
rt_thread_startup(low_tid);
}
rt_thread_t middle_tid = rt_thread_create("task_middle", task_middle, RT_NULL, 2048, 5, 20);
if(middle_tid){
rt_thread_startup(middle_tid);
}
rt_thread_t high_tid = rt_thread_create("task_high", task_high, RT_NULL, 1024 * 8, 2, 20);
if(high_tid){
rt_thread_startup(high_tid);
}
#endif
return 0;
}
任务定义:
void task_high(void *param)
{
while(1){
rt_thread_mdelay(100);
}
}
void task_middle(void *param)
{
static uint32_t cnt = 0;
while(1){
log_d("%s: %d\r\n", __func__, cnt++);
rt_thread_mdelay(500);
}
}
void task_low(void *param)
{
static uint32_t cnt=0;
while(1){
log_d("%s: %d\r\n", __func__, cnt++);
rt_thread_mdelay(500);
}
}
跑一会出现overflow:
UART: open serial device: 0x800215cc with open flag: 0x0143
msh >[TEST]: task_low: 0
thread:task_mid stack overflow
thread pri status sp stack size max used left tick error
-------- --- ------- ---------- ---------- ------ ---------- ---
task_hig 2 suspend 0x00000088 0x00002000 02% 0x00000014 000
task_mid 5 ready 0x00004568 0x00000800 25% 0x00000014 -02
task_low 6 suspend 0x00000088 0x00002000 06% 0x00000014 000
tshell 6 suspend 0x00000094 0x00000400 56% 0x00000008 000
at_svr 1 suspend 0x000000c8 0x00000800 09% 0x00000005 000
tidle 7 ready 0x000000d0 0x00000200 40% 0x0000000e 000
timer 4 suspend 0x00000078 0x00000200 23% 0x00000009 000
我看出现问题时,出问题的任务是超时状态,堆栈指针跑到了一个不属于自身任务堆栈地址空间, 系统是我在nano的基础上移植的,是不是移植出现问题,导致sp指针不合理?
请教我应该从哪个方向找问题原因呢?