本帖最后由 小恩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为例),出现以下情况: 这表明在Heap Usage窗口(菜单栏FreeRTOS=>Heap Usage)无法查看heap_3及静态内存分配方式下heap的使用。 对此,我们一个可行的workaround是在Expression窗口里(菜单栏Windows=>ShowView=>Other= >Debug=>Expression)查看heap使用。MCUXpressoIDE下查看heap_3使用的方法如下图所示: 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得到以下结果: 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显示如下结果: 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。
Debug结果如下所示,可以在结果中看到heap使用了两块地址不连续的片上RAM,在heap_5分配方式下,将优先使用HeapRegion_t数组定义的第一部分内存,第二部分内存处于Free状态。
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的分配方式与使用场所略有不同,如下图所示。
|