查看: 7895|回复: 4

[原创] MCUXpresso IDE: 如何查看FreeRTOS heap的使用情况

[复制链接]

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24907
最后登录
2025-7-22
发表于 2021-5-19 17:13:00 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2021-5-24 09:48 编辑

      我们的用户在使用FreeRTOS实时操作系统进行开发时,实时查看heap使用情况非常重要。本文主要讨论如何在MCUXpresso IDE里查看heap1-5的使用情况,对用户频繁出现的疑惑做出了说明。
1.    如何查看heap_3的使用情况
有些用户使用MCUXpressoIDE在查看heap_3使用时(以LPC55S69-EVK,SDK中\boards\lpcxpresso55s69\rtos_examples\freertos_hello为例),出现以下情况:
       1_information_of_heap3.png
这表明在Heap Usage窗口(菜单栏FreeRTOS=>Heap Usage)无法查看heap_3及静态内存分配方式下heap的使用。
对此,我们一个可行的workaround是在Expression窗口里(菜单栏Windows=>ShowView=>Other= >Debug=>Expression)查看heap使用。MCUXpressoIDE下查看heap_3使用的方法如下图所示:
       2_method_of_heap3.png
Used:  ((unsigned int)__end_of_heap)-((unsigned int)&_pvHeapStart)
Free:  ((unsigned int)&_pvHeapLimit)-((unsigned int)__end_of_heap)
Heap size:  ((unsigned int)&_pvHeapLimit)-((unsignedint)&_pvHeapStart)
将其导入Expression界面Debug得到以下结果:
       3_expression_of_heap3.png
2.    如何查看heap_1/2/4/5的使用情况

对于heap_1/2/4/5分配方式下heap的使用,可以使用Heap Usage(菜单栏FreeRTOS=>Heap Usage)窗口直接进行查看。

2.1  查看heap_1/2/4使用情况
以heap_4为例,Debug显示如下结果:
      4_heapusage_of_heap4.png
2.2   查看heap_5使用情况
测试heap_5,由于heap_5跨内存进行heap分配的特性,我们需要声明HeapRegion_t的heap数组(定义在main.c中),并在进行创建任务对象前调用vPortDefineHeapRegions函数。LPC55S69的片上RAM分布以及代码中heap分配如下所示,可以看到片上RAM分为4部分,我们使用了10K的SRAM与10K的SRAM4用于分配heap_4。
    5_region_of_heap5.png

Debug结果如下所示,可以在结果中看到heap使用了两块地址不连续的片上RAM,在heap_5分配方式下,将优先使用HeapRegion_t数组定义的第一部分内存,第二部分内存处于Free状态。
    6_heapusage_of_heap5.png

3.    Heap_1-5的切换及注意事项
heap分配方式的替换:在FreeRTOSConfig.h中,通过配置宏定义configFRTOS_MEMORY_SCHEME为x(默认为4)将FreeRTOS内存分配方式配置为heap_x(详情查看菜单栏Help=>MCUXpresso UserGuide=>FreeRTOS Debug Guide)。但是这样仍然不能配置为heap_x,需要将/freertos/freertos_kernel/portable/MemMang/heap_4.c替换为FreeRTOS源码中的heap_x.c。
       heap1~5对heap的分配方式略有不同,heap_1/2/4都是使用FreeRTOSConfig.h中configTOTAL_HEAP_SIZE来生成一个大数组作为heap;heap_3的heap大小定义在启动文件中,分配方式本质上是对标准C库malloc()和free()简单包装;heap_5的heap大小定义在HeapRegion_t数组中。

4.   heap_1-5的分配方式区别及应用场景
       heap1~5对heap的分配方式与使用场所略有不同,如下图所示。
      7_different_of_heap.PNG

回复

使用道具 举报

  • TA的每日心情
    慵懒
    2021-5-20 10:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    130
    最后登录
    2021-9-4
    发表于 2021-5-20 10:47:47 | 显示全部楼层
    每种heap的分配都有不同的应用场景哦。
    heap_1适合一些不会删除任务,队列以及信号量场所,特别是一些比较简单的系统和一些对安全性要求比较高的系统。
    heap_2适合一些申请和释放操作不是特别频繁,而且不会申请大数组的场所(申请和释放会造成内存碎片,过多操作内存中可能没有大的连续区域)。
    Heap_3实际使用的是c语言的malloc和free函数.
    heap_4适用于内存分配和释放操作比较频繁的系统,例如要重复创建删除任务,队列,信号量等,是heap_2的升级版,可以将heap_2分配方式产生的碎片内存整合起来使用。
    heap_5适用于系统需要管理不连续的内存空间,例如接入外部RAM或片上有多块RAM的场所。
    干活啦
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    擦汗
    2025-4-15 13:14
  • 签到天数: 88 天

    连续签到: 1 天

    [LV.6]常住居民II

    0

    主题

    243

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1100
    最后登录
    2025-4-15
    发表于 2021-5-19 20:37:22 | 显示全部楼层
    不错不错,受益匪浅
    繁琐不知进步的一天
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-10 13:07
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    56

    主题

    546

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1524

    热心会员

    最后登录
    2025-7-10
    发表于 2021-5-20 12:33:13 | 显示全部楼层
    很好的内容,谢谢小恩
    签到签到
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24907
    最后登录
    2025-7-22
     楼主| 发表于 2021-5-20 14:56:56 | 显示全部楼层
    y369369 发表于 2021-5-20 12:33
    很好的内容,谢谢小恩

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-23 04:21 , Processed in 0.096284 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表