www.mikrocontroller.net

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


Autor: rweber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Niels Hüsken (monarch2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht deine Frage irgendwie genauer? Wie welcher Effekt zu stande kommt?

Autor: rweber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rweber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_ove...

Gruss,
rweber

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.