Hallo libe Leute, Bei der Programmierung eine Warteschleife ist mir in meinem richtigen Projekt aufgefallen dass diese auf irgendeine Art und Weise gar nicht erkannt wird bzw aufgerufen wird. Nach einigen Nachforschungen bin ich dann auf verschiede Threads gestoßen die besagen dass bei eingeschalteter Optimierung diese Funktion wegen irgeneines Grundes umgangen wird. Mit ausgeschalteter Optimierung funktioniert es SUPER. Kann mir jemand sagen wo der Fehler liegt? Der Quellcode liegt im Anhang und ist aus nem Buch.Hier ein Auszug aus dem lss-File. ####################################################################### 0000005e <delay>: void delay(unsigned int time) { unsigned int i; for(i=0;i<time;i++); } 5e: 08 95 ret 00000060 <main>: { delay(3500); while(1) { asm("nop"); 60: 00 00 nop 62: fe cf rjmp .-4 ; 0x60 <main> 00000064 <_exit>: 64: f8 94 cli 00000066 <__stop_program>: 66: ff cf rjmp .-2 ; 0x66 <__stop_program> ####################################################################### Vielen Dank! Benny.
Da es mit dem Anhang nicht so richtig geklappt hat hier den Quelltext: void delay(unsigned int time) { unsigned int i; for(i=0;i<time;i++); } void main (void) { delay(3500); while(1) { asm("nop"); } }
Der Teil
1 | for(i=0;i<time;i++); |
ist für den Compiler sinnlos, weil er nix tut. Für dich ist er aber nötig, weil du eine Zeit warten willst. Wenn das nicht passieren soll, musst du die Variable "i" als volatile (flüchtig) deklarieren. Dann wird es nicht wegoptimiert.
1 | void delay(unsigned int time) |
2 | {
|
3 | volatile unsigned int i; |
4 | for(i=0;i<time;i++); |
5 | }
|
Danke dir!!! Jetzt funktioniert die Sache Super. Benny
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.