embedded - 如何更改 FreeRTOS 中任务的最大可用堆大小?

标签 embedded malloc heap-memory freertos keil

我通过以下方式在任务内创建元素列表:

        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/

相关文章:

c - 试图了解 Microchip PIC16LF15344 I2C 外围引脚选择

c - 用于嵌入式设备的 soap/rest C 库

c - (char*)malloc(sizeof(char)) 导致段错误,怎么办?

scala - 增加 Scala 的 JVM 堆大小?

c - make 运行时出错。冲突的类型和先前的声明

c - 在不使用 malloc() 的情况下,下面的程序如何工作?

c - 在 C 中为具有字符指针的结构分配内存

java - 什么是 RMI TCP 连接

java - 线程中出现异常 "dispatcher-event-loop-1"java.lang.OutOfMemoryError : Java heap space

events - 检测 STM32 上的 USB 连接事件