Forum: Mikrocontroller und Digitale Elektronik while schleife nich wegoptimieren!


von Thomas (Gast)


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?

von Andreas K. (a-k)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

sieht aber gerade danach aus: siehe 
Beitrag "USART Problem (Schlaufe)"

das programm wird unendlich oft durchlaufen! andere ideen?

von Andreas K. (a-k)


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

von Ralph (Gast)


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

von Immanuel N. (sputnik)


Lesenswert?

Sonst kannste man das probieren:

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

    return(0);
}

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.