FreeRTOS内存管理算法选择方法

在 FreeRTOS 中,内存管理算法的选择并非通过宏定义直接切换,而是通过将对应的堆实现源文件(heap_x.c)包含到项目中来实现。以下是详细步骤和注意事项:


1. 选择内存管理算法

FreeRTOS 提供了 5 种内存管理实现(heap_1.cheap_5.c),每种的特点如下:

  • heap_1: 仅分配,不释放(适用于静态内存场景)。
  • heap_2: 支持分配和释放,但无碎片合并(已过时,推荐用 heap_4)。
  • heap_3: 封装标准库的 malloc()/free()(依赖编译器的内存管理)。
  • heap_4: 支持碎片合并,适用于长时间运行的任务。
  • heap_5: 类似 heap_4,但支持非连续内存区域(如多块物理内存)。

2. 实现步骤

(1) 将对应源文件加入工程
  • 将选定的 heap_x.c(如 heap_4.c)添加到项目编译列表中。例如:
    FreeRTOS/Source/portable/MemMang/heap_4.c
    
(2) 配置堆大小
  • FreeRTOSConfig.h 中定义堆的总大小(所有算法通用):
    #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 20 * 1024 ) ) // 20KB堆空间
    
(3) 特殊算法的额外配置
  • heap_5 需额外调用 vPortDefineHeapRegions() 初始化非连续内存区域。
  • heap_3 依赖标准库的 malloc()/free(),需确保编译器支持。

3. 关键点

  • 无选择宏定义:FreeRTOS 不通过宏定义(如 configUSE_HEAP_X)选择算法,而是通过编译对应的 heap_x.c 文件。
  • 唯一性:项目中只能包含一个 heap_x.c 文件,否则会导致链接冲突。

4. 验证方法

  • 检查项目是否包含且仅包含一个 heap_x.c
  • 调用 xPortGetFreeHeapSize() 函数,确认堆初始化和使用符合预期。

总结

通过将特定的 heap_x.c 文件加入工程,并配置 configTOTAL_HEAP_SIZE,即可选择 FreeRTOS 的内存管理算法。无需宏定义切换,但需注意不同算法的适用场景和额外配置要求。

FreeRTOS内存管理方法4是通过增加一个内存合并算法来提高内存使用效率。这种方法与前文介绍的第二种方法相似,使用一个大数组来管理内存,定义为`static uint8_t ucHeap\[configTOTAL_HEAP_SIZE\]`。在这种方法中,有三个关键函数用于内存分配和释放。首先是`pvPortMalloc`函数,用于分配内存空间。它接受一个参数`xWantedSize`,表示需要分配的内存大小。然后是`vPortFree`函数,用于释放内存空间。它接受一个参数`pv`,表示要释放的内存指针。最后是`prvInsertBlockIntoFreeList`函数,用于将相邻的小的空闲内存块合并成一个大块,以避免内存泄露。释放内存的具体实现如下所示: ```c void vPortFree(void *pv) { if (pv) { vTaskSuspendAll(); { free(pv); traceFREE(pv, 0); } (void)xTaskResumeAll(); } } ``` 这个函数首先检查传入的内存指针是否为空,然后使用`free`函数释放内存,并调用`traceFREE`函数进行内存追踪。最后,使用`vTaskSuspendAll`和`xTaskResumeAll`函数来保证在释放内存的过程中不会发生任务切换。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [基于freertos的嵌入式系统开发(六)FreeRTOS内存管理方法4](https://blog.csdn.net/cyjbj/article/details/127031092)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [FreeRTOS --(4)内存管理 heap3](https://blog.csdn.net/zhoutaopower/article/details/106677144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九层指针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值