Frage zum Keil Linker (8051)

Gast #273612
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
Gast #273614
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
Gast #273615
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
Gast #273616
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
Gast #273617
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

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