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