Codegröße mit __flash-keyword

Gast #3842098
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
Persönliche Seite #3842534
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.
Gast #3842645
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren