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.