5 Stimmen

Verhindern, dass malloc/free für eingebettete Projekte kompiliert wird

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X