This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6442:A53EVM-SMP GCC FreeRTOS-FAT 问题(FYI 和修复)

Guru**** 2587365 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1576285/am6442-a53-smp-gcc-freertos-fat-issue-fyi-and-fix

器件型号:AM6442


工具/软件:

使用 FREERTOS-SMP 和 FatFS 时、执行文件打开、然后执行关闭、设置-O2 后、系统会报告堆问题并置为有效。

在 A53EVM-SMP 模式下、FreeRTOS 不使用标准 malloc/free 例程、而是使用 source\kernel\freertos\portable_smp\gc\arm_CA53\port.c 中定义的例程、这些例程使用 pvPortMalloc (..) 和 pvPortFree (..) 从 source\kernel\freertos\freertos-Kernel-smp\portable\MemMang\heap_4.c 文件中。  即 99.9%正常。 但启用了-O2 的 GCC、当 GCC 看到 malloc () 后跟 memset () 时、它会将这两个函数合并为 calloc ()。  问题在于 calloc () 不会切换到 heap4.c 中定义的 pvPortCalloc (),而是使用 GCC 的内置版本。  GCC 的 calloc () 使用.heap 段中的内存,而替换的 malloc () 使用 heap_4.c 中定义的内存块 (ucHeap[])  当用 heap_4.c free () 释放 GCC 分配的内存时,这会导致问题。  存储器块不属于堆区域、并会发出断言。    

要纠正此问题:

在定义 malloc () 和 free () 的底部的 source\kernel\freertos\portable_smp\gcc\arm_CA53\port.c 中、添加一个覆盖 calloc () 的函数、并调用 pvPortCalloc ()。

void _attribute__((已使用))*calloc (size_t xNum、size_t xSize)  

   返回 pvPortCalloc (xNum、xSize);
}

然后在 source\kernel\freertos\freertos-Kernel-smp\include\portable.h 中、大约第 179 行暴露了 pvPortCalloc () 函数

void *pvPortCalloc (size_t xNum、size_t xSize) 特权函数;

 现在,GCC 将 malloc () 和 memset () 优化为仅 calloc () 时,它将使用为 A53-SMP 设计的 calloc。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在最新版本 MCU_PLUS_SDK_am64x_11_01_00_17 以及之前的 2 个版本中都有此更新。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Robert:

    感谢您指出这一点、我将在结束时对此进行测试、并重现此问题一次。