Verständnisfrage: Sleep in Timer-ISR

OP #928633
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
OP #928660
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
#928719
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
#928749
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren