Могу ли я написать Flash Memory с помощью PROGMEM?

В документации Arduino я цитирую:

  

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

И в описании PROGMEM:

  

http://arduino.cc/ru/Reference/PROGMEM   Храните данные в памяти (программной) памяти вместо SRAM. Существует описание различных типов памяти, доступных на плате Arduino.

     

Ключевое слово PROGMEM является модификатором переменной, его следует использовать только с типами данных, определенными в pgmspace.h. Он сообщает компилятору «поместить эту информацию во флэш-память», а не в SRAM, где он обычно будет идти.

Так можем мы или не можем? Или это не одно и то же?

10 голосов | спросил zzarbi 23 AMpWed, 23 Apr 2014 11:48:16 +040048Wednesday 2014, 11:48:16

1 ответ


9

Короткий ответ: нет. Данные PROGMEM доступны только для чтения.

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

Что действительно делает PROGMEM
Любые данные, указанные в вашем коде (например, строки и номера), всегда находятся в программном пространстве сначала (т. Е. Во Flash). Однако, когда ваш эскиз действительно хочет использовать эти данные во время выполнения, обычно он должен выделить для него пространство в SRAM и скопировать его. Это означает, что вы получаете две копии: фиксированный оригинал во Flash и временную копию в SRAM.

Когда вы используете модификатор PROGMEM, вы говорите ему не делать эту вторую копию в SRAM. Вместо этого ваш эскиз просто получит доступ к оригиналу во Flash. Это очень полезно, если вам когда-либо приходилось читать данные, поскольку это позволяет избежать операций выделения и копирования.

Однако копирование его в SRAM важно, если вы хотите изменить данные. Помимо ограничений Flash, о которых я упоминал выше, это также вопрос безопасности кода.

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

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

Более старая версия этого же учебника PROGMEM доступна здесь:

ответил Peter Bloomfield 23 PMpWed, 23 Apr 2014 13:49:36 +040049Wednesday 2014, 13:49:36

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

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

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