Каковы последствия использования PROGMEM?


12

С большим количеством текстовых переменных я счел необходимым хранить их во флэш-памяти с помощью PROGMEM . Каковы положительные и отрицательные последствия хранения больших переменных во Flash (используя PROGMEM) против SRAM против EEPROM на Arduino?

Ответы:


10

Вот краткое сравнение FLASH, EEPROM и SRAM на AtMega328, микроконтроллере во многих современных платах Arduino (за исключением Due, Leonardo, старых Arduinos и некоторых других совместимых плат).

  • ВСПЫШКА: 10000 циклов записи / стирания. Доступ быстрый, но медленнее, чем SRAM. Код доступ через PROGMEM.
  • ЭСППЗУ: 100 000 циклов записи / стирания. Доступ замедленный, в миллисекундах. Относительно сложная процедура доступа.
  • SRAM: неограниченные циклы записи / стирания. Доступ очень быстрый, 2 такта. Прямой доступ по коду.

Итак, ключевое гипотетическое негативное последствие использования PROGMEM - ограничение цикла записи 10000 . Ключевое негативное последствие использования EEPROM - сложность кода для чтения / записи / копирования данных. SRAM, он просто очень ограничен в емкости .


Где вы получаете информацию о доступе к EEPROM? С немного глядя о , это выглядит как EEPROM читает тека - то вроде циклов ~ 5 часов. Запись медленная, но не чтение.
Коннор Вольф

ОП хочет хранить много вещей.
Аниндо Гош

Да, но это написать один раз, прочитать много или наоборот? «Текстовые переменные», вероятно, являются чем-то, что указывается во время компиляции, записывается на устройство и никогда не изменяется после этого (например, текст меню или соммат).
Коннор Вольф

Я прочитал магазин в вопросе как «магазин во время компиляции / загрузки». Если переменная предназначена для чтения / записи во время выполнения, она определенно не должна храниться во FLASH. Есть ли дополнительное ограничение, что FLASH не может быть изменен без предварительного удаления всей страницы?
микротерион

... текстовые переменные, а не строковые константы.
Аниндо Гош

2

Основным последствием является то, что вы не можете изменить информацию, хранящуюся в PROGMEM. Вы также получите (очень маленький) удар по производительности, так как строка должна копироваться по 1 байту за раз.

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

С введением IDE 1.x был включен макрос F (). Это облегчает хранение строк в PROGMEM.

Например, вместо использования: Serial.print ("Hello World!");

Теперь вы можете использовать:

Serial.print (F («Привет, мир!»);

Обратите внимание, что F () не функция, это просто макрос, поэтому его использование несколько ограничено.


1

PROGMEM лучше всего использовать для неизменных данных. Если вы собираетесь хранить быстро меняющиеся переменные, я бы просто сохранил их в SRAM. С другой стороны, если вы хотите иметь некоторые неизменяемые текстовые переменные (например, материал для отображения), который не будет выбираться слишком часто, PROGMEM - отличная идея.

Что касается EEPROM - попытайтесь сохранить это для постоянных вещей. IIRC медленнее извлекает данные из EEPROM через SRAM / PROGMEM. Обычно я (и другие) копирую данные из EEPROM в SRAM (даже официальный пример делает это) перед их использованием.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.