问题详细描述

STM32加上RTOS操作系统可以让不同的任务独立开来,相比裸机开发,RTOS的操作系统存在很多的优势,前段时间尝试着在STM32F1上移植FreeRTOS系统,已经将系统移植成功了,当时只是做了2个闪灯的验证性任务功能,保证STM32上的系统移植成功。
事实证明系统是移植成功了,后来接着在系统上做其他模块功能的开发,最开始建了7个任务,都正常运行,于是就开始建立第8个任务,代码写完了,编译页没有错,下载到开发板上前面7个任务的功能均正常运行,但是就是第八个任务始终不运行,

问题具体分析
当时也是不知道为什么就运行不起来,尝试单步调试,复位后第一次是能够进入最后一个任务的,但是第八个任务运行一次之后就无法再运行第二次。我就把其他的任务屏蔽了,值创建者一个任务,调试时发现这个任务时可以正常运行的,我尝试着一个一个任务的添加,但是都是最后一个任务无法正常运行,调换任务的先后顺序,均是最后一个任务无法启动,很是诡异。
我尝试着在百度上搜寻解决方式,很多人说到了再任务创建时需要返回值,通过返回值可以判断任务创建时成功还是失败了,我在最后一个任务上的任务创建函数加上返回值之后,在网页上一查是任务创建失败。
具体的操作手法是:
xReturn = xTaskCreate(xx,xx,xx,xx);
xReturn 是作为任务创建返回值,不同的数字代码表示不同的意思,其具体含义如下:
1:表明创建成功
2:由于内存堆空间不足,FreeRTOS 无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。
返回2 说明系统的任务没有创建成功,而且问题就是内存不住或者堆栈溢出等原因,问题定位到了,那就去寻找解决的方法。

问题解决方案
首先到RTOS的系统配置文件中,找到系统内存分配的函数
#define configTOTAL_HEAP_SIZE ((size_t)(20*1024)) //系统所有总的堆大
上面的20*1024 表示系统分配的内存空间的大小是20*1024字节的,就是分配了20K的内存,我们自爱查看了STM32F103ZET6的内存之后,由于单片机的系统内存只有64K,我们出于谨慎考虑,改成40*1024 就是分配了40K的内存空间,重新编译之后下载到电路板上,系统正常运行,最后一个任务也完美的运行了,这个困扰我很久的问题也得到了解决。:

总结和建议
总结了目前我使用RTOS的功能,总结出来遇到没法正常运行的任务时可以尝试如下办法:
1:在系统配置文件内,修改内存的大小
2:在每一个任务内,一定加上系统延时函数,保证不会因为这一个任务的死循环导致其他任务无法工作。
3:增加调试端口的打印函数,保证实时更新任务的状态,调试完成后可以省略这些打印信息。
4:任务创建一定要返回值,返回任务状态,可以更便捷的找到问题。
5:系统分配的内存绝对不能大于单片机自己的内存空间。