hallo, ich habe ein problem mit der while schleife. im hauptprogramm meines atmega8 möchte ich mit einer while schleife abwarten bis eine bestimmte variabel größer als ein vordefinierter wert ist. wenn die variabel größer als 10 ist soll das hauptprogramm weiterlaufen. also: .. while (c < 10) //c wird durch externen interrupt erhöht { } .. wieso funktioniert das so nicht? wenn ich in den geschwungenen Klammern einen weiteren befehl schreibe funktioniert es. while (c < 10) //c wird durch externen interrupt erhöht { uart_puts("c < 10 \r\n"); } Karl
Die Schleife wird wahrscheinlich wegoptimiert. Kannst du im Listing sehen. Hast du die Variable c als volatile deklariert?
ich habe es jetzt in volatile geändert und es funktioniert trozdem nicht.Als Optimierungsstufe habe ich -Os gewählt.
Geht es denn mit -O0? Ansonsten vielleicht umformulieren um den Optimiser auszutricksen.
1 | while(1) |
2 | {
|
3 | if(c > 9) |
4 | {
|
5 | break; |
6 | }
|
7 | }
|
So mal aus der Hüfte geschossen, wie genau der Optimiser darauf reagiert, bin ich mir auch nicht sicher.
Die Optimierungsstufe -O0 kann ich nicht wählen da sonst das programm nicht auf den µC passt. Ich werde es einmal mit deiner methode versuchen. danke für deine bemühungen. Gibt es im Internet Erklärungen zu den einzelnen Optimierungsstufen?
mach doch einfach einen asm volatile("nop); in deiner while schleife.. manno..
leider funktioniert deine Version mit while(1) auch nicht. Mfg. Karl
Wenn das jetzt schon nicht mehr in den µC passt dann vielleicht einen grösseren einsetzen, zumindest während der Entwicklung? So Mega168 zum Beispiel.
Die einzelnen Optimierungsstufen sind schnell erklärt: -O0: keine Optimierung -O1: Optimierung der Registerbelegung, also Umkopieren zwischen Registern vermeiden, häufig verwendete Variablen komplett in Registern halten -O2: Optimierung der Programmstruktur auf Funktionsebene (darunter fällt auch das Wegoptimieren sinnloser Schleifen) -Os: Dasselbe wie -O2, bis auf solche Optimierungen, die typischerweise die Codegröße erhöhen -O3: Optimierung der Programmstruktur auf Sourcefileebene (also auch Inlining etc.)
Karl wrote: > ich habe es jetzt in volatile geändert und es funktioniert trozdem > nicht.Als Optimierungsstufe habe ich -Os gewählt. Dann musst du Nägel mit Köpfen machen und ein compilierfähiges Beispiel liefern. Außerdem solltest du "funktioniert nicht" dann noch näher erläutern (was erwartest du? was passiert stattdessen?).
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.