嵌入式技术论坛
直播中

最强海贼王

9年用户 1396经验值
擅长:MEMS/传感技术
私信 关注
[问答]

更改RT-Thread任务堆栈大小导致进程任务执行结果出错该怎么解决

在使用RT-thread中,定义了一个任务进程。这个任务进程被如下定义的:

rt_thread_create("Flash",A_entry, RT_NULL,2048, 3, 10);

在这个任务进程中,启动了一个软件定时器。

rt_timer_start(&Updata_Timer); //启动更新超时的定时器

这个定时器超时了就会执行

void Updates_Timerout(void *parameter)这个函数。

问题:

我在 void Updates_Timerout(void *parameter)这个函数里面定义了一个比较大的缓冲数组 A[512];只要执行这个函数的时候,系统就会打印如下信息:

psr: 0x61000000 pc: 0x08007df2 lr: 0x08007d8d r12: 0x00000000 r03: 0x00000000 r02: 0x00000000 r01: 0x00000000 r00: 0x00000000 hard fault on thread: tidle

我尝试将 rt_thread_create(“Flash”,A_entry, RT_NULL,2048, 3, 10);中的2048Byte 改为 6KByte,但是改为6K之后,出现如下现象:

1.void Updates_Timerout(void *parameter)函数都不会得到执行。

A_entry进程任务执行结果出错,任务没有死掉,但是最终的结果不符合预期。

请教大家,这个问题该怎么解决?

回帖(4)

夏日余晖

2022-8-10 11:52:52
定时器超时函数并不在线程上下文中执行,如果需要在线程上下文中执行,请使用soft timer
举报

最强海贼王

2022-8-10 11:53:09
void Updates_Timerout(void *parameter)函数其实就是soft timer的超时执行函数。不是硬件定时器超时中断服务函数!
问题已经解决, 是因为我在void Updates_Timerout(void *parameter)这个函数定义了一个 static u16 类型变量,将这个变量类型改为 u16 类型之后,问题就消失了。
举报

夏日余晖

2022-8-10 11:53:22
问题只是被隐藏了,softtimer触发函数执行上下文是另一个线程里面rt_thread_timer_entry,你开大A_entry的stack没有意义。你需要把RT_TIMER_THREAD_STACK_SIZE定义的大一些才行。
举报

最强海贼王

2022-8-10 11:53:31
的确如此,谢谢你的提醒!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分