Servus, ich habe da ein Verständnisproblem, wo ich einfach nicht weiterkomme: Im "Cx51 Compiler Users 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 linkers 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
Geht deine Frage irgendwie genauer? Wie welcher Effekt zu stande kommt?
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.