Was bedeutet die Verwendung von PROGMEM?

12

Bei großen Mengen an Textvariablen habe ich es für notwendig befunden, sie mit PROGMEM im Flash-Speicher abzulegen . Was sind die positiven und negativen Folgen des Speicherns großer Variablen in Flash (unter Verwendung von PROGMEM) gegenüber SRAM und EEPROM auf dem Arduino?


quelle

Antworten:

10

Hier ist ein schneller Vergleich von FLASH, EEPROM und SRAM auf dem AtMega328, dem Mikrocontroller in vielen der aktuellen Arduino-Boards (außer Due, Leonardo, älteren Arduinos und einigen anderen kompatiblen Boards).

  • FLASH: 10.000 Schreib- / Löschzyklen. Der Zugriff ist schnell, aber langsamer als bei SRAM. Codezugriffe über PROGMEM.
  • EEPROM: 100.000 Schreib- / Löschzyklen. Der Zugriff erfolgt langsam in Millisekunden. Relativ komplexes Zugriffsverfahren.
  • SRAM: Unbegrenzte Schreib- / Löschzyklen. Der Zugriff ist sehr schnell, 2 Taktzyklen. Direkter Zugriff per Code.

Die wichtigste hypothetische negative Konsequenz bei der Verwendung von PROGMEM ist das Limit von 10.000 Schreibzyklen . Die wichtigste negative Folge der Verwendung von EEPROM ist die Komplexität des Codes zum Lesen / Schreiben / Kopieren von Daten. SRAM, es ist nur sehr begrenzt in der Kapazität .

Anindo Ghosh
quelle
Woher erhalten Sie die Informationen zum EEPROM-Zugriff? Von etwas suchen über , es sieht aus wie EEPROM liest nehmen so etwas wie ~ 5 Taktzyklen. Schreiben ist langsam, aber nicht lesen.
Connor Wolf
OP will viele Sachen speichern .
Anindo Ghosh
Ja, aber ist das einmal schreiben, viel lesen oder umgekehrt? "Textvariablen" werden wahrscheinlich zur Kompilierungszeit angegeben, auf das Gerät gebrannt und danach nie mehr geändert (z. B. Menütext oder sommat).
Connor Wolf
Ich habe den Shop in der Frage als "Store at compile / upload time" gelesen . Wenn eine Variable zum Lesen / Schreiben zur Laufzeit verwendet werden soll, sollte sie auf keinen Fall in FLASH gespeichert werden. Gibt es nicht die zusätzliche Einschränkung, dass FLASH nicht geändert werden kann, ohne zuerst die gesamte Seite zu löschen?
Microtherion
... Textvariablen nicht String - Konstanten.
Anindo Ghosh
2

Die Hauptaussage ist, dass Sie die in PROGMEM gespeicherten Informationen nicht ändern können. Sie werden auch einen (sehr kleinen) Leistungstreffer hinnehmen müssen, da die Zeichenfolge jeweils 1 Byte kopiert werden muss.

Die Abnutzung des FLASH ist kein (primäres) Problem, da Sie den FLASH ohnehin neu programmieren müssen, um Änderungen an Ihrem Programm vorzunehmen.

Mit der IDE 1.x-Einführung wurde das F () -Makro aufgenommen. Dies macht es einfacher, Strings in PROGMEM zu behalten.

Zum Beispiel anstelle von: Serial.print ("Hello World!");

Sie können jetzt verwenden:

Serial.print (F ("Hallo Welt!");

Beachten Sie, dass F () keine Funktion ist, sondern nur ein Makro, sodass die Verwendung etwas eingeschränkt ist.

Baldengineer
quelle
1

PROGMEM wird am besten für unveränderliche Daten verwendet. Wenn Sie die sich schnell ändernden Variablen beibehalten möchten, würde ich sie einfach im SRAM speichern. Auf der anderen Seite ist PROGMEM eine großartige Idee, wenn Sie unveränderliche Textvariablen (z. B. anzuzeigendes Material) haben möchten, die nicht zu oft abgerufen werden.

In Bezug auf EEPROM - versuchen Sie, dies für dauerhafte Inhalte zu speichern. IIRC ist es langsamer, Daten aus dem EEPROM über SRAM / PROGMEM abzurufen. Normalerweise kopiere ich (und andere) Daten aus dem EEPROM in den SRAM (auch das offizielle Beispiel tut dies), bevor ich sie verwende.

Manishearth
quelle