Hintergrund: Wir verwenden Keil, um unser NXP LPC2458 Projekt zu kompilieren. Es gibt zahlreiche Tasks, die auf Keils RealView RTOS ausgeführt werden. Es wird Stackspace erzeugt, der jeder Task zugewiesen wird. Es wird standardmäßig kein HEAP erzeugt, und ich möchte dies vermeiden, da wir uns den Code-Space-Overhead und die Kosten für das "Garbage Collecting" nicht leisten können.
Zielsetzung: C++ im eingebetteten Code verwenden, ohne den Heap zu benutzen. Keil bietet das #pragma (__use_no_heap), das verhindert, dass malloc() und free() Aufrufe gelinkt werden.
Lösung: Ich habe versucht, ein Singleton mit einem privaten statischen Zeiger zu erstellen. Ich hoffte, dass new() nicht aufgerufen werden würde, da ich dlmData in getDLMData() als statisch deklariert hatte. Aus irgendeinem Grund gibt der Linker immer noch an, dass malloc() und free() aufgerufen werden. Ich habe über einen privaten Operator new () und einen privaten Operator delete() nachgedacht und dann die dlmData als statisch in der überladenen Funktion deklariert. Aus irgendeinem Grund funktioniert das aber nicht. WAS MACHE ICH FALSCH?
//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
}
Aus irgendeinem Grund ist die einzige Möglichkeit, dies zu kompilieren, einen Heap-Bereich zu erstellen und dann die malloc()- und free()-Aufrufe in das Projekt zu kompilieren. Wie erwartet, befindet sich das "statische", fest definierte Objekt dlmData im RAM-Speicher, der dem Modul dataLog.o zugewiesen ist (d. h. es befindet sich nicht im HEAP).
Ich kann nicht herausfinden, und ich habe bei Google nachgeschaut, was ich übersehe? Ist es in C++ möglich, malloc() und free() zu umgehen, wenn man reine Objekte kompiliert? Ich weiß, dass ich die RTOS-Implementierung von malloc() und free() ersetzen kann, um nichts zu tun, aber ich möchte vermeiden, Code zu kompilieren, den ich nicht verwenden werde.