Ich kämpfe nun seit knapp einem Tag mit einem Problem, was mir völlig unverständlich ist. Ich erzeuge in einer ISR ein paar Signale und möchte im Hauptprogramm eigentlich nur eine 32-bit-Variable setzen (die als Volatile definiert ist). Der Main-Loop sieht so aus: int main() { initialize(); uint32_t j=65536UL; uint8_t i=1; while (1) { _delay_ms(10000); j=65536UL*i; setStepSize(j); settings2Uart(); uart_puti(i); uart_putnl(); i++; uart_puti(i); uart_putnl(); } } (das meiste ist debug-Code). Nun passiert zählt i bis auf 16 und dann passiert nichts mehr. Interessanterweise funktioniert es richtig, wenn ich _delay_ms auskommentiere. Irgendwie vermute ich ein Problem entweder mit dem Compiler der mit avr-libc, allerdings sehe ich im lss-File nicht direkt, wo das Problem liegen könnte. Gibt es ausser dem -mcpu-Flag noch irgendwelche Compileroptionen, die man zwingend setzen muss (AVR GCC 4.2.3)? int main() { 18c4: 1f 93 push r17 18c6: cf 93 push r28 18c8: df 93 push r29 initialize(); 18ca: 0e 94 f9 0b call 0x17f2 ; 0x17f2 <initialize> 18ce: 11 e0 ldi r17, 0x01 ; 1 18d0: c0 e7 ldi r28, 0x70 ; 112 18d2: d1 e0 ldi r29, 0x01 ; 1 18d4: 2f ef ldi r18, 0xFF ; 255 18d6: 3f ef ldi r19, 0xFF ; 255 18d8: ce 01 movw r24, r28 18da: 01 97 sbiw r24, 0x01 ; 1 18dc: f1 f7 brne .-4 ; 0x18da <main+0x16> { // wait 1/10 ms _delay_loop_2(((F_CPU) / 4e3) / 10); __ticks --; 18de: 21 50 subi r18, 0x01 ; 1 18e0: 30 40 sbci r19, 0x00 ; 0 __ticks = 1; else if (__tmp > 65535) { // __ticks = requested delay in 1/10 ms __ticks = (uint16_t) (__ms * 10.0); while(__ticks) 18e2: d1 f7 brne .-12 ; 0x18d8 <main+0x14> uint32_t j=65536UL; uint8_t i=1; while (1) { _delay_ms(10000); j=65536UL*i; 18e4: 81 2f mov r24, r17 18e6: 90 e0 ldi r25, 0x00 ; 0 18e8: a0 e0 ldi r26, 0x00 ; 0 18ea: b0 e0 ldi r27, 0x00 ; 0 18ec: dc 01 movw r26, r24 18ee: 99 27 eor r25, r25 18f0: 88 27 eor r24, r24 18f2: 80 93 00 01 sts 0x0100, r24 18f6: 90 93 01 01 sts 0x0101, r25 18fa: a0 93 02 01 sts 0x0102, r26 18fe: b0 93 03 01 sts 0x0103, r27 setStepSize(j); settings2Uart(); 1902: 0e 94 92 0b call 0x1724 ; 0x1724 <settings2Uart> uart_puti(i); 1906: 81 2f mov r24, r17 1908: 90 e0 ldi r25, 0x00 ; 0 190a: 0e 94 ea 0c call 0x19d4 ; 0x19d4 <uart_puti> uart_putnl(); 190e: 0e 94 97 0c call 0x192e ; 0x192e <uart_putnl> i++; 1912: 1f 5f subi r17, 0xFF ; 255 uart_puti(i); 1914: 81 2f mov r24, r17 1916: 90 e0 ldi r25, 0x00 ; 0 1918: 0e 94 ea 0c call 0x19d4 ; 0x19d4 <uart_puti> uart_putnl(); 191c: 0e 94 97 0c call 0x192e ; 0x192e <uart_putnl> 1920: d9 cf rjmp .-78 ; 0x18d4 <main+0x10>
Da ist kaum was nachzuvollziehen. Evtl. überschreibt eine deiner Routinen ein Variable im RAM. DU siehst ja selbst dass der Code korrekt übersetzt ist. Wenn sich der Verdacht auf einen gcc-Bug verdichten, lies mal Compilerfehler durch, und bastle ein minimal-Beispiel. Ausserdem sind in 4.2.3 bestimmt bekannte Bugs drinne, die z.B. in 4.2.x mit x>3 behoben sind. Johann
Hallo Daniel, Ohne dass Du die ISR postest, kann man da wenig sagen. Wo ist was volatile deklariert? Ich seh da nichts. Aus der main() könntest Du auch mal das Debug-Zeugs rauswerfen, das verwirrt nur. Was soll das ganze eigentlich erreichen? Gruß, Roland
Kann sein dass settings2Uart(); dein UART Einstellungen zerschießt und du deshalb nichts mehr empfängst.
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.