再论FreeRTOS中的configTOTAL_HEAP_SIZE
关于任务栈和系统栈的基础知识,可以参考之前的随笔。(点击这里)
这里再次说明:#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
这个宏,官方文档解释:
FreeRTOS堆中可用的RAM总量。
只有在configSUPPORT_DYNAMIC_ALLOCATION设置为1并且应用程序使用FreeRTOS源代码下载中提供的一个示例内存分配方案时(heap1,2,3,4,5.c源文件,这里我使用的是heap4),才会使用此值。有关详细信息,请参阅内存分配部分。
我全局搜索工程,并没有发现configSUPPORT_DYNAMIC_ALLOCATION这个宏,然后,直接看官方解释:
现在我们知道了,这个宏不定义,默认是1,即启用状态。
具体的configTOTAL_HEAP_SIZE 需要分配多大,确实没有一个简单可行的方式,但是,当我们遇到程序莫名崩溃或者卡死的时候,先试试把configTOTAL_HEAP_SIZE 的大小增大试试看。就在上一个项目中,我增加了一个任务中的几百行代码,然后发现我的系统会出现崩溃情况,我试着把
任务栈从512提高到1024,依然还是出现崩溃,再然后,我明白不是任务栈的大小问题,但应该就是某个内存分配出了问题(当然,这是建立在我已经检查过代码没有非法操作的情况下),最后,我试着把configTOTAL_HEAP_SIZE 改成20* 1024,果然,立马系统正常运行了。
这说明确实是RAM不够用了,特此记录。
期间还遇到了一个问题,keil 5.20中,使用结构体内存强制一字节对齐之后,出现访问数据错误。一个全局变量的结构体,第一个元素默认是0,但是我取出来访问居然是一个随机值。例子和具体解决方法待续。。。
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |