Столкнулся с тем, что не хватает памяти на микроконтроллере. Начал копать и выяснил, что больше всего памяти потребляет вызов функции, которая у меня занимается вычислениями по калибровочным таблицам (кусочно-линейная аппроксимация). Поскольку мое устройство должно поддерживать большое количество датчиков, вызов этой функции осуществляется из разных мест программы. Добавления каждого нового вызова этой функции вызывает у меня увеличение потребления статической памяти. Я долго думал можно ли с этим что либо поделать, но так и не придумал. Ниже привожу примеры использования.\
Собственно сами функции:
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;
}
};
{
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 в каждом подобном классе приводит к резкому возрастанию выделения статической памяти. В итоге у меня ее просто не хватает. Что можно с этим поделать, есть идеи?