Hallo zusammen
Bin gerade dabei mir eine "schöne" Menue Struktur zu zimmern. Nun hab
ich mir den AVRButterfly als vorlage genommen.
DIeser wird in vielen LCD Threads hier als vorlage verwendet. Nun hab
ich da noch eine frage:
Was bedeutet dieses __flash?
Quelltext AVR Butterfly:
Oliver Schmutz schrieb:> DIeser wird in vielen LCD Threads hier als vorlage verwendet. Nun hab> ich da noch eine frage:>> Was bedeutet dieses __flash?
Dein AVR hat 3 Typen von Speicher eingebaut
EEPROM vom Programm aus beschreibbar, vom Programm aus
lesbar. Behält seinen Inhalt auch nach dem
Stromabschalten. Langsam im Zugriff.
SRAM beschreibbar, lesbar, schnell, aber leider: nach dem
Stromabschalten ist der Inhalt weg
FLASH nur lesbar. zum Beschreiben braucht man einen
externen Programmer oder einen Bootlader im AVR
selber.
Dort wird normalerweise das Programm abgespeichert
man kann aber auch natürlich konstante Daten dorthin
verfrachten. Der Zugriff ist zwar etwas aufwändiger
verglichen mit dem SRAM, aber wenn das keine Rolle
spielt ...
Geht auch nicht beim Stromabschalten verloren, und
der AVR hat, im Gegensatz zu den anderen beiden
Speicherarten jede Menge davon.
Was also denkst du, wird wohl das __flash in deinem C-Programm bedeuten?
naja....Sinn ergibt das für mich noch nicht ganz. Warum sollte er das
Struct explizit ins flash schreiben?..mache ich ja sowieso beim
Programmiervorgang. Und isn eeprom erscheint mir auch nicht besonders
sinnvoll.
Wo liegt da bei mir der Denkfehler?
Danke für die schnelle Antwort.
Gruss Oli
Oliver Schmutz schrieb:> naja....Sinn ergibt das für mich noch nicht ganz. Warum sollte er das> Struct explizit ins flash schreiben?
Weil dein AVR zb 16kByte Flash hat, aber nur 2kByte SRAM
Also zur kontrolle: Wenn ich die Texte nicht mit __flash speichere dan
schreibt er die ins SRAM? Dan wären die nach Power on/off nicht mehr da?
Irgendwie blick ich da noch nicht durch.
Hab auch schon LCD menue mit switch case erstellt. Da hab ich noch nie
was exlizit ins flash laden müssen. Und nach power on/off wars noch da.
Sorry für die schwierigkeiten.
Gruss Oli
Oliver Schmutz schrieb:> Also zur kontrolle: Wenn ich die Texte nicht mit __flash speichere dan> schreibt er die ins SRAM?
Beides :-)
Denn irgendwie müssen die Texte ja nach dem Einschalten ja erst mal ins
SRAM kommen.
> Dan wären die nach Power on/off nicht mehr da?> Irgendwie blick ich da noch nicht durch.
Wenn dein Programm hochfährt sorgt die System-Initialisierung dafür,
dass das SRAM seine von dir vordefinierten Werte bekommt. Im Falle von
Texten bleibt aber nichts anderes übrig, als die vom Flash ins SRAM zu
kopieren, damit sie das Programm dann auch dort vorfindet.
> Da hab ich noch nie> was exlizit ins flash laden müssen.> Und nach power on/off wars noch da.
Das ist eine Spezialität des IAR COmpilers. Der legt alles was mit const
definiert wurde, automatisch ins Flash. Hat seine Vorteile, hat aber
auch seine Nachteile.
Also das heisst wen ich die die Struct mit __flash angebe kopiert er
diese nicht ins SRAM? Köennte man das so sagen? Oder wo liegt den jetzt
hier der Vorteil?
Die Texte würde er ja sowieso ins SRAM schreiben. Also wäre das __flash
in dieser Zeile eigentlich hinfällig?
__flash char MT_AVRBF[] = "AVR Butterfly";
Oder nicht?
Gruss Oli
Oliver Schmutz schrieb:> Also das heisst wen ich die die Struct mit __flash angebe kopiert er> diese nicht ins SRAM? Köennte man das so sagen?
An dieser Stelle:
Das steht mit Sicherheit alles mehr oder weniger ausführlich in deiner
Compilerdoku.
> Die Texte würde er ja sowieso ins SRAM schreiben.
Sagt wer?
> Also wäre das __flash> in dieser Zeile eigentlich hinfällig?> __flash char MT_AVRBF[] = "AVR Butterfly";>
Warum soll das hinfällig sein?
Wenn ich weiß, dass sich dieser Text sowieso nie unter Prgorammkontrolle
ändern wird, brauch ich ihn auch nicht im SRAM haben. Und schon sind
wieder 14 Bytes eingespart, die ich für Berechnungsvariablen sinnvoller
verwenden kann.
Aber: Details dazu stehen in deiner Compilerdoku, wie das wirklich
gehandhabt wird.
Karl heinz Buchegger schrieb:> Oliver Schmutz schrieb:>> Also das heisst wen ich die die Struct mit __flash angebe kopiert er>> diese nicht ins SRAM? Köennte man das so sagen?>> An dieser Stelle:> Das steht mit Sicherheit alles mehr oder weniger ausführlich in deiner> Compilerdoku.
okey. Werde ich mir anschauen.
>> Die Texte würde er ja sowieso ins SRAM schreiben.>> Sagt wer?
hab ich irgendwie aus deiner aussage oben so interpretiert:
>Wenn dein Programm hochfährt sorgt die System-Initialisierung dafür,>dass das SRAM seine von dir vordefinierten Werte bekommt. Im Falle von>Texten bleibt aber nichts anderes übrig, als die vom Flash ins SRAM zu>kopieren, damit sie das Programm dann auch dort vorfindet.>> Also wäre das __flash>> in dieser Zeile eigentlich hinfällig?>> __flash char MT_AVRBF[] = "AVR Butterfly";>>>> Warum soll das hinfällig sein.> Wenn ich weiß, dass sich dieser Text sowieso nie unter Prgorammkontrolle> ändern wird, brauch ich ihn auch nicht im Flash haben.
du meinst nicht ins RAM? oder wie jetzt?
> Und schon sind> wieder 14 Bytes eingespart, die ich für Berechnungsvariablen sinnvoller> verwenden kann.
Danke für deine Hilfe. Gruss Oli
Oliver Schmutz schrieb:>> Wenn ich weiß, dass sich dieser Text sowieso nie unter Prgorammkontrolle>> ändern wird, brauch ich ihn auch nicht im Flash haben.>> du meinst nicht ins RAM? oder wie jetzt?
War ein Tippfehler von mir, den ich in der Zwischenzeit korrigiert
hatte.
Aber du hast mitgedacht. Ja, ich meinte SRAM
Ich weiß dass der Artikel schon älter is, aber ich hol ihn trotzdem mal
aus der Versenkung.
Wo findet sich den der gesamte Quellcode zu obigem Codelisting? Hab da
jetzt online nix (mehr?) gefunden...
Danke^^