ST意法半导体
直播中

陈丽

7年用户 1541经验值
私信 关注
[问答]

请教大神怎样去修改heap4c文件呢?

我将 FreeRTOS 堆放在 F469I-Disco 板的扩展内存中。
让内存正常工作(LTDC 显示器需要在那里工作)。
FreeRTOS 需要将 configAPPLICAtiON_ALLOCATED_HEAP 选项设置为 1。CubeMXIDE 设置选项(在版本 1.8.0 中)不会在任何地方提供该选项,并且此参数默认为 0。  
在 FreeRTOS.h 中设置变量有效,但会一直持续到进行更改并从 IOC 文件重新生成代码为止。
此外,需要修改 heap4c 文件以允许 FreeRTOS(@第 58 行)搜索命名的扩展内存块。
这在重新生成代码时也会被清除。
一个简单的解决方法是让最后一部分(静态堆)仅以变量 == 0 为条件。
然后用户可以使用预处理器指令在用户部分添加自己的代码。
另一种方法是在需要用户堆时添加具有现有结构的用户代码部分。
需要添加的代码(抱歉缺少格式,提问时不可用)是:
#if (configAPPLICATION_ALLOCATED_HEAP == 1)
/* 应用程序编写者已经定义了用于 RTOS 的数组
堆 - 可能是这样它可以放在一个特殊的段或地址中。*/
// 外部 uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__ ((section (".freertos_data")));
#别的
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif /* configAPPLICATION_ALLOCATED_HEAP */
因此需要进行两个修复,一个在用户堆的 IDE 代码选项中,第二个用于更改 heap4c(其他实现可能需要)。
不,没有考虑使用堆 5C,因为我不希望堆分裂,只是优雅地重新定位。

回帖(1)

王艳

2022-12-13 09:23:00
FreeRTOS论坛针对heap4c问题给出了解决方案:
简而言之,在那个主题上,我正在寻找一个复杂的解决方案,而那里有一个简单的解决方案。
1) 单独留下 heap4c
2)ucHeap的定义是外部的。
3) 在 FreeRTOSconfig.h 中,添加到用户代码部分(显示整个部分)


  • /* USER CODE BEGIN 0 */
  •   extern void configureTimerForRunTimeStats(void);
  •   extern unsigned long getRunTimeCounterValue(void);
  • // ALLOW FreeRTOS TO USE EXTENDED MEMORY
  • #define configAPPLICATION_ALLOCATED_HEAP     1
  • /* USER CODE END 0 */

如果您使用该功能,您将需要前两行用于计时器等
4) 然后在 main.c 的 PV 部分添加:


  • uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__ ((section (".freertos_data")));

请注意,您是在告诉链接器将 ucHeap 变量放置在 .freertos_data 部分,这需要修改链接器文件。显然,你只需要更改一个,所以我通过添加更改了 ....FLASH.ld :


  • MEMORY
  • {
  •   CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
  •   RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 320K
  •   FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K
  •   LTDC1            (rw)    : ORIGIN = 0xc0000000,   LENGTH = 1500K                                /* SDRAM, 1.5 MB, graphics page 0 */
  •   LTDC2            (rw)    : ORIGIN = 0xc0180000,   LENGTH = 1500K                                /* SDRAM, 1.5 MB, graphics page 1 */
  •   RTOS             (rw)    : ORIGIN = 0xc02f8000,   LENGTH = 320K                                /* SDRAM, 320 K RTOS extended heap */
  •   XXHEAP        (rw)           : ORIGIN = 0xc0349000,   LENGTH = 2048K                                /* SDRAM, 1.0 MB graphics screen tree as heap */
  •   SDRAM                (rw)           : ORIGIN = 0xc0549000,   LENGTH = 10000K                        /* SDRAM, 11 MB, remaining graphics memory */
  •   
  • }


特别是,您需要 RTOS 部分,请注意它如何与其他内存部分相匹配。此内存映射允许链接器中的两个 LTDC 屏幕、一个 XXHEAP(我的)和一个通用 SDRAM 部分。
然后需要指定 RTOS 部分(你已经说过它在哪里,但现在是什么):
在用户堆堆栈部分后添加以下内容:


  • /* FREERTOS STACK */
  • .freertos_data (NOLOAD) :
  •   {
  •     . = ALIGN(4);
  •     _freertos_data_begin = .;
  •     *(.freertos_data)
  •     *(.freertos_data*)
  •     . = ALIGN(4);
  •     _freertos_data_end = .;
  •   } >RTOS


应该这样做。该地图应该显示部分,并且根据您的 FreeRTOS 设置,将显示职业。不要担心占用百分比,FreeRTOS 分配的区域只会在您更改 FreeRTOS 设置时增长。
设计说明:链接描述文件只接受 /* */ 作为注释,它不接受 // 风格的注释,这会导致语法错误。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分