最近在做一个产品二代升级的项目,代码是上一任工程师留下的,很多BUG,而且融合了HAL库和LL库,以及github上下载的GSM源码,很不好用。

我这边是将2G模块换成了4G,且添加了单独的BLE模块。因此只在源码的基础上,去除2G和BLE代码部分,添加新的4G和BLE代码。

整个freeRTOS工程项目创建了4个task任务。

我是先修改了BLE任务,修改完毕后运行正常;然后一步一步添加新的4G任务代码。发现只添加4G初始化代码,4个任务都正常,但是添加业务功能代码的时候,4个任务都卡死了(一运行就立即卡死)。

 

解决方法:

1.先查看代码是否在任务调度开始前调用了系统延时函数,最后调查结果正常。

2.其次开始屏蔽4G业务代码运行,看看屏蔽哪里会使任务正常,最后发现在操作某个数组(即使是printf打印数据)的时候,导致4个任务全卡死,该数组为局部变量。

3.经过查找,发现在该任务之外的c文件中,定义了一个同名的全局数组。将该数组更改后,目前4个任务都能正常运行。

 

后续:

1.正常运行一段时间后,任务再次全部卡死。(有待解决)

 

解决方法:

1.单独运行4G任务,正常。

2.进行单步调试,发现是HardFault_Handler错误。找到出错的地方,尝试把函数里的局部变量数组改成全局变量,修改后程序正常。(好像是函数可重入的问题,但是我感觉不像,应该是堆栈溢出造成的,但是我的堆栈已经设置的很大了,有人知道答案的话请评论告诉我,谢谢)

 

最新更新:

1.今日闲来无事,重新阅读freeRTOS系统文档,总结出上述问题的原因:每个任务都有自己的堆栈(我是使用静态方法创建的task),由于我在任务属性初始化的时候分配的堆栈较小,而任务局部变量占用的内存过大,导致出错。(我在第二步修改的堆栈是单片机总堆栈大小,而非任务堆栈)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