Das funktionier soweit auch.
Das Array menu_item_01 liegt im Flash.
Aber welchen Vorteil die oben genannte Methode gegenüber der Folgenden:
1
voidmain(void)
2
{
3
charmenu_line[5][20];
4
strcpy(menu_line[0],"Hauptmenu");
5
LCD_PutStr(10,110,&menu_line[0][0]);
6
}
Bei der Variante liegt doch der Text auch im Flash, und wird von dort
verarbeitet.
Vom Gefühl her würde ich sagen, das die untere Methode etwas weniger
Speicher braucht, da ja auch bei der oberen der Text irgendwo im Flash
steht, und dann in menu_item_01 geladen wird.
außerdem sollte das untere doch schneller sein.
gast wrote:
> Bei der Variante liegt doch der Text auch im Flash, und wird von dort> verarbeitet.
Nein, er liegt im RAM und wird auch von dort verarbeitet.
> Vom Gefühl her würde ich sagen, das die untere Methode etwas weniger> Speicher braucht
Im Gegenteil, denn der Text ist dort 2 mal vorhanden. Einmal im RAM und
im Flash, denn der Text im RAM muss ja auch von irgendwo her
initialisiert werden.
Ich meine die Nackten Buchstaben.
Mal angenommen sie würden wirklich im RAM liegen, dann würde bei der
ersten Methode ebenfalls RAM verbraucht werden, und zusätzlich noch
Flash.
Oder sehe ich den Wald vor lauter Bäumen nicht mehr ?!
weil hier:
"const char menu_item_01[] PROGMEM = "Hauptmenu";"
die Variable geladen wird.
ich denke wir reden an ein einander vorbei.
Der Text selbst, muss ja irgendwo in irgendeinem Speicher liegen, bevor
er in eine Variable geladen wird.
> Bei der Variante liegt doch der Text auch im Flash
Ja
> und wird von dort verarbeitet
Nein!
Der String wird von den init-Routinen noch vor dem Aufruf der main
Funktion in den RAM kopiert und dann von dort verarbeitet. Im Endeffekt
liegt er also sowohl im Flash als auch im Ram (und wird dann von Dir vor
der Ausgabe gleich nochmal im RAM umherkopiert)
PS: Du solltest Dir unbeding nochmal die Verwendung von
Zeichenketten/Strings und Arrays und den Zusammenhang zwischen Bedidem
anschauen! Deine lokale Variable "menu_line" ist ziemlicher Schwachsinn.
in "menu_line" lade ich den Text rein, welchen ich anzeigen möchte.
das hängt natürlich davon ab, wo man sich in dem Menü befindet.
bei der Variante 1 habe ich das problem, das ich "pgm_read_word" nicht
an die Funktion "LCD_PutStr" übergeben kann.
> NEIN. Wie kommst du nur darauf?
Der Text an sich muss doch irgendwo im Flash liegen.
wenn das programm startet (init-Routinen), läd er den text in die
variable "menu_item_01" im Flash. (variante 1)
> Der Text an sich muss doch irgendwo im Flash liegen.> wenn das programm startet (init-Routinen), läd er den text in die> variable "menu_item_01" im Flash. (variante 1)
Die Variable liegt im Flash und enthält bereits den Text (dafür ist es
ja Flash), da wird beim Programmstart nichts kopiert (wie auch, dazu
müsste dann ja ins Flash geschrieben werden).
Also mal etwas ausführlicher:
Variante 1:
Der Text "Hauptmenu" steht im Flash und wird in dieser Zeile
vom Flash in das Array im RAM kopiert.
(Effizienter wäre es, ein modifiziertes LCD_PutStr zu schreiben, das den
Text direkt aus dem Flash holen kann)
Variante 2:
Der Text steht im RAM und wird in dieser Zeile
1
strcpy(menu_line[0],"Hauptmenu");
vom RAM ins RAM (Array) kopiert. Zusätzlich steht er auch noch im Flash,
um den Text im RAM bei Programmstart initialisieren zu können.
@ Stefan Ernst:
alles klar. jetzt ist der Groschen gefallen.
Das mit der Modifizierten Funktion ist auch ein guter Tipp.
Da werde ich mal drauf zu arbeiten.
Das bedeutet, das der Compiler aus "const char menu_item_01[] PROGMEM =
"Hauptmenu";" etwa einen Bereich im Flash definiert, in dem schon der
Text steht.
Bzw. werden die Variablen mit "PROGMEM" nur beim Compilieren definiert,
und nicht bei jedem Programm Aufruf neu definiert !?
Vielen dank.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.