工具/软件:
使用 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。