PIC24F - Variablen in C-compiler überschreibungssicher definieren

Gast #2221281
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!
#2221302
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
Gast #2221317
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!
Gast #2221321
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.
#2221331
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
#2221335
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.
Gast #2221341
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.
Gast #2221420
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...
#2221455
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren