www.mikrocontroller.net

Forum: Compiler & IDEs while schleife funktioniert nicht


Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

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

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist c deklariert? Optimierungsstufe?

Autor: Karl (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: Karl (Gast)
Datum:

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

Autor: Rudolph R. (rudolph)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht es denn mit -O0?

Ansonsten vielleicht umformulieren um den Optimiser auszutricksen.
while(1)
{
 if(c > 9)
 {
  break;
 }
}

So mal aus der Hüfte geschossen, wie genau der Optimiser darauf 
reagiert, bin ich mir auch nicht sicher.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: horst (Gast)
Datum:

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

Autor: Karl (Gast)
Datum:

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

Autor: Rudolph R. (rudolph)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.