Forum: Compiler & IDEs Bug in AVR Studio und GCC ?


von Alex (Gast)


Lesenswert?

Hallo, ich habe folgendes C Programm geschrieben und mit WINAVR
kompiliert.

Als ich die Cof Datei im AVR Studio geöffnet habe und debuggen wollte
mit dem JTAG ICE habe ich bemerkt dass die laufvariable int i nicht
hochgezählt wird. Obwohl dass Programm funktioniert.

# include <io.h>
# include <iom16.h>        //ATmega8-Deklarationen

int i;

void main(void)
{
  DDRD=0xFF;                //Alle PORTB-Pins auf Ausgang
  while(1)
  {
    for (i=0;i<0xF000;i++) //Warteschleife, abhängig von
AVR-Taktfrequenz
    {};
    PORTD++;
  }
}

Im Disassembler Mode habe ich gesehen dass diese Variable im Register
steht (R24 und R25) und nicht wie im C-Debugfenster angegeben im SRAM ,
ist dass also ein Bug des Compilers oder des AVR Studios. Vieleicht kann
dass mal jemand compilieren und im SingleStep die Variable i beobachten
ob sie hochgezählt wird. Bei mir jedenfalls nicht.

Danke für eure Hilfe

von OldBug (Gast)


Lesenswert?

for(i = 0; i < 0xF000; i++)
    ;

Das ergibt für den Compiler bei eingeschalteter Optimierung "sinnlosen
Code", weil mit "i" nichts passiert. Er wird in diesem Falle "i"
auf die Konstante 0xF000 festlegen. Abhilfe schafft hier das
Schlüsselwort "volatile" -- oft diskutiertes Thema.
Besser noch:
Funktionen der avr-libc verwenden, Verzögerungsroutinen finden sich im
Headerfile "delay.h" und sind mittlerweile sogar in der avr-libc-Doku
Dokumentiert...

von Alex (Gast)


Lesenswert?

Wo bekomme ich diese Bibliothek her? Und wie binde ich diese ein, hast
du dafütr ein kleines Beispiel,

Danke übrigens für den Tipp jetzt wird mein int i hochgezählt ;)

von Jörg Wunsch (Gast)


Lesenswert?

Siehe avr-libc Dokumentation.

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
Noch kein Account? Hier anmelden.