我通过以下方式在任务内创建元素列表:
l = (dllist*)pvPortMalloc(sizeof(dllist));
dllist 大小为 32 字节。 我的嵌入式系统有 60kB SRAM,所以我希望系统可以轻松处理我的 200 个元素列表。我发现在为 8 个元素分配空间后,系统在第 9 个 malloc 函数调用(256byte+)时崩溃。
如果可能的话,我可以在哪里更改 freeRTOS 内的堆大小? 我可以以某种方式请求堆大小的当前状态吗? 我在文档中找不到此信息,因此我希望有人可以提供有关此问题的一些见解。 提前致谢!
最佳答案
(是 - FreeRTOS pvPortMalloc() 返回 void*。)
如果您有 60K 的 SRAM,并且 configTOTAL_HEAP_SIZE 很大,那么在分配 256 字节后您不太可能用完堆除非您之前几乎没有剩余的堆。许多 FreeRTOS 演示将继续创建对象,直到使用所有堆,因此,如果您的应用程序基于其中之一,那么在执行代码之前堆将不足。您可能还做过一些事情,例如通过创建具有巨大堆栈的任务来耗尽堆空间的负载。
heap_4 和 heap_5 将合并相邻的 block ,这将尽可能减少碎片,但我认为这不会成为您的问题 - 特别是当您没有提到在任何地方释放任何内容时。
除非您使用 heap_3.c(它只是使标准 C 库 malloc 和 free 线程安全),否则您可以调用 xPortGetFreeHeapSize() 来查看您有多少可用堆。您还可以使用 xPortGetMinimumEverFreeHeapSize() 来查询您距离耗尽堆的程度。更多信息:http://www.freertos.org/a00111.html
您还可以定义 malloc() 失败 Hook ( http://www.freertos.org/a00016.html ) 以获取 pvPortMalloc() 返回 NULL 的即时通知。
关于embedded - 如何更改 FreeRTOS 中任务的最大可用堆大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52505608/