__trampolines_end, Was ist das?

Persönliche Seite #4173313
Lesenswert?

Hallo Forum,

ich habe mir gerade den Output des GCCs angeschaut.
Dabei ist mit aufgefallen, dass von den knapp 2350 Bytes Flash Speicher, 
die verbraucht sind, etwa ein drittel auf dieses ominöse 
__trampolines_end entfällt. Was macht diese "Funktion" (falls man es so 
nennen kann)?
Ich habe eine etwas größere Tabelle im Flash via PROGMEM gespeichert, 
hängt das vllt damit zusammen?

Wichtig wäre auch zu wissen ob und wie oft das ausgeführt wird, ich 
denke zwar nur einmal beim startup, aber fragen schadet ja nicht.

Danke schonmal
Gast #4173343
Lesenswert?

Soweit sich das von einem anderen Compiler übertragen lässt:
Trampolines gibt es, wenn man größere Adresssprünge beim Programmcounter 
nicht direkt durchführen kann. So kann man mit RJMP (relative Jump) beim 
AVR nicht beliebig weit springen, braucht für eine größere Sprungweite 
also eine Zwischenadresse, von der man weiterspringen kann - das 
Trampolin.
Persönliche Seite #4173393
Lesenswert?

N. G. schrieb:
> Was macht diese "Funktion" [__trampolines_end] ?

__trampolines_end ist ein im Linker-Description-File definiertes Symbol. 
"Trampolines" ist avr-gcc-Sprech für "Linker Stub".

Vermutlich hat __trampolines_end den gleichen Wert wie ein anderes 
Symbol, z.B. main.  Genaueres erfährst du aus dem Map-File.  Binutils 
können von einer Adresse nicht eindeutig auf ein Symbol schließen, und 
wählen dann ein Symbol mit passendem Wert für die Anzeige.

> von den knapp 2350 Bytes Flash Speicher, die verbraucht sind,
> etwa ein drittel auf dieses ominöse __trampolines_end entfällt.

__trampolines_end belegt als "reines" Symbol keinen Platz, und es gibt 
auch kein Objekt diesen namens.

Die Anzahl erzeugter Stubs ist  (__trampolines_end - 
__trampolines_start) / 4, aber vermutlich erzeugt dein Code kein 
einziges Stub.

Die für __trampolines_end angezeigte Größe gehört zu einem anderen 
Objekt.  Abermals cf. Map-File.
#4173698
Lesenswert?

Aus dem Mapfile ist deutlich zu erkennen, daß __trampolines_start bei 
0x00000068 beginnt und __trampolines_end ebenso an jener Adresse liegt. 
Auch das nachfolgende Objekt aus font.o liegt an derselben Adresse.

Das heißt, daß durch die Datenstruktur kein Platz belegt wird.
1
*(.progmem.gcc*)
2
                0x00000068                . = ALIGN (0x2)
3
                0x00000068                __trampolines_start = .
4
 *(.trampolines)
5
 .trampolines   0x00000068        0x0 linker stubs
6
 *(.trampolines*)
7
                0x00000068                __trampolines_end = .
8
 *(.progmem*)
9
 .progmem.data.font_standard
10
                0x00000068      0x2a0 ./DOGM/font.o

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