mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik while schleife nich wegoptimieren!


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das grundgerüst eines avr mikrocntroller programms sieht ja bekanntlich 
folgendermassen aus:

int main(void){
while(1);
return 0;
}

richtig, oder? jetzt habe ich aber wahrscheinlich das problem, dass die 
while(1); schleife vom compiler wegoptimiert wird und das programm dann 
nach return 0; neustartet, vermutich auf jeden fall! ich will aber nicht 
dass das programm immer neustartet sondern dass es in der while schleife 
verweilt! wie kann ich dem compiler beibringen, dass der diese schleife 
nicht wegoptimieren soll?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Sorge, diese Schleife wird er nicht wegoptimieren. Wegoptimieren 
tut er Zählschleifen, denn die hören irgendwann auf. Die hier nicht.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieht aber gerade danach aus: siehe 
Beitrag "USART Problem (Schlaufe)"

das programm wird unendlich oft durchlaufen! andere ideen?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daumenregel für Compileroptimierung: Kein Compiler wird, jedenfalls 
nicht vorsätzlich, etwas an den für ihn sichtbaren Wirkungen eines 
Programms ändern. Aus seiner Sicht kommt hinten immer das raus, was das 
Programm vorschreibt. Hier steht eine Totschleife und genau das kommt 
dabei raus. Kann indes sein, dass er das return danach als überflüssig 
ankreidet.

Leere Zählschleifen haben keine für ihn sichtbare Auswirkung - sie 
ändern nichts an irgendwelchen Daten, nur die Zählvariable ändert sich 
auf einen bekannten Endwert. Also fliegt sie raus und wird durch eine 
einfache Zuweisung wie i=100 ersetzt. Und wird i danach nicht mehr 
verwendet, fliegt auch die raus.

Allerdings kann er keine Änderungen erraten, die er nicht sieht, weil 
sie in Interrupts oder in der Hardware stattfinden. Da liegt der 
eigentlich Knackpunkt (=> volatile).

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. sieh dir den erzeugten Assemblercode an ob die Endlosschleife 
vorhanden ist ( sie  wird da sein)
2. wahrscheinlicher ist ein Programmfehler der zu einem RESET führt

Autor: Immanuel Nekvasil (sputnik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sonst kannste man das probieren:

int main(void)
{
    while(1)
    {
        asm("nop");
    }

    return(0);
}

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.