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?
Kein Sorge, diese Schleife wird er nicht wegoptimieren. Wegoptimieren tut er Zählschleifen, denn die hören irgendwann auf. Die hier nicht.
sieht aber gerade danach aus: siehe Beitrag "USART Problem (Schlaufe)" das programm wird unendlich oft durchlaufen! andere ideen?
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).
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.