ISR, Atomic_Block --> Serial

Hallo,

es wird doch immer gesagt, serielle Ausgaben haben in einer ISR nichts zu suchen. Weil die Interrupts in einer ISR sowieso abgeschalten sind. Entweder gehts gar nicht oder nur verstümmelt, mehr Zufall wie gewollt.

Jetzt programmiere ich gerade einen ATtiny und habe zu Debugzwecken serielle Ausgaben in einem Atomic Block eingebaut.
Dürfte nicht funktionieren, weil darin ja auch wie in einer ISR die Interrupts abgeschalten sind.
Funktioniert aber trotzdem. Jetzt war die Frage warum.
Ich nutze zum senden eigene Funktionen, wo nur geschaut wird, mittels Flag, ob der Sendebuffer leer ist.
Sollte beim Arduino genauso sein.
Das würde bedeuten, dass man beim serial senden keine Probleme bekommt in einer ISR.
Denn man fragt ja das Flag selbst ab und überlässt es nicht der "abgeschalteten" Interrupt Steuerung.

Beim serial lesen sollte das genauso sein, man fragt selbst das Flag ab ob etwas im Buffer liegt. Man wartet ja nicht bis sich ein Interrupt meldet.

Von der Seite betrachtet sollte es doch damit nie Probleme geben wenn man Serial in einer ISR verwendet?
Auch wenn man das nicht machen sollte, weil es viel Zeit in einer ISR verplempert, sehe ich für Debugging keine Gefahr den Code ungewollt zu verstümmeln.

Anderer Meinung?

Wenn du keine ISR für die Serielle Ausgabe nutzt, dann muss die Angelegenheit im Polling Betrieb abgehandelt werden.
Damit blockiert deine serielle Ausgabe das Programm.

Standard Arduino Serial arbeitet nebenläufig.
Die Folge: Das Hauptprogramm wird erst blockiert, wenn der Sende Buffer voll ist.

Entweder gehts gar nicht oder nur verstümmelt, mehr Zufall wie gewollt.

Nein, kein Zufall, kein verstümmelt.
Sondern: Sobald der Sende Buffer voll ist, blockiert die Sache.

Verstümmelungen gibts beim Empfang, nicht beim senden.

Hallo,

nutzt jemand ISR für serielle Ausgaben?

Alle UNO User, welche mit Serial Ausgaben machen.

Mit Serial auf dem Tiny bin ich nicht vertraut.
Der hat doch sowieso nur eine USI, und die nutze ich mit I2C, wenn überhaupt.

Hallo,

ATtiny. Die USI ist nur für SPI oder I2C. Die UART ist extra, wenn vorhanden. Man kann die USI aber umbiegen für eine Art UART. "AVR307, doc4300". Egal, dass war nur so nebenbei.

Das der Arduino ISR für die serielle nutzt wußte ich nicht. In dessen serial Lib blicke ich nicht durch. Scheinbar geschuldet weil es universell sein muss.

Zurück zur Eingangsfrage. Die Gefahr mit der seriellen in einer ISR besteht darin, das die ISR blockiert wenn der Buffer voll ist. Bis dahin gibts keine Probleme. So richtig?
Da man die Blockierung schlecht vorhersagen kann, ist die Verwendung der seriellen in einer ISR immer eine schlechte Idee. Zumindestens im fertigen Programm. Debugcode nehme ich mal als Ausnahme.

Zurück zur Eingangsfrage. Die Gefahr mit der seriellen in einer ISR besteht darin, das die ISR blockiert wenn der Buffer voll ist. Bis dahin gibts keine Probleme. So richtig?

Wenn du meinst "Die Gefahr mit seriellen Ausgaben in einer ISR besteht ..." -> Ja, ungefähr.

Allerdings wird Serial.print(), wie alles andere auch, bei Bedarf durch eine ISR unterbrochen, wenn es im normalen Modus mit offenen Interrupts läuft.
Wenn mehr Code in der ISR unter geschlossenen Interrupts läuft, verschlechtert sich das Echtzeit-Verhalten. Microsekunden und Zähl-Impulse können leichter verloren gehen, der Serial Puffer läuft schneller über, usw.

Hallo,

jetzt ist der Ball für mich wieder rund. Alles klar. :slight_smile:
Ich danke euch ganz lieb.