Предпосылки: Мы используем Keil для компиляции нашего проекта NXP LPC2458. В RealView RTOS от Keil выполняется множество задач. Создается стековое пространство, которое выделяется для каждой задачи. По умолчанию HEAP не создается, и я хочу избежать этого, поскольку мы не можем позволить себе накладные расходы на пространство кода и затраты на «сборку мусора»
Цель: использовать C ++ во встроенном коде без использования кучи. Keil предоставляет #pragma (__use_no_heap), который предотвращает связывание вызовов malloc () и free ().
Решение: Я попытался создать синглтон с частным статическим указателем. Я надеялся, что new () не будет вызываться, поскольку я объявил dlmData статическим в getDLMData (). По какой-то причине компоновщик по-прежнему заявляет, что вызываются malloc () и free (). У меня есть мысли о частном операторе new () и частном операторе 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, находится в пространстве RAM, выделенном для модуля dataLog.o (т.е. он не находится в HEAP).
Я не могу понять, и у меня есть проверил гугл, что мне не хватает? Можно ли в C ++ обойти malloc () и free () при компиляции чистых объектов? Я знаю, что могу заменить реализацию malloc () и free () в ОСРВ, чтобы ничего не делать, но я хочу избежать компиляции кода, который я не буду использовать.