Hallo, leider bin ich immer noch arg am Anfang mit C. Drum schreib ich einfach die simpelsten Programme und simuliere im Studio 4.10 hin und her. Nun ist folgendes passiert: void delay (int a) { for (int b=0; b<a; b++) { }; } und delay (2); wird übersetzt zu for (int b=0; b<a; b++) { CP R1,R24 Compare CPC R1,R25 Compare with carry BRGE PC+0x03 Branch if greater or equal, signed for (int b=0; b<a; b++) { SBIW R24,0x01 Subtract immediate from word BRNE PC-0x01 Branch if not equal RET Subroutine return und delay (2); LDI R24,0x02 Load immediate LDI R25,0x00 Load immediate RCALL PC-0x0014 Relative call subroutine Wenn ich mir im Watch-Fenster die Variablen a und b anschaue, sind BEIDE Werte im ersten Durchlauf 2, im zweiten Durchlauf BEIDE 1 und dann wird mit RET wieder zurückgekehrt. Wie auch im Disassembler zu sehen, löst er die Zählung mit Minus statt mit Plus. Im Prinzip macht das Programm ja, was es soll (nämlich 2 mal nix und dann zurück), aber wenn ich später mal "richtig" debuggen will und die Variablen immer andere werte haben als intuitiv erwartet (wer weiß, was für Optimierungen da noch so gehen), wird´s nicht so hilfreich sein, den aktuellen Wert einer Variablen anzuschauen. Oder hab ich was falsch im Compiler eingestellt, was ich gaaanz schnell wieder ändern sollte? Danke und Gruß Lutz
Es ist völlig normal, daß der Compiler bei der Optimierung Deinen Code umstellt. In diesem Falle gibt es einfach keine Variablen b und a mehr im originalen Sinne, folglich kannst Du sie auch nicht anzeigen lassen. Stattdessen hat der Compiler letztlich daraus while (--b > 0) ; daraus gemacht. Gewöhn' Dich am einfachsten daran, trau lieber dem erzeugten Assemblercode (besser übrigens der direkten Ausgabe des Compilers als einem Disassembler, gerader der Disassembler vom AVR Studio hat durchaus auch paar Macken). Du könntest zwar die Optimierung auch abschalten, aber dann debuggst Du einen komplett anderen Code (mit völlig anderen Fehlern).
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.