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
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.
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.
Hallo, ich kann leider mit dem map-file so gar nichts anfangen. Ich hänge einfach mal das file an, es wäre nett wenn du mir erklären/zeigen könntest wo das Symbol herkommt.
Das ist ein Datenarray im Flash, was irrtümlich im Listing als Code dargestellt wird.
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 |
Das was da im .lss fälschlicherweise unter __trampolines_end als Code angezeigt wird dürfte tatsächlich der Inhalt von 'font_standard' sein.
(Vom Handy aus, deswegen nicht angemeldet) War also so wie vermutet :D Danke an alle
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.