Forum: Mikrocontroller und Digitale Elektronik PIC24F - Variablen in C-compiler überschreibungssicher definieren


von Hilfloser Wurm am Rande des Universums (Gast)


Lesenswert?

Hallo,

ich bin eher der Assemblerfuzzi und habe nun das Problem, dass ich ein 
C-Programm für einen PIC24F machen will.
Compilermantel ist der MPLAB C30, welcher offenbar laut Compilermeldung 
den hier allseits bekannten gcc nutzt.

Nun bin ich ein verdammter Nobody mit diesem Compiler und generell alles 
andere als ein C-Könner und weiß nicht, wie man eine Variable so 
definiert, dass deren Speicherplatz garantiert nicht irgendwo doppelt 
belegt ist.
Dieses Gefühl beschleicht mich hier aber, da ich je nach Platzierung von 
Dummybytes in der globalen Varibalendeklaration teilweise ein komplettes 
Fehlverhalten habe und dies eigentlich nur durch ungewollt veränderte 
Variablenwerte auftreten kann.

Ich definiere sowohl die globalen als auch die lokalen Variablen alle 
ganz primitiv mit z.B.:

unsigned int variable_1;

Jetzt gibt es ja noch die vielen Zustatzdeklarationen wie z.B. private, 
volatile, static usw.
Welche davon muss ich nehmen, damit mir der C-Compiler garantiert keine 
Doppelbelegung verursacht?
Oder kann es auch am Stackspeicher liegen, den der Compiler anscheinend 
selbst anlegt (ich wüsste nicht wie ich das selbst in C steuern kann)

Ich weiss, das sind die voll dummen Fragen, aber deren Lösung für mich 
essentiell, sonst muss ich für immer und ewig in der Assemblerwelt 
bleiben!

muchas grazias Senores e Senoritas im voraus!

von Lehrmann M. (ubimbo)


Lesenswert?

Hilfloser Wurm am Rande des Universums schrieb:
> Welche davon muss ich nehmen, damit mir der C-Compiler garantiert keine
> Doppelbelegung verursacht?

Was heißt denn Doppelbelegung? Erklär das mal bitte? Meist du der 
Compiler überschreibt einfach so Variablen die später im Programmablauf 
noch benötigt werden? Nein tut er nicht.

Hilfloser Wurm am Rande des Universums schrieb:
> muchas grazias Senores e Senoritas im voraus!

Das heißt 'muchas gracias' by the way

von Programist (Gast)


Lesenswert?

Das ist das Problem mit Compilern, bevor man sie nutzen kann, muss man 
lernen wie sie funktionieren.Und weil sie sehr complex sind kann das 
eine Weile dauern.

von Hilfloser Wurm am Rande des Universums (Gast)


Lesenswert?

muchas gracias Michael,

>Was heißt denn Doppelbelegung? Erklär das mal bitte? Meist du der
>Compiler überschreibt einfach so Variablen die später im Programmablauf
>noch benötigt werden? Nein tut er nicht.Was heißt denn Doppelbelegung? >Erklär 
das mal bitte? Meist du der
>Compiler überschreibt einfach so Variablen die später im Programmablauf
>noch benötigt werden? Nein tut er nicht.

Doch das glaube ich eben (d.h. ich weiss es nicht).
Wenn ich z.B. global definiere:

unsigned int variable_1;
unsigned int variable_2;
unsigned int variable_3;
unsigned int intarry1[10];
unsigned int variable_4;
unsigned int dummy1[50];
unsigned int variable_5;

so funktioniert ein bestimmter Teil meiner Software einwandfrei, ein 
anderer jedoch nicht.
Nehme ich z.B. dann das unbenutzte Variablenarray dummy1[50] raus:

unsigned int variable_1;
unsigned int variable_2;
unsigned int variable_3;
unsigned int intarry1[10];
unsigned int variable_4;
unsigned int variable_5;

so geht fast gar nichts mehr. Ich habe erst nach dem Auftreten komischer 
Phänomene mit eingefügten Dummybytes (welche ich nicht nutze!) 
experimentiert und damit komplett unterschiedliche Programmabläufe 
erhalten.

Daher meine Frage, wie ich sicher gehen kann, dass ein Variable niemals 
vom Stack oder sonstwoher mitbenutzt wird. Alles static deklarieren???

Also Speicherplatz hätte ich genug und bin nicht auf 
Compileroptimierungen angewiesen!

von Hilfloser Wurm am Rande des Universums (Gast)


Lesenswert?

>Das ist das Problem mit Compilern, bevor man sie nutzen kann, muss man
>lernen wie sie funktionieren.Und weil sie sehr complex sind kann das
>eine Weile dauern.

