Предотвращение компиляции malloc / free для встроенных проектов

Предпосылки: Мы используем 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 () в ОСРВ, чтобы ничего не делать, но я хочу избежать компиляции кода, который я не буду использовать.

5
задан embedded_parag 5 August 2011 в 12:21
поделиться