MCU: Daten direkt im Flash speichern. Was ist der Vorteil?

Ich weiß, dass es bei einigen MCUs möglich ist, Daten direkt im Programmspeicher (Flash-Speicher) zu speichern. Der AVRGCC-Compiler verwendet "PROGMEM"-Keyworkd, MPLAB C18 verwendet ein ähnliches mit demselben Effekt. Was ist jedoch der Vorteil, Daten im Programmspeicher zu haben?

Vielleicht, weil diese MCUs eine Harvard-Architektur haben und daher das Lesen von Daten aus dem Programmspeicher schneller ist als das Lesen aus dem Datenspeicher? Ist es "wirklich so viel schneller", dass es sich lohnt, es zu verwenden?

Danke!

Antworten (3)

Diese Mikrocontroller haben einen sehr begrenzten Arbeitsspeicher. Wenn Sie also eine Nachschlagetabelle wünschen, ist es sinnvoll, die großen, konstanten Daten im Programm-Flash statt im kostbaren RAM zu speichern.

Es ist wichtig zu beachten, dass Sie IMMER Konstanten und den Rest des Programms im Flash speichern. Ob Sie die Daten /zusätzlich/ im RAM speichern, bleibt Ihnen überlassen.

Sie haben zwei Möglichkeiten für konstante Daten auf diesen Flash-Mikrocontrollern.

  1. Bei Bedarf vom Flash laden (PROGMEM)
  2. Beim Programmstart vom Flash ins RAM laden (nicht PROGMEM). Der C-Compiler erledigt dies automatisch für Sie, wenn Sie vergessen, PROGMEM zu verwenden, da Daten normalerweise in C gelesen/geschrieben werden.

Das Laden von Daten aus dem Programmspeicher ist im Vergleich zum Laden aus dem RAM viel langsamer, aber wenn Sie nur 128 Byte RAM haben und die Daten sowieso im Flash gespeichert werden müssen, zahlt es sich aus.

AVRs haben in der Regel auch 128 Bytes EEPROM und den Flash-Speicher, den Sie für Ihr Programm nicht benötigen. Der Mikrocontroller kann dann seinen eigenen Flash-Speicher programmieren, um Messungen und Einstellungen zu speichern. Der Flash-Speicher ist reichlicher als der EEPROM, aber im Gegensatz zum EEPROM, der normalerweise 1 Byte auf einmal wiederbeschreibbar zu sein scheint, muss der Flash in Blöcken gelöscht und neu geschrieben werden.

Wenn eine MCU keinen separaten EEPROM-Bereich zum Speichern von Daten hat, können Sie persistente Daten in einem Bereich des Flash-Speichers speichern, der nicht vom Programmcode verwendet wird. Dies ist nur für Daten sinnvoll, die selten aktualisiert werden (z. B. Konfigurationsdaten oder Benutzereinstellungen), da die Anzahl der Neuschreibungen des Flash begrenzt ist (normalerweise mindestens 10.000 Lösch-/Schreibzyklen). Der Vorteil des Speicherns von Daten auf diese Weise besteht darin, dass sie nicht verloren gehen, wenn die MCU von der Stromversorgung getrennt wird. Ohne eine Art nichtflüchtigen Speicher müssten Sie über einen batteriegepufferten RAM verfügen, um Daten während des Herunterfahrens der Stromversorgung zu speichern.

Der zweite Grund dafür, einem Programm zu erlauben, in den Flash zu schreiben, besteht darin, dass es ermöglicht, Programme entfernt im Feld zu aktualisieren. Dazu benötigen Sie einen Teil des Programms, der die ganze Zeit resident ist (der Teil, der den neuen Code in den aktualisierbaren Teil des Flash-Speichers schreibt), und ein Mittel zum Herunterladen des aktualisierten Codes (z , usw.). Sie möchten sicherstellen, dass der immer residente Teil des Codes so fehlerfrei wie möglich ist, da es schwieriger ist, ihn zu aktualisieren.

Der "zweite Grund" wird normalerweise als Bootloader bezeichnet.