Чи можу я записати у флеш-пам’ять за допомогою PROGMEM?


11

Щодо документації Arduino, я цитую:

http://playground.arduino.cc/Learning/Memory Примітка: пам'ять Flash (PROGMEM) може бути заповнена лише під час запису програми. Ви не можете змінити> значення у спалаху після запуску програми.

І в описі ПРОГМЕМИ:

http://arduino.cc/en/Reference/PROGMEM Зберігати дані у флеш-пам’яті (програмі) замість SRAM. Опис різних типів пам'яті, наявних на платі Arduino.

Ключове слово PROGMEM є модифікатором змінної, його слід використовувати лише з типами даних, визначеними в pgmspace.h. Він повідомляє компілятору "помістити цю інформацію у флеш-пам'ять", а не в SRAM, куди вона зазвичай піде.

То ми можемо чи не можемо? Або це не одне й те саме?


Хоча ви можете записувати в (флеш) пам'ять програми під час виконання (якщо вона не заблокована), процес трохи більше задіяний і не може бути виконаний за допомогою директиви PROGMEM, яка в основному просто керує процесом розподілу. Якщо ви хочете побачити, як це можна зробити, подивіться джерело завантажувача.
Кріс Страттон

Блоки запису сторінки не роблять написання на флеш непрактичним. Насправді його щось чекало.
Anothercg Gmail

Відповіді:


9

Коротка відповідь - ні: дані PROGMEM є лише для читання.

Обмеження флеш-пам’яті
Перше, що потрібно зрозуміти, це те, що флеш-пам’ять (де живе програмний простір) призначена для довгострокового постійного зберігання. Читання з нього дуже швидке і точне. Однак, загалом кажучи, ви не можете змінити його байт-байт (наприклад, зміна конкретної змінної). Зазвичай доводиться стирати та переписувати великими блоками. Це робить абсолютно непрактичним для маніпуляцій під час запуску, тому що вам доведеться зберігати багато зайвої інформації деінде, поки ви робите цикл стирання та запису.

Що насправді діє PROGMEM
Будь-які буквальні дані, вказані у вашому коді (такі як рядки та числа), завжди спочатку перебувають у програмному просторі (тобто у Flash). Однак, коли ваш ескіз фактично хоче використовувати ці дані під час виконання, він, як правило, повинен виділити для нього деякий простір в SRAM та скопіювати його. Це означає, що ви отримуєте дві копії: фіксований оригінал у Flash та тимчасовий примірник у SRAM.

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

Однак скопіювати його в SRAM необхідно, якщо ви хочете змінити дані. Крім обмежень Flash, про які я згадував вище, це також питання безпеки коду.

Якщо ви можете змінити дані, що зберігаються в програмному просторі, то логічно випливає, що ви також можете змінити код, що зберігається в програмному просторі. Це означає, що проста помилка (або теоретично зловмисна атака) може призвести до того, що ваш ескіз буде частково або повністю переписаний під час виконання. Це може мати дуже непередбачувані результати, починаючи від просто припинення роботи, аж до пошкодження / знищення будь-якого підключеного обладнання.

Додаткова інформація
Ви можете дізнатися більше про матеріали PROGMEM низького рівня тут:

Старіша версія цього ж навчального посібника доступна тут:


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.