我通过以下方式在任务中创建元素列表:
l = (dllist*)pvPortMalloc(sizeof(dllist));
dlllist 有 32 字节大。
我的嵌入式系统有 60kB SRAM,所以我希望系统可以轻松处理我的 200 个元素列表。我发现在为 8 个元素分配空间后,系统在第 9 个 malloc 函数调用(256byte+)时崩溃。
如果可能的话,我可以在哪里更改 freeRTOS 内的堆大小?
我可以以某种方式请求堆大小的当前状态吗?
我在文档中找不到此信息,因此我希望有人可以提供有关此问题的一些见解。
提前致谢!
(是 - FreeRTOS pvPortMalloc() 返回 void*。)
如果您有 60K 的 SRAM,并且 configTOTAL_HEAP_SIZE 很大,那么在分配 256 字节后不太可能耗尽堆unless你手头几乎没有剩下任何堆。许多 FreeRTOS 演示将继续创建对象,直到使用所有堆,因此如果您的应用程序基于其中之一,那么在执行代码之前堆将不足。您可能还做过一些事情,例如通过创建具有巨大堆栈的任务来耗尽堆空间的负载。
heap_4 和 heap_5 将合并相邻的块,这将尽可能减少碎片,但我认为这不会成为您的问题 - 特别是当您没有提到在任何地方释放任何内容时。
除非您使用 heap_3.c(它只是使标准 C 库 malloc 和 free 线程安全),否则您可以调用 xPortGetFreeHeapSize() 来查看您有多少可用堆。您还可以使用 xPortGetMinimumEverFreeHeapSize() 来查询您距离耗尽堆的程度。更多信息:http://www.freertos.org/a00111.html
您还可以定义 malloc() 失败挂钩(http://www.freertos.org/a00016.html) 以获得 pvPortMalloc() 返回 NULL 的即时通知。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)