Как можно указать название, я в настоящее время не занимаюсь SRAM в своей программе, и я не могу найти способ уменьшить мои глобальные переменные. Можно ли перевести глобальные переменные во флэш-память? Поскольку эти переменные часто читаются и записываются, было бы плохо для nand flash
, потому что они имеют ограниченное число циклов чтения/записи?C - хранить глобальные переменные во флэш-памяти?
Если вспышка не может справиться с этим, будет ли EEPROM
хорошей альтернативой?
EDIT: Извините за неоднозначность парней. Я работаю с Atmel AVR ATmega32HVB, который имеет: 2К байт SRAM, 1K байт EEPROM 32К байт FLASH
Компилятор: AVR C/C++
Платформа: IAR Embedded AVR
глобальные переменные, которые я хочу, чтобы избавиться от того, являются:
uint32_t capacityInCCAccumulated[TOTAL_CELL];
и
int32_t AccumulatedCCADCvalue[TOTAL_CELL];
Фрагменты кода:
int32_t AccumulatedCCADCvalue[TOTAL_CELL];
void CCGASG_AccumulateCCADCMeasurements(int32_t ccadcMeasurement, uint16_t slowRCperiod)
{
uint8_t cellIndex;
// Sampling period dependant on configuration of CCADC sampling..
int32_t temp = ccadcMeasurement * (int32_t)slowRCperiod;
bool polChange = false;
if(temp < 0) {
temp = -temp;
polChange = true;
}
// Add 0.5*divisor to get proper rounding
temp += (1<<(CCGASG_ACC_SCALING-1));
temp >>= CCGASG_ACC_SCALING;
if(polChange) {
temp = -temp;
}
for (cellIndex = 0; cellIndex < TOTAL_CELL; cellIndex++)
{
AccumulatedCCADCvalue[cellIndex] += temp;
}
// If it was a charge, update the charge cycle counter
if(ccadcMeasurement <= 0) {
// If it was a discharge, AccumulatedCADCvalue can be negative, and that
// is "impossible", so set it to zero
for (cellIndex = 0; cellIndex < TOTAL_CELL; cellIndex++)
{
if(AccumulatedCCADCvalue[cellIndex] < 0)
{
AccumulatedCCADCvalue[cellIndex] = 0;
}
}
}
}
И это
uint32_t capacityInCCAccumulated[TOTAL_CELL];
void BATTPARAM_InitSramParameters() {
uint8_t cellIndex;
// Active current threshold in ticks
battParams_sram.activeCurrentThresholdInTicks = (uint16_t) BATTCUR_mA2Ticks(battParams.activeCurrentThreshold);
for (cellIndex = 0; cellIndex < TOTAL_CELL; cellIndex++)
{
// Full charge capacity in CC accumulated
battParams_sram.capacityInCCAccumulated[cellIndex] = (uint32_t) CCGASG_mAh2Acc(battParams.fullChargeCapacity);
}
// Terminate discharge limit in CC accumulated
battParams_sram.terminateDischargeLimit = CCGASG_mAh2Acc(battParams.terminateDischargeLimit);
// Values for remaining capacity calibration
GASG_CalculateRemainingCapacityValues();
}
Написание флэш-памяти и EEPROM обычно медленное, и это может быть не очень полезно для часто меняющихся значений. Кстати, вы говорите о микрокомпьютере? Если да, укажите, какой микрокомпьютер является вашей целью. – MikeCAT
Какова ваша платформа? Какой компилятор? – LPs
EEPROM также имеет ограниченное количество записей. Не рекомендовал бы это. Возможно, покажите нам какой-то код, мы постараемся помочь вам уменьшить их. – DawidPi