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