Hallo, ich saß gerade an einem kleinen Projekt und wunderte mich, warum mein Atmega8 irgendwie nicht das tat, was er meiner Meinung nach tun sollte. Da ich vor kurzem das Einsteigerset von myAVR erstanden hatte, programmierte ich ihn mit der mitgelieferten Software "SiSy". Da dieses leider keinen Debugger mitliefert, habe ich mal umgeschwenkt zum AVR Studio. Dort habe ich ein ganz einfaches kleines C Programm geschrieben, welches interessanterweise nicht funktioniert. Zuerst dachte ich, meine sämtlichen C Kenntnisse wären eingestaubt.. Eine Überprüfung im Visual Studio (mit exakt dem gleichen Programm) erwies sich allerdings als positiv, es funktioniert wunderbar. Ich weiß mir leider keinen Rat mehr, daher bitte ich hier um Hilfe, evtl. hat Jemand solch ein Problem schonmal gehabt? Um folgenden Code geht es: #include <avr/io.h> int main(){ int i; int a; while(1){ for (i=0;i<=5;i++){} i=0; for (a=0;a<=5;a++){} a=0; } } Das Programm ansich ist antürlich vollkommen Sinnlos, was aber ja nicht heißt das es deswegen nicht funktionieren darf. Ich deklariere mir zwei Variablen (i und a), laufe in eine endlose while Schleife und zähle dort in einer for Schleife i bis 5 hoch, komme dann aus dieser Schleife heraus und weise i wieder den Wert 0 zu. Das gleiche mache ich mit "a". Im Visual Studio funktioniert das ganze tadellos, das Programm bleibt in meinen Schleifen, zählt bis 5 , und kommt wieder heraus. So wie es sein sollte. Interessant wird das Ganze allerdings im AVR Studio Debugger. Hier läuft das Programm in die erste for Schleife, zählt bis 5 , setzt auf wundersame weise i SOFORT wieder auf 0 und bleibt in der ersten for Schleife kleben...für immer. Wo ist da bitte der Sinn? Was mache ich falsch? Gruß
Funghi schrieb: > Das Programm ansich ist antürlich vollkommen Sinnlos, was aber ja nicht > heißt das es deswegen nicht funktionieren darf. Doch, genau das. Insbesondere mit Optimierung. Ansonsten überleg mal, was eine Beendigung von main() für einen Sinn ergibt.
Probier mal statt der leeren Schleife irgendeine Anweisung reinzuschreiben. Z.B. d++; oder so.
Hier hat der OPtimizer zugeschlagen. Der hat rausgefunden, dass dein Programm sinnlos ist und hat es so zusammengekürzt, dass zwar die Variablen die richtigen Werte haben, aber alles was zeitaufwändig ist rausgeflogen ist. (Das meine ich ernst! Kein Scherz!)
A. K. schrieb: > Ansonsten überleg mal, was eine Beendigung von main() für einen Sinn > ergibt. Wie soll main() jemals beendet werden?
Funghi schrieb: > Zuerst dachte ich, meine sämtlichen C Kenntnisse wären eingestaubt.. Ja, könnte man so sagen. Der Compiler optimiert, wie oben bereits erklärt. Oft wird das für einen Compilerfehler gehalten, ist es aber nicht. Für Erklärung siehe den Verlinkten Artikel im Wiki.
Danke Euch, daran lags :-) Was µC-Programmmierung angeht bin ich noch frisch, aber man ist ja da um zu lernen ;-) Gruß
Funghi schrieb: > Danke Euch, daran lags :-) > Was µC-Programmmierung angeht bin ich noch frisch, aber man ist ja da um > zu lernen ;-) Hat mit µC nichts zu tun, ist eine C-Compiler-Sache. Wenn Du im Visual Studio die Optimierung einschaltest oder unter Linux z.B. mit "gcc -O2" compilierst wird sehr wahrscheinlich auch nicht passieren was Du wolltest.
Beitrag #5320401 wurde von einem Moderator gelöscht.
Beitrag #5320405 wurde von einem Moderator gelöscht.
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.