Die "Länge" einer ISR ist eigentlich nicht wichtig, sondern eher ihre Dauer
Falls andere IRQs währent dessen auftauchen, gehen die auch nicht verloren, sondern werden nach Beenden der ISR abgearbeitet. Alternativ kannst du irgendwo in deiner ISR mit sei() die Interrupts wieder frei geben und geschachtelte Interrupts zulassen. Tritt innerhalb der ISR wieder ihr eigener IRQ auf, hast du jedoch ein Problem. Evtl hilft dann, die Interrupts erst freizugeben, nachdem nur die jeweils eigene IRQ deaktiviert wurde. Am Ende des ISR werden Interrupts mit cli() deaktiviert, das Signal wieder aktiviert und die ISR verlassen.
Welchen Weg du wählst hängt von deiner Software-Struktur ab und von den Zeiten, die du einhalten musst.
In einer Applikation hab ich eine ISR-Rate von 16kHz und eine ISR dauert bis zu 750 Zyklen (da sind die Zeiten für die geschachtelten ISRs schon dabei).
Die Zeiten sind Erfahrungswerte. Die (Maximal-)Werte der Zeiten besorge ich mir in der Applikation selbst, weil das in einem Simulator nicht möglich ist, weil ich da die anderen Interrupt-Quellen nicht hab (Fernbedienung, UART, etc)
Lesezeichen