mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC Programmierung in C


Autor: schnudl (Gast)
Datum:

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

Autor: Matthias Kölling (Gast)
Datum:

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

Autor: schnudl (Gast)
Datum:

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

Autor: Matthias Kölling (Gast)
Datum:

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

Autor: schnudl (Gast)
Datum:

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

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.