TouchGFX和FREERTOS配合使用时,堆的问题

博客介绍了在使用FreeRTOS和TouchGFX框架时,因全局对象构造函数在main函数前调用malloc导致的问题。为了解决FreeRTOS堆未初始化时的内存分配失败,提出了通过KEIL的HOOK函数机制,预先检查并初始化堆的解决策略,确保在需要时能正确调用内存分配函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

我将除了全局变量之外所有的内存都给到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);
}

参考链接:

编译器参考指南:使用 $Super$$ 和 $Sub$$ 来修补符号定义 (keil.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值