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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.