Які наслідки використання PROGMEM?


12

Маючи велику кількість текстових змінних, я вважаю за необхідне зберігати їх у флеш-пам’яті за допомогою PROGMEM . Які позитивні та негативні наслідки зберігання великих змінних у Flash (за допомогою PROGMEM) проти SRAM проти EEPROM на Arduino?

Відповіді:


10

Ось короткий порівняння FLASH, EEPROM та SRAM на AtMega328, мікроконтролера багатьох сучасних плат Arduino (виключаючи Due, Leonardo, старший Arduinos та деякі інші сумісні плати).

  • ФЛЕШ: 10 000 циклів запису / стирання. Доступ швидкий, але повільніше, ніж SRAM. Доступ до коду через PROGMEM.
  • EEPROM: 100 000 циклів запису / стирання. Доступ slooooooow, в мілісекундах. Відносно складна процедура доступу.
  • SRAM: Необмежений цикл запису / стирання. Доступ дуже швидкий, 2 тактових цикли. Прямий доступ за кодом.

Отже, ключовим гіпотетичним негативним наслідком використання PROGMEM є межа 10 000 циклу запису . Основним негативним наслідком використання EEPROM є складність коду для читання / запису / копіювання даних. SRAM, це просто дуже обмежена потужність .


Де ви отримуєте інформацію про доступ до EEPROM? З трохи дивлячись про , це виглядає як EEPROM читає тека - щось на зразок циклів ~ 5 годин. Писати повільно, але не читати.
Коннор Вольф

ОП хоче зберігати багато речей.
Аніндо Гош

Так, але це писати один раз, багато читати чи зворотне? "Текстові змінні", ймовірно, є тим, що вказано під час компіляції, записується на пристрій і ніколи не змінюється після цього (наприклад, текст меню або соммат).
Коннор Вольф

Я читаю магазин у запитанні як "зберігати під час компіляції / завантаження". Якщо змінна призначена для читання / запису під час виконання, вона точно не повинна зберігатися в FLASH. Чи не існує додаткового обмеження, яке FLASH неможливо змінити, не спершу стерши всю сторінку?
мікротерйон

... текстові змінні, а не рядкові константи.
Аніндо Гош

2

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

Знос FLASH не є основною проблемою, оскільки для внесення змін у програму вам доведеться все-таки перепрограмувати FLASH.

З введенням IDE 1.x був включений макрос F (). Це полегшує збереження рядків у програмі PROGMEM.

Наприклад, замість використання: Serial.print ("Привіт, світ!");

Тепер ви можете використовувати:

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.