Forum: Compiler & IDEs while schleife funktioniert nicht


von Karl (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

Die Schleife wird wahrscheinlich wegoptimiert. Kannst du im Listing 
sehen. Hast du die Variable c als volatile deklariert?

von die ??? (Gast)


Lesenswert?

Wie ist c deklariert? Optimierungsstufe?

von Karl (Gast)


Lesenswert?

ich habs nicht als volatile deklariert. ist das nötig?

von Thomas (Gast)


Lesenswert?

Ja.

von Karl (Gast)


Lesenswert?

ich habe es jetzt in volatile geändert und es funktioniert trozdem 
nicht.Als Optimierungsstufe habe ich -Os gewählt.

von Rudolph R. (rudolph)


Lesenswert?

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.

von Karl (Gast)


Lesenswert?

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?

von horst (Gast)


Lesenswert?

mach doch einfach einen asm volatile("nop); in deiner while schleife.. 
manno..

von Karl (Gast)


Lesenswert?

leider funktioniert deine Version mit while(1) auch nicht.
Mfg. Karl

von Rudolph R. (rudolph)


Lesenswert?

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.

von der mechatroniker (Gast)


Lesenswert?

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.)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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