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!
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
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.
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!
>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.
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
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.
>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.
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.
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...
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)