Forum: Compiler & IDEs Codegröße mit __flash-keyword


von Masl (Gast)


Lesenswert?

Mahlzeit,

ich benutze hier einen avr-gcc 4.7.2.
Wollte mal das keyword __flash ausprobieren, also hab ich damit eine 
Struktur die genau 42 Byte groß ist (und initialisiert wird) ins __flash 
gelegt.

Erfreulicherweise wird der RAM-Verbrauch dadurch um 42 Byte kleiner. Es 
wird also keine Kopie der Struktur mehr im RAM angelegt.

Seltsamerweise wird auch der Code um genau 42 Byte kleiner.

Freut mich zwar, aber woher resultiert das?
Ist das der Code, der normalerweise die Struktur ins RAM kopiert?
Und, entstehen eigentlich durch den Flashzugriff zur Laufzeit 
irgendwelche Performanceeinbußen?

Gruß,
Masl

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Masl schrieb:
> Mahlzeit,
>
> ich benutze hier einen avr-gcc 4.7.2.
> Wollte mal das keyword __flash ausprobieren, also hab ich damit eine
> Struktur die genau 42 Byte groß ist (und initialisiert wird) ins __flash
> gelegt.
>
> Erfreulicherweise wird der RAM-Verbrauch dadurch um 42 Byte kleiner. Es
> wird also keine Kopie der Struktur mehr im RAM angelegt.
>
> Seltsamerweise wird auch der Code um genau 42 Byte kleiner.

Was genau meinst du mit "Code"?

> Freut mich zwar, aber woher resultiert das?
> Ist das der Code, der normalerweise die Struktur ins RAM kopiert?

Nein der bleibt gleich.  Es sei denn es liegt nix in .data, dann wird 
der entsprechende Code (libgcc.a!__do_copy_data) auch nicht gelinkt.

Im Zweifelsfalle Assembler-Listing, Disassambly, Map-File, etc. 
anschauen.  Dann hast du's Byte für Byte :-)

> Und, entstehen eigentlich durch den Flashzugriff zur Laufzeit
> irgendwelche Performanceeinbußen?

Ja, kann sein. Kann aber auch sein dass der Code etwas schneller / 
kleiner wird.

von Bastler (Gast)


Lesenswert?

Bei globalen Variablen wird in der Regel LDS rn,<16bit-addr> verwendet, 
Flash braucht LPM, was nur über das Z-Reg geht. Ersteres braucht 4-Byte 
Befehle, zweiteres ein freies Z-Reg. Besser als Konstanten im RAM 
abzulegen ist das aber sicher. Den diese müssen, falls sie nicht 0 sind, 
irgendwie initialisiert werden. Dieser Initialwert steht natürlich auch 
im Flash. Und zudem bleiben sie konstant, sozusagen ein Hardware -
1
const

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.