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

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

12 голосов | спросил Robert 10 PMpWed, 10 Apr 2013 22:12:19 +040012Wednesday 2013, 22:12:19

3 ответа


10

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

  • FLASH: 10 000 циклов записи /стирания. Доступ осуществляется быстро, но медленнее, чем SRAM. Доступ кодов через PROGMEM.
  • EEPROM: 100 000 циклов записи /стирания. Доступ - slooooooow, в миллисекундах. Относительно сложная процедура доступа.
  • SRAM: Неограниченные циклы записи /стирания. Доступ очень быстрый, 2 такта. Прямой доступ по коду.

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

ответил Anindo Ghosh 10 PMpWed, 10 Apr 2013 22:48:20 +040048Wednesday 2013, 22:48:20
2

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

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

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

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

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

Serial.print (F («Hello World!»);

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

ответил baldengineer 11 AMpThu, 11 Apr 2013 02:55:00 +040055Thursday 2013, 02:55:00
1

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

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

ответил Manishearth 10 PMpWed, 10 Apr 2013 22:32:30 +040032Wednesday 2013, 22:32:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132