@Sternthaler
Ich hoffe du kennst auch die Probleme die bei verwenden dieses Parameter ISR(XXX_vect, ISR_NOBLOCK) auftreten können.
Eine Priorisierung wie bei z.B. 8051 gibt es bei den AVR nicht.
Für diejenigen die nicht so versiert bei der Verwendung von ISR sind.
Es werden notwendige Daten wie Variable im SRAM abgelegt.
Im AVR-Studio werden diese Daten nach dem Compilieren unter Data angezeigt.
Diese Daten werden am Beginn des SRAM abgelegt.
Die CPU legt ihre für den Ablauf notwendigen Daten am Ende des SRAM im sogenannten Stack ab.
Dazu gehören auch Daten bei Aufruf einer ISR.
Dazu gehören Rücksprungadresse und notwendige Register.
Nach beenden der ISR wird der Adresszeiger wieder zurückgestellt.
Die jenigen die schon mal Assembler programmiert habe kennen diese push und pop Spielchen.
Normalerweise kann keine ISR aufgerufen werden solange die laufende nicht beendet ist.
Wird nun durch den Parameter ISR_NOBLOCK die ISR-Sperre gelöscht,
das gleiche geschieht auch wenn man am Anfang der ISR-Routine ein (sei) schreibt,
werden bei jedem weiteren ISR-Aufruf die Daten neuerlich im Stack gespeichert.
Dies kann dazu führen das der Stack den vorhandene Datenbereich im SRAM erreicht und diesen dann überschreibt.
Das Ergebnis sind scheinbar unerklärliche Ablauffehler.
Also kein ISR_NOBLOCK und kein (sei) in einer ISR-Routine.
Lesezeichen