Frage:
Wann soll PROGMEM verwendet werden?
Praveen Singh Yadav
2018-05-10 14:29:56 UTC
view on stackexchange narkive permalink

Ich glaube, PROGMEM wird verwendet, um große Datenmengen (z. B. Zeichenfolgen) zu speichern, die sich nicht ändern. So wird der SRAM frei.

in der Ardunio-Referenz wird Folgendes erwähnt.

"Die Verwendung von PROGMEM erfolgt ebenfalls in zwei Schritten. Nachdem die Daten in den Flash-Speicher übernommen wurden, wird dies getan erfordert spezielle Methoden (Funktionen), die auch in der Bibliothek pgmspace.h definiert sind, um die Daten aus dem Programmspeicher zurück in den SRAM zu lesen, damit wir etwas Nützliches daraus machen können. "

Wenn ich die laden muss Daten in den SRAM, bevor sie verwendet werden. Wie ist es dann effizienter, als direkt in den SRAM zu gelangen, indem es als normal definiert definiert wird?

... weil es nicht im SRAM * bleibt * ...
Drei antworten:
Majenko
2018-05-10 14:42:57 UTC
view on stackexchange narkive permalink

Angenommen, Sie haben eine Zeichenfolge mit 1000 Zeichen in Flash und möchten diese als seriell drucken. Ja, Sie müssen es in den Arbeitsspeicher laden, um diese Daten zum Drucken an den Ort zu übertragen. Aber müssen Sie alles auf einmal in den Arbeitsspeicher stellen? Nein, Sie benötigen jeweils nur einen Charakter. Anstatt 1000 Zeichen zu nehmen und 1000 Byte RAM zuzuweisen und den gesamten Shebang in den RAM zu kopieren und dann zu drucken, müssen Sie nur 1 Byte RAM * zuweisen und jedes Zeichen der Reihe nach kopieren und drucken.

Da Sie jeweils nur ein Zeichen aus dem Flash lesen können, ist es ohnehin nicht vorteilhaft, das gesamte Los zu lesen.


* Aufgrund von Compiler-Optimierungen berührt dies wahrscheinlich nie den Arbeitsspeicher und bleibt einfach erhalten ein CPU-Register.

Juraj
2018-05-10 15:12:24 UTC
view on stackexchange narkive permalink

Wenn Ihr Code eine konstante c-Zeichenfolge (char-Array) ohne F-Makro oder -Programm enthält, wird die Zeichenfolge beim Start in den Arbeitsspeicher kopiert und bleibt dort.

Wenn Sie eine Funktion verwenden Wenn Sie das F-Makro verwenden oder einen Zeichenpuffer mit einer bestimmten Größe erstellen und die Programmzeichenfolge in den Puffer kopieren, werden bei der Funktionsrückgabe die Variablen vom Stapel gelöscht und der Speicher freigegeben.

Wenn Sie ein großes Array in das Programm und dann in den Code einfügen, wenn Sie einen Wert in diesem Array suchen müssen, müssen Sie jeweils nur ein Array-Element in den RAM kopieren, nicht das ganzes Array.

Julian Goldsmith
2018-05-10 20:48:08 UTC
view on stackexchange narkive permalink

Wie Majenko sagte, müssen Sie nicht alles, was Sie im Flash-Speicher haben, auf einmal in den RAM legen. Sie können Elemente nach Bedarf in den SRAM verschieben und den Speicher wiederverwenden, sobald Sie fertig sind.

Sie können jedoch nicht jeweils nur ein Byte verschieben. In avr / pgmspace.h sind Funktionen definiert, die das Verschieben von Daten für Sie verarbeiten können.

Sie können beispielsweise Folgendes tun:

  const struct mystruct_s my_value PROGMEM = {value = 1234}; // ... struct mystruct_s working_copy; memcpy_P (&working_copy, &my_value, sizeof (struct mystruct_s)); int foo = working_copy.value / 2 ;  


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
Loading...