gpt4 book ai didi

c++ - 防止为嵌入式项目编译 malloc/free

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:34 24 4
gpt4 key购买 nike

背景:我们正在使用 Keil 编译我们的 NXP LPC2458 项目。有许多任务正在 Keil 的 RealView RTOS 上运行。创建了堆栈空间,将其分配给每个任务。默认情况下没有创建 HEAP,我想避免它,因为我们负担不起代码空间开销和“垃圾收集”的成本

目标:在不使用堆的情况下在嵌入式代码中使用 C++。 Keil 提供了 #pragma (__use_no_heap) 来防止 malloc() 和 free() 调用被链接。

解决方案:我尝试创建一个带有私有(private)静态指针的单例。我希望 new() 不会被调用,因为我在 getDLMData() 中将 dlmData 声明为静态。出于某种原因,链接器仍然声明正在调用 malloc() 和 free()。我想到了私有(private)运算符 new () 和私有(private)运算符 delete() ,然后在重载函数中将 dlmData 声明为静态。由于某种原因它不工作。我做错了什么?

    //class declaration
class DataLogMaintenanceData
{
public:
static DataLogMaintenanceData* getDLMData();
~DataLogMaintenanceData()
{ instanceFlag = FALSE; }
protected:
DataLogMaintenaceData(); //constructor declared protected to avoid poly
private:
static Boolean instanceFlag;
static DataLogMaintenceData *DLMData;
}

//set these to NULL when the code is first started
Boolean DataLogMaintenanceData::instanceFlag = FALSE;
DataLogMaintenanceData *DataLogMaintenaceData::DLMData = NULL;

//class functions
DataLogMaintenanceData *DataLogMaintenanceData::getDLMData()
{
if (FALSE == instanceFlag)
{
static DataLogMaintenanceData dlmData;
DLMData = &dlmData;
instanceFlag = TRUE;
return DLMData;
}
else
{
return DLMData;
}
}

void InitDataLog ( void )
{
DataLogMaintenanceData *dlmData;
dlmData = DataLogMaintenanceData::getDLMData();
// to avoid dlmData warning
dlmData = dlmData;
}

//ACTUAL TASK
__task DataLog()
{
.. .. .. code to initialize stuff

InitDataLog();

.. .. ..more stuff
}

出于某种原因,我可以编译它的唯一方法是创建一个堆空间,然后允许将 malloc() 和 free() 调用编译到项目中。正如预期的那样,“静态”定义的对象 dlmData 驻留在分配给 dataLog.o 模块的 RAM 空间中(即它不在 HEAP 中)。

我想不通,我查过谷歌,我错过了什么?在 C++ 中编译纯对象时是否可以绕过 malloc() 和 free()?我知道我可以替换 RTOS 的 malloc() 和 free() 实现什么也不做,但我想避免编译我不会使用的代码。

最佳答案

可能一些我们没有看到的代码调用了一个在幕后调用 malloc 的函数。

来自 http://www.keil.com/support/man/docs/armlib/armlib_CJAIJCJI.htm您可以在链接行上使用 --verbose --list=out.txt 来获取有关 malloc 调用方的详细信息。

关于c++ - 防止为嵌入式项目编译 malloc/free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6956160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com