mikrocontroller.net

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


Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

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.