项目场景:
添加openlog的部署
前几天帮队友的代码找bug,在原有的控制代码之上,添加了两个新的freertos
任务部署了openlog
模块;
原来已经存在一些任务,其中按照代码顺序最晚被创建的是一个视觉巡逻任务,该任务是在接收到通知才会被调度
void Task_PCvisionPatrol(void *arg)
{
for(;;)
{
ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
}
}
问题描述
问题稳定复现:
根据队员的描述,他的代码加入openlog任务后,代码就会跑飞。
我在调试代码时,发现上电之后功能是正常的,只要一切换到视觉巡逻模式,就会宕机。
这个情况稳定出现,证明问题正是出现在视觉巡逻的代码上
任务创建失败
在考察任务的具体代码时,突然发现任务句柄为0x000000
反复重新debug稳定如此,证明任务句柄为空,因此可以确定此任务创建失败
具体研究任务创建函数xTaskCreate找问题
debug发现,在xTaskCreate
函数中先运行一个任务申请堆栈的函数
函数的返回值赋予给pxStack
,
pxStack
不为NULL才会正常运行后面的代码
但debug时发现我们的pxStack
就是空指针,
所以问题出现在蓝色的任务申请堆栈函数pvPortMalloc
中
继续深入到pvPortMalloc
中
这时候在函数中逐步debug
找到问题出现在这句if
代码上
图示数字为当时debug两个变量显示的数值
原因分析:
显然,这个问题的存在便就是因为任务句柄为空,那么在向该任务发通知时,便会进入断言死循环
而根本原因是在任务创建时,因为这个任务在最后被创建
而前面的任务在被创建时已经占用了大量的空间
所以这个任务申请的空间已经大于剩下的字节,导致任务未成功创建
解决方案:
节约任务栈空间的使用,将其他的任务申请的空间减小
这个任务的堆栈没必要这么大,所以我将其修改为正常大小
修改代码后再次debug, 任务创建成功,问题解决!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)