Forum: Mikrocontroller und Digitale Elektronik Frage zum Keil Linker (8051)


von rweber (Gast)


Lesenswert?

Servus,

ich habe da ein Verständnisproblem, wo ich einfach nicht weiterkomme:

Im "Cx51 Compiler User’s Guide" steht unter "Uncalled Functions"

If you unexpectedly run out of memory, be sure to check for linker
warnings relating to uncalled or unused routines. You can use the
linker’s IXREF directive to include a cross reference list in the
linker map (.M51) file.

Soweit sogut. Nur würde mich aber interessieren wie dieser Effekt
zustande kommt. Irgendwelche Vorschläge?

Gruss und besten Dank,
rweber

von Niels H. (monarch2)


Lesenswert?

Geht deine Frage irgendwie genauer? Wie welcher Effekt zu stande kommt?

von rweber (Gast)


Lesenswert?

Ok, ich probiers nochmal:

In der Entwicklungsphase habe ich verschiedene Funktionen,
verteilt auf verschiedene .c Files, welche nicht von main() oder
sonstwo aus aufgerufen werden. Der Linker meldet dies als Warnung
was ja in Ordnung ist, aber auch nicht weiter weh tut.

Mir ist jedoch aufgefallen, wenn ich Funktionsaufrufe im main()
auskommentiere, mein fertiges Programm MEHR Platz im Data Segment
benoetigt und nicht weniger. So ca. 3-8 Bytes pro nicht aufgerufener
Funktion. Das läppert sich so zusammen und irgendwann sind die
128 Data Bytes verbraten :-(

Genau dieser Effekt ist ja von Keil in dem von mir oben zitieren
Ausschnit aus dem Manual beschrieben.

Meine Frage ist: Wie kommt es dazu? Wofür verwendet/benoetigt der
Linker Speicher für nicht aufgerufene Funktionen.

Die Anzahl der "verschwendeten" Bytes scheint irgendwie mit
der Anzahl und dem Typ der Übergabeparameter zusammenzuhängen.
Etwa so, als wird auf dem Stack reserviert, für Funktionen, die
nicht aufgerufen werden.

Ich hoffe, ich habe mich halbwegs verständlich ausgedrückt :-)

Gruss,
rweber

von peter dannegger (Gast)


Lesenswert?

Der Linker erzeugt einen Aufrufbaum und kann damit dann die lokalen
Variablen überlagern, d.h. von Funktionen, die nicht gleichzeitig
ausgeführt werden.

Fehlt nun der Aufruf, nimmt er an, daß diese Funktion ständig
ausgeführt wird, d.h. ein Überlagern ist nicht möglich.


Peter

von peter dannegger (Gast)


Lesenswert?

Der Linker ist auch ziemlich clever, er kann z.B. auch Variablen von
Funktionen überlagern, die per Pointer aus einer Liste aufgerufen
werden, z.B. durch einen Kommandointerpreter.


Peter

von rweber (Gast)


Lesenswert?

Danke Peter,

das war der richtige Hinweis.

Der Keil verwendet aufgrund des limitierten Data Bereichs des 8051
nicht den klassichen C Stack-Frame der dynamisch wachsen kann,
sondern erzeugt sich beim Kompilieren durch das Parsen des Call-Tree
eine Statischen Stack um Memory zu sparen. Respekt.

Da bin ich aber froh dass ich in C Programmiere und mir der Linker
das abnimmt. Könnte mir vorstellen, dass in Assembler das manuelle
parsen den Call-Trees nicht unbedingt Spaß macht.

Zur vollständigket, habe ich bei Keil gefunden:
http://www.keil.com/support/man/docs/lx51/lx51_overlaying.htm

Gruss,
rweber

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.