Hallo ich hoffe diese Frage gehört in dieses Forum, weil ich noch neu hier bin und mich noch nicht so auskenne... Ich habe ein Problem mit den Variablen. Immer wenn ich eine Variable im atmel studio deklariere funktioniert sie nie... . Im Anhang ist einen kleines Testprogramm, dass nicht funktioniert und ich weiß nicht warum: 1)Wenn der Simulator läuft, werden die Variablen "ignoriert" und mit der Funktion ADD WATCH, der Variablen, steht "unknown location" -> also sie werden nirgens im ram abgelegt. 2)Wenn ich die Zeile "unsighnt char...." zwischen #include und Hauptprogramm schreibe, dann liegt x richtig im Ram und pcvar liegt im flash auf 0x0000?!?! (ich kann sie auch dann im Programm nicht ändern...) Entweder ich versteh die Deklerationen der Variablen nicht und mache selber etwas falsch oder der Compiler macht blösin (weil z.B. mit dem C51-compiler in unserer Schule kann man die "speicherorte" selbst auswählen [ist das auch mit dem GCC-Compiler möglich?]) Ich wäre dankbar wenn mir jemend MEINEN "Gedankenfehler" ausbessert und vieleicht ein paar Tipps über die Speichertypen geben würde, weil mit den Datentypen finde ich mich soweit zurrecht. Danke!
Du solltest mit deinen Variabelen auch etwas "sinnvolles" machen, sondt werden sie einfach wegoptimiert. Vielleicht hilft das:
1 | while(1){ |
2 | x++; |
3 | if(x > 10) |
4 | {
|
5 | pcvar = 7; |
6 | x = 0; |
7 | }
|
8 | }
|
Wie Daniel schon angedeutet hat, merkt der Compiler, daß Dein Programm nichts sinnvolles tut. Du weist den Variablen in der SChleife zwar Werte zu, aber sonst passiert nichts mit denen -> ergo ignoriert der Compiler diese Variablen und legt sie gar nicht erst an. Deshalb kann der Debugger sie nicht sehen. Schau Dir mal die Optimierungseinstellugen Deines Compilers an, die kann man auch abschalten. (-O0)
Hans Wernerle schrieb: > Entweder ich versteh die Deklerationen der Variablen nicht und mache > selber etwas falsch oder der Compiler macht blösin Der Compiler macht keinen Blödsinn. Aber er optimiert. Zum Beispiel optimiert er alles weg, was keinen Effekt auf das Programm hat, ausser Laufzeit und/oder Speicher zu verbrauchen. Eine Berechnung, deren Ergebnis für nichts benutzt wird, fliegt raus. Weil ja das Ergebnis dieser Berechnung keinen von aussen sichtbaren Effekt hat. Eine lokale Variable, die in keiner Berechnung vorkommt, fliegt raus. Weil sie ja offensichtlich eh keiner braucht.
also das x funktioniert schon, aber das pcvar noch nicht... -> also wirds an dem liegen, dass nichts sinvolles gemacht wird ;). ich sag mal danke, aber kann man die variablen auch manuel definieren, ob sie z.B. im Register, Ram... liegen? Oder macht das alles der Compiler? Weil wenn ich z.B. das Programm zwischendurch testen will und NOCH nichts sinvolles mit den Variablen gemacht habe, könnte ich ja nie den Test durchführen... ... und das mit dem Optimierungsgrad werd ich mir mal ansehen, was wahrscheinlich dann meine frage über die manuelle definietion erübrigt.
Hans Wernerle schrieb: > ich sag mal danke, aber kann man die variablen auch manuel definieren, > ob sie z.B. im Register, Ram... liegen? Oder macht das alles der > Compiler? Im Normalfall: ja, das macht der Compiler. Dazu hat man ihn ja, dass er sich um die schmutzigen Dinge kümmert. > Weil wenn ich z.B. das Programm zwischendurch testen will und > NOCH nichts sinvolles mit den Variablen gemacht habe, könnte ich ja nie > den Test durchführen... Na ja. Was willst du denn da testen? Ob der Compiler eine Variable anlegt? Der legt sie schon an, wenn sie gebraucht wird. Ich versteh schon, dass du noch Anfänger bist. Aber das was du momentan 'testen' nennst, ist in Wirklichkeit kein testen. Du 'testest' ja auch nicht, ob der Compiler eine for-Schleife richtig umsetzt, sondern gehst davon aus, dass er das tut. Sonst wär das ja kein Compiler, wenn er bei solchen Kleinigkeiten aussteigen würde. Schreib einigermassen sinnvolle Programme, zb. die üblichen ersten Programme, in denen ein Port auf Ausgang gesetzt wird; häng ein paar LED an die Ausgänge und erzeug Muster - zb in dem du ein x inkrementierst und an den Port ausgibst. Da hast du mehr davon, als mit solchen Primtiv-Tests, die im Grunde nichts aussagen.
ich muss für meine diplomarbeit in der HTL eh kompliziertere Programme machen... aber ich bin nicht so vertraut mit dem Compiler und wollte deshalb so kleine Tests durführen, um ein wenig zu lernen was der Compiler da tut, bin nämlich vom Assambler gewohnt sich über jeden ....-dreck sich gedanken zu machen ;) sag aber trotzdem nochmal Danke und ein Lob für das Forum, weil man da sehr schnell die Antworten bekommt!
Du kannst das Programm mit -save-temps -fverbose-asm erzeugen und dir das s-File (asm) durchlesen, wenn du magst auch das i-File (reines C ohne #). http://www.rn-wissen.de/index.php/Assembler-Dump_erstellen_mit_avr-gcc
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.