2015-09-22 3 views
1

Как можно указать название, я в настоящее время не занимаюсь 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(); 
} 
+3

Написание флэш-памяти и EEPROM обычно медленное, и это может быть не очень полезно для часто меняющихся значений. Кстати, вы говорите о микрокомпьютере? Если да, укажите, какой микрокомпьютер является вашей целью. – MikeCAT

+0

Какова ваша платформа? Какой компилятор? – LPs

+0

EEPROM также имеет ограниченное количество записей. Не рекомендовал бы это. Возможно, покажите нам какой-то код, мы постараемся помочь вам уменьшить их. – DawidPi

ответ

1

Любой вид флэш плохая идея использовать для часто меняющихся значений:

  • ограниченное число циклов стирания/записи, см таблицу.
  • очень медленное удаление/запись (стирание может быть ~ 1 с), см. Техническое описание.
  • Вам нужна специальная последовательность для стирания, затем запись (без поддержки языка).
  • Хотя удаление или запись доступа к Flash блокируются в лучшем случае, некоторым из них не требуется вообще обращаться к Flash (неопределенное поведение).
  • Флэш-ячейки не могут быть свободно записаны за каждый байт/слово. Большинство из них должны быть написаны на странице (например, 64 байта) и стерты чаще всего в гораздо больших единицах (сегменты/блоки/сектора).

Для вспышки NAND выносливость еще более уменьшена по сравнению с NOR Flash, и ячейки менее надежны (бит может периодически перевернуться или неисправен), поэтому вам нужно добавить обнаружение и исправление ошибок.Это, скорее всего, направление, в которое вы не должны идти.

Истинная EEPROM разделяет большинство проблем, но они могут быть написаны байт/словосочетание (внутреннее стирание).

Обратите внимание, что современный встроенный в MCU «EEPROM» в большинстве случаев также является вспышкой. В некоторых реализациях используются несколько более надежные ячейки (около десяти циклов стирания/записи по сравнению с программной вспышкой) и дополнительное оборудование, позволяющее произвольно записывать байты/слова (автоматическое стирание). Но этого все еще недостаточно для частых изменений.

Однако сначала необходимо проверить, может ли ваше приложение допускать длительное время записи/стирания. Можете ли вы принять процесс, блокирующий это долго, или переписать свою программу соответствующим образом? Если ответ «нет», вы должны прекратить дальнейшее расследование в этом направлении. В противном случае вы должны рассчитать количество обновлений в течение ожидаемого срока службы и сравнить их с информацией в таблице данных. Существуют также методы уменьшения количества циклов стирания, но слишком далеко.

Если используется внешнее устройство (I2C/SPI), вы можете использовать последовательный SRAM. Хотя лучший (и, вероятно, более дешевый) подход будет более крупным MCU или подумать о более эффективном способе хранения данных в SRAM (т. Е. Меньше RAM, больше кода).

+0

Спасибо за советы Олаф. Я думаю, что в ближайшее время я не смогу заменить MCU. Обрезка глобальных переменных также является опцией в этом случае. У меня есть несколько глобальных массивов, на которые ссылаются функции в коде. Есть ли способ уменьшить потребление SRAM этих массивов? – HacLe

+0

@HacLe: Не анализируя весь ваш код, это невозможно. Это очень сложная задача и может привести к серьезным изменениям. Обратите внимание, что это не по теме на SO (если вы думаете о том, чтобы задать вопрос). Личный совет: дважды проверьте свои требования и будьте творческими. – Olaf

+0

@HacLe: Первое, что нужно проверить, это если вам действительно нужны 32-битные целые числа. Они также довольно дорого обрабатывают 8-битный MCU, такой как AVR. – Olaf

3

было бы плохо для Nand Flash, потому что они имеют ограниченное число циклов чтения/записи?

Да, не рекомендуется использовать вспышку для частой модификации данных. Только чтение от вспышки не уменьшает срок службы вспышки. Стирание и запись уменьшат срок службы вспышки.

Чтение и запись со вспышки значительно медленнее по сравнению с обычной памятью.

Чтобы записать байт, весь блок должен быть удален и перезаписан во флэш-памяти.

+0

Спасибо Kumar, кажется, Flash и EEPROM со стола :). – HacLe

Смежные вопросы