реклама на сайте
подробности

 
 
> Функции требующие статической памяти
yanvasiij
сообщение Feb 24 2016, 05:01
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Доброго времени суток!

Столкнулся с тем, что не хватает памяти на микроконтроллере. Начал копать и выяснил, что больше всего памяти потребляет вызов функции, которая у меня занимается вычислениями по калибровочным таблицам (кусочно-линейная аппроксимация). Поскольку мое устройство должно поддерживать большое количество датчиков, вызов этой функции осуществляется из разных мест программы. Добавления каждого нового вызова этой функции вызывает у меня увеличение потребления статической памяти. Я долго думал можно ли с этим что либо поделать, но так и не придумал. Ниже привожу примеры использования.\

Собственно сами функции:
CODE

float plaStraight (const float *calibrationTable, float delta, float minValue,
float maxValue, float inValue)
{
int i;
float outValue = minValue;
if (inValue > calibrationTable[i = 0])
while (maxValue >= outValue)
{
if (inValue < calibrationTable[++i])
return outValue + (inValue - calibrationTable[i-1]) * delta
/ (calibrationTable[i] - calibrationTable[i-1]);
outValue += delta;
};
return outValue;
}

float plaStraight (const float *calibrationTable, float delta, float minValue,
float maxValue, float inValue)
{
int i;
float outValue = minValue;
if (inValue > calibrationTable[i = 0])
while (maxValue >= outValue)
{
if (inValue < calibrationTable[++i])
return outValue + (inValue - calibrationTable[i-1]) * delta
/ (calibrationTable[i] - calibrationTable[i-1]);
outValue += delta;
};
return outValue;
}

float plaRevers (const float *calibrationTable, u32 len, float reversDelta,
float minValue, float inValue)
{
float outValue = calibrationTable[len - 1];
float inValue0 = minValue;
float straightDelta;
int i = 0;

outValue = calibrationTable[len - 1];
inValue0 = minValue;

if ( inValue > inValue0 )
{
while ( calibrationTable[len-1] >= outValue )
{
i++;
if ( inValue < (inValue0 + reversDelta) )
{
straightDelta = calibrationTable[i] - calibrationTable[i-1];
outValue = calibrationTable[i-1] +
((inValue - inValue0) * straightDelta / reversDelta);
return outValue;
}
outValue = calibrationTable[i];
inValue += reversDelta;
}
outValue = calibrationTable[len-1];
}
return outValue;
}



Пример класса, в котором используются эти функции

Код
class TermocoupleSProcessor: public TermocoupleProcessorBase
{
    public:

    virtual float calcTemperature (float eds)
        {
        return plaStraight (typeSCalibrationTable, 10.0, -50.0f, 1760.0f, eds); //<<<Добавления этой строчки приводит к большому выделению памяти
        }

    virtual float calcEds (float t)
        {
          return plaRevers(typeSCalibrationTable, CALIBRATION_TABLE_LEN, 10.0f, -50.0f, t);//<<<Добавления этой строчки приводит к большому выделению памяти
        }
        

    virtual void init (void)
    {
        sensorType = TermocoupleS;
        conversationIsReady = 0;
    }
};


Объекты я объявляю статически. Для каждого типа термопары у меня по два объекта соответствующего класса. Добавления вызова plaStraight и plaStraight в каждом подобном классе приводит к резкому возрастанию выделения статической памяти. В итоге у меня ее просто не хватает. Что можно с этим поделать, есть идеи?

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016