Kann ich mit PROGMEM in den Flash-Speicher schreiben?

11

In der Dokumentation von Arduino zitiere ich:

http://playground.arduino.cc/Learning/Memory Hinweis: Der Flash-Speicher (PROGMEM) kann nur zum Zeitpunkt des Programmbrennens gefüllt werden. Sie können die Werte im Flash nicht ändern, nachdem das Programm gestartet wurde.

Und auf der PROGMEM-Beschreibung:

http://arduino.cc/en/Reference/PROGMEM Speichern Sie Daten im Flash-Speicher (Programmspeicher) anstelle von SRAM. Auf einer Arduino-Karte sind die verschiedenen Speichertypen beschrieben.

Das Schlüsselwort PROGMEM ist ein Variablenmodifikator und sollte nur mit den in pgmspace.h definierten Datentypen verwendet werden. Es teilt dem Compiler mit, dass "diese Informationen in den Flash-Speicher gestellt werden sollen", anstatt in den SRAM, in den sie normalerweise gehen würden.

Können wir oder können wir nicht? Oder ist es nicht dasselbe?

zzarbi
quelle
Während Sie zur Laufzeit in den (Flash-) Programmspeicher schreiben können (sofern er nicht gesperrt ist), ist der Prozess etwas komplizierter und kann nicht mit der PROGMEM-Direktive ausgeführt werden, die im Grunde nur den Zuweisungsprozess steuert. Wenn Sie sehen möchten, wie es gemacht werden kann, schauen Sie sich die Bootloader-Quelle an.
Chris Stratton
Seitenschreibblöcke machen das Schreiben in Flash nicht unpraktisch. Tatsächlich freute es sich auf etwas.
Anothercg Gmail

Antworten:

9

Die kurze Antwort lautet nein: PROGMEM-Daten sind schreibgeschützt.

Einschränkungen
des Flash-Speichers Das erste, was zu verstehen ist, ist, dass der Flash-Speicher (in dem sich der Programmspeicher befindet) für die langfristige feste Speicherung ausgelegt ist. Das Lesen ist sehr schnell und präzise. Im Allgemeinen können Sie es jedoch nicht byteweise ändern (z. B. eine bestimmte Variable ändern). Normalerweise müssen Sie es in großen Blöcken löschen und neu schreiben. Dies macht es für die Laufzeitmanipulation völlig unpraktisch, da Sie während des Lösch- und Schreibzyklus viele redundante Informationen an einem anderen Ort speichern müssten.

Was PROGMEM tatsächlich tut
Alle in Ihrem Code angegebenen Literaldaten (wie Zeichenfolgen und Zahlen) befinden sich immer zuerst im Programmbereich (dh in Flash). Wenn Ihre Skizze diese Daten jedoch zur Laufzeit tatsächlich verwenden möchte, muss sie normalerweise etwas Platz im SRAM zuweisen und kopieren. Das bedeutet, dass Sie zwei Kopien erhalten: das feste Original in Flash und die temporäre Kopie in SRAM.

Wenn Sie den Modifikator PROGMEM verwenden, weisen Sie ihn an, diese zweite Kopie nicht im SRAM zu erstellen. Stattdessen greift Ihre Skizze einfach auf das Original in Flash zu. Dies ist sehr nützlich, wenn Sie die Daten immer nur lesen müssen , da die Zuordnungs- und Kopiervorgänge vermieden werden.

Das Kopieren in SRAM ist jedoch unerlässlich, wenn Sie die Daten ändern möchten. Abgesehen von den oben erwähnten Flash-Einschränkungen ist es auch eine Frage der Codesicherheit.

Wenn Sie die im Programmraum gespeicherten Daten ändern können, folgt logischerweise, dass Sie auch den im Programmraum gespeicherten Code ändern können. Dies würde bedeuten, dass ein einfacher Fehler (oder theoretisch ein böswilliger Angriff) dazu führen könnte, dass Ihre Skizze zur Laufzeit teilweise oder vollständig neu geschrieben wird. Dies kann zu sehr unvorhersehbaren Ergebnissen führen, die von der einfachen Einstellung der Arbeit bis zur Beschädigung / Zerstörung angeschlossener Geräte reichen.

Weitere Informationen
Hier erfahren Sie mehr über das Low-Level-PROGMEM-Material:

Eine ältere Version desselben PROGMEM-Tutorials finden Sie hier:

Peter Bloomfield
quelle