背景:我們正在使用Keil來編譯我們的恩智浦LPC2458項目。在Keil的RealView RTOS上有很多任務正在運行。有創建的堆棧空間,正在分配給每個任務。沒有默認創建堆和我想避免它,因爲我們買不起的代碼空間開銷和「垃圾收集」防止爲嵌入式項目編譯malloc/free
目的的成本:在嵌入式代碼使用C++不使用堆。 Keil提供了阻止malloc()和free()調用被鏈接的#pragma(__use_no_heap)。
解決方案:我試着用私有靜態指針創建一個單例。我的希望是new()不會被調用,因爲我在getDLMData()中聲明dlmData爲static。由於某些原因,鏈接器仍然聲明malloc()和free()被調用。我有一個私人運算符new()和一個私有運算符delete()的想法,然後在重載函數中聲明dlmData爲static。由於某種原因,它不工作。我究竟做錯了什麼?
//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中)。
我想不通,我檢查了Google,我錯過了什麼?在編譯純對象時,C++可能會繞過malloc()和free()嗎?我知道我可以替換RTOS的malloc()和free()來實現,但是我想避免在不使用的代碼中進行編譯。
只需將'DLMData'設置爲文件級'靜態DataLogMaintenanceData *'。這會自動初始化爲「NULL」,因此您不需要另一個冗餘'instanceFlag'。 'InitDataLog'中的堆棧變量'dlmData'有什麼意義?這段代碼很混亂。 – MSalters
C++中沒有垃圾收集。你確定性地管理你自己的記憶。 –
單身 - >收穫你播種,imo。 – Puppy