Forum: Compiler & IDEs Verständnisfrage: Sleep in Timer-ISR


von Paul H. (powl)


Lesenswert?

Hi,

mein AVR fängt an zu spinnen wenn ich am Ende einer unterbrechbaren 
Timer-ISR in den Sleep-Mode zu gehen versuche. Durch einen erneuten 
Aufruf des Timers wird dann der AVR wieder geweckt.

Leider fängt dann mein Programm völlig an zu spinnen. Liegt das daran, 
dass die ISR mit Aufruf des Sleep befehls noch nicht fertig ist und dann 
mit jedem erneuten erwachen die ISR neu angesprungen wird und somit nach 
kurzer Zeit der Stack überläuft?

lg PoWl

von Jörg X. (Gast)


Lesenswert?

Kann es sein, dass der AVR am Ende der Auf-wach-ISR wieder in den Sleep 
mode geht? (DANN läuft der Stack über, klar)
Wie wär's mit Code?

von Paul H. (powl)


Lesenswert?

Ok, ich hab grad noch einen kleinen Versuch dazu gemacht. In der Main 
Funktion wird jetzt in einer Schleife ständig überprüft ob die variable 
gosleep gesetzt ist. Ist sie es, wird sie gelöscht und sich schlafen 
gelegt. Erst in der Timer-ISR (Aufwach-ISR) wird diese wieder gesetzt.

Theoretisch könnte ich auch einfach generell in der Schleife schlafen 
gehen, da diese eh nach dem Timerablauf angesprungen wird, aber da kommt 
ja noch mehr dazu.

lg PoWl

von Bernhard M. (boregard)


Lesenswert?

Hi,

ich sehe keinen Sinn darin (und würde es auch nie machen) eine CPU in 
einer ISR schlafen zu legen.
ISRs sollen normalerweise schnell abgearbeitet werden. Ob nichts mehr zu 
tun ist und geschlafen werden sollte stellt man (notfalls über globale 
flags, wnnes nicht anders geht) in der Hauptschleife fest und legt dort 
schlafen.
Dann kann durch beliebige ISR aufgeweckt werden  ohne dass man Probleme 
bekommt.
Wenn Du nämlih in einer ISR schlafen legst, und dann ein Interrupt 
aufweckt (evtl. ein anderer) dann wird ja eine ISR durch eine andere 
unterbrochen - was nicht immer gewünscht ist.

>> Theoretisch könnte ich auch einfach generell in der Schleife schlafen
>> gehen, da diese eh nach dem Timerablauf angesprungen wird, aber da kommt
>> ja noch mehr dazu.

Ja, genau. Das "mehr dazu" machst Du VOR dem schlafengehen, dann 
erledigt der Prozessor erst alle anstehenden Aufgaben und geht dann 
schlafen.

Gruß,
Bernhard

von Peter D. (peda)


Lesenswert?

Paul Hamacher wrote:

> Leider fängt dann mein Programm völlig an zu spinnen. Liegt das daran,
> dass die ISR mit Aufruf des Sleep befehls noch nicht fertig ist und dann
> mit jedem erneuten erwachen die ISR neu angesprungen wird und somit nach
> kurzer Zeit der Stack überläuft?

Wenn Du das Sleep im Interrupt ausführst, mußt Du ja die Interrupts 
enablen und damit läuft der Stack über.

Der Schuldige ist aber nicht das Sleep, sondern das Interruptenable im 
Interrupt.

Das Sleep gehört in das Main und nirgendwo sonst!


Peter

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.