背景:
我将除了全局变量之外所有的内存都给到FREERTOS的HEAP5去管理。GUI框架使用的是TouchGFX。这样好管理内存。
于是我将内存分配相关函数全部重定位到FREERTOS提供的API中,新建一个Cpp文件:
#include "freertos.h"
void *operator new(size_t size)
{
return pvPortMalloc(size);
}
void *operator new[](size_t size)
{
return pvPortMalloc(size);
}
void operator delete(void *ptr)
{
vPortFree(ptr);
}
void operator delete[](void *ptr)
{
vPortFree(ptr);
}
extern "C" void *malloc(size_t size)
{
return pvPortMalloc(size);
}
extern "C" void free(void *ptr)
{
vPortFree(ptr);
}
问题:
在main函数之前,由于TouchGFX生成的代码带有全局对象,需要在main函数之前,调用构造函数,而构造函数又调用了malloc,这时候FREERTOS的堆还没有初始化好,导致malloc失败,停在了configASSERT( pxEnd );
解决办法:
可以通过KEIL提供的HOOK函数机制,对MALLOC进行HOOK,基本思路,如果堆没有初始化,则初始化堆,在进行malloc:
int FreeRtosIsInit=0;
void HeapInit()
{
vPortDefineHeapRegions(...);//初始化堆
FreeRtosIsInit=1;
}
void* $Super$$malloc(size_t size);
void* $Sub$$malloc(size_t size)
{
if(!FreeRtosIsInit)
{
HeapInit();
}
return $Super$$malloc(size);
}
参考链接: