Forum: Mikrocontroller und Digitale Elektronik PIC Programmierung in C


von schnudl (Gast)


Lesenswert?

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

von Matthias Kölling (Gast)


Lesenswert?

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

von schnudl (Gast)


Lesenswert?

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.

von Matthias Kölling (Gast)


Lesenswert?

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

von schnudl (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.