Ja, scheint so. Aber offenbar hänge ich ja an etwas Grundlegendem.

von Frank K. (fchk)


Lesenswert?

Hilfloser Wurm am Rande des Universums schrieb:

> Daher meine Frage, wie ich sicher gehen kann, dass ein Variable niemals
> vom Stack oder sonstwoher mitbenutzt wird. Alles static deklarieren???

Solange Du eine Programmierumgebung verwendest, in der es Pointer gibt, 
kannst Du das nicht verhindern. Ein Pointer könnte irgendwo in die 
Wicken zeigen, oder wenn irgendwo ein char[] über sich selber und sein 
Ende hinauswächst, dann war es das.

Wirklich sicher in dieser Hinsicht bist Du nur in Java oder C# oder so. 
Aber dieses Zeugs willst Du aus anderen Gründen nicht auf Deinem PIC24 
haben.

fchk

von (prx) A. K. (prx)


Lesenswert?

Hilfloser Wurm am Rande des Universums schrieb:

>>Compiler überschreibt einfach so Variablen die später im Programmablauf
>>noch benötigt werden? Nein tut er nicht.
>
> Doch das glaube ich eben (d.h. ich weiss es nicht)

Der Compiler überschreibt es nicht. Aber du. Vielleicht schreibst du mit 
wirrem Index jenseits der 10 in intarry und landest deshalb irgendwo 
dahinter. Mit dummy-Array dort, ohne es an einer Stelle wo es mehr 
Schaden anrichtet.

C Compiler mit Indexüberprüfung sind nicht direkt üblich. Wenn das 
unverzichtbar ist, weil du den Programmfehler anders nicht findest, dann 
musst du dir eine Programmiersprache suchen, die einen Array-Index 
überprüft.

von Hilfloser Wurm am Rande des Universums (Gast)


Lesenswert?

>Der Compiler überschreibt es nicht. Aber du.

D.h. die einfachen Variablendeklarationen ohne Zusatz von static o.ä. 
genügend vollkommen?
Diese Aussage möchte ich hören, das reicht mir vorerst.

Dann kann ich anderer Stelle weitersuchen. Evtl. auch die 
Stackproblematik, da ich nicht weiß, wie der Compiler das händelt. Aber 
das wird wohl irgendow im Handbuch des C-Compilers zu finden sein.

von nocheinGast (Gast)


Lesenswert?

Hilfloser Wurm am Rande des Universums schrieb:
> D.h. die einfachen Variablendeklarationen ohne Zusatz von static o.ä.
> genügend vollkommen?
Richtig erkannt...

von Hilfloser Wurm am Rande des Universums (Gast)


Lesenswert?

>Richtig erkannt...

DANKE!

von Dieter W. (dds5)


Lesenswert?

Wenn das Programm einigermaßen übersichtlich ist, hilft vielleicht auch 
das Aktivieren des "disassembly window".
Dort kann man sich durch den erzeugten Assemblercode (single)steppen und 
im "watch window" die Werte der Variablen und Register verfolgen.

von Hilfloser Wurm am Rande des Universums (Gast)


Lesenswert?

Danke Dieter,

das mache ich zukünftig.
Ich habe jetzt (ziemlich planlos, da die Anleitungen zu lesen ja Tage 
und Wochen dauern) bei den Linker-Einstellungen rumgespielt und die 
Option

"Don't initialize data sections"

angeklickt.
Und siehe da, ich kann jetzt machen was ich will, meine Software läuft 
in sämtlichen Varianten!!!
So ein sch..., dass ich mich in der ganzen Linker- C- und sonstnoch Welt 
überhaupt nicht auskenne.

Danke an alle.
Der Fehler liegt also in den tieferen Weihen der Linkereinstellung in 
Verbindung mit meinem amateurhaften Programmaufbau begraben...

von Arc N. (arc)


Lesenswert?

Hilfloser Wurm am Rande des Universums schrieb:
> Danke Dieter,
>
> das mache ich zukünftig.
> Ich habe jetzt (ziemlich planlos, da die Anleitungen zu lesen ja Tage
> und Wochen dauern) bei den Linker-Einstellungen rumgespielt und die
> Option
>
> "Don't initialize data sections"
>
> angeklickt.
> Und siehe da, ich kann jetzt machen was ich will, meine Software läuft
> in sämtlichen Varianten!!!
> So ein sch..., dass ich mich in der ganzen Linker- C- und sonstnoch Welt
> überhaupt nicht auskenne.

Jein, "Don't initialize data sections" heißt nichts anderes als das sich 
der Compiler/Linker in diesem Fall nicht standardkonform verhält und 
globale Variablen nicht mehr initialisiert (d.h. auf Null setzt, wenn 
nichts anderes angegeben ist)

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.