Ich weiss, dass hier die meisten zwar auf AVR schwören, aber vielleicht kann doch jemand helfen: Ich verwende MPLAB IDE V8.00 mit dem Target Device "dspic30f4013". Nun kann ich C-Applikationen zwar schön übersetzen, jedoch hätte ich auch gerne die Location meiner globalen Variablen im mapfile. Das funktioniert aber nur, wenn man die Variable deklariert als int myvar; // ausserhalb jeder funktion, also global Nun verstehe ich nicht, wieso dies nicht funktioniert, wenn ich die Variable in einer Funktion als static int myvar; // in der funktion, aber statisch deklariere. Diese Variablen sind doch ebenfalls im heap (klar, dass es zwei Funktionen geben kann mit gleichem Variablennamen, aber die müssten dann unterschiedlichen heap belegen)? Und alle meine Programme haben bisher immer funktioniert, wenn man globale Variablen als statisch zusätzlich deklariert (wozu auch immer...): static int vmyvar; // ausserhalb jeder funktion + static Auch in diesem Fall scheint nichts im map file auf. Was ist denn hier der Unterschied zu der Variante ohne static ? Vielleicht kann wer was dazu beitragen... Vielen Dank
Hallo, das ist nicht nur beim PIC so. Das Ganze ist vom Compiler abhängig. Der Diab Compiler für den MPC555 macht das auch so. Du siehst dann im map-file nur, dass die Funktion xyz einen gewissen Pool im RAM belegt. Da der Maschinencode sowieso nur mit Adressen rechnet, braucht er diese explzite Anweisung nicht. Auch wenn das nicht sehr benutzerfreundlich ist. Gruß Matthias
Ich habe gerade rausgefunden: Eine globale "static" variable hat ihren Gültigkeitsbereich nur im definierenden File. wenn man im File myfile.c static int myvar; definiert, so ist myvar auch nur in diesem File gültig. Wieso kann der Linker aber den Speicherort im Mapfile aber nicht bestimmen? Geht dies nicht, wegen der Eindeutigkeit? Das kanns ja wohl nicht sein... Es könnte der gleiche Grund sein, warum statische Funktionsvariablen auch nicht gehen. Dass automatische Variablen nicht zu sehen sind ist ja klar ;-) Übrigens, sorry: Globale Variablen werden natürlich nicht am heap angelegt, der ist für dynamische Allokierung zuständig. Tut aber nichts zum Problem.
Hallo, noch mal zum mitschreiben: Der Linker weiss sehr wohl, wo die Variable zu finden ist. Sonst würde das Programm ja auch nicht laufen. Es sind zwei verschiedene Paar Schuh, ob der Linker das weiss und ob es im map-file angezeigt wird. Das map-file ist nur eine Ausgabe für den Entwickler. Lokale Variablen in Funktionen können nicht im map-file angezeigt werden, da sie entweder auf dem Stack oder in Registern gehalten werden. Sorry, aber ich dachte, Du hättest die Grundlagen schon verstanden. Gruß Matthias
Ich habe mich vielleicht nicht klar ausgedrückt: Nochmals: Ich interessiere mich 1) Für das map-file und nicht für den Linkprozess. und will wissen 2) warum statische (!!) Funktions-Variablen, im prodzierten map-File nicht enthalten sind, bzw. ob man das irgendwo einstellen kann, damit es doch geht. In einem anderen Linker (Keil) funktioniert das z.B. anstandslos, ohne dass man es extra einstellen muss. Daher die Frage. Grüße Michael
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.