Hallo, weiß jemand, wie bascom avr die Interruptpriorisierung umsetzt? z.B.: wenn bereits der Timer0-Interrupt abgearbeitet wird und während dessen Timer2 überläuft - was passiert dann ? 1.)Wird zuerst die ISR0 fertiggestellt und dann ISR2 aufgerufen oder 2.)wird ISR0 unterbrochen, ISR2 abgearbeitet, ISR0 fortgesetzt ? Im 1.Fall, was passiert in der Wartezeit bis zum Ende von ISR0 ? Wird Timer2 angehalten oder läuft er weiter ? Danke schonmal.
Es gibt bei den AVRs keine Interrupt-Prioritäten. Da kann auch BASCOM nichts dran ändern. Grundsätzlich sind Interrupt Handler beim AVR nicht unterbrechbar, d.h. wenn während der Ausführung eines Interrupt Handlers ein anderer Interrupt auftritt, dann muss dieser warten, bis der andere fertig ist. Man kann zwar Interrupt-Handler unterbrechbar machen, allerdings ist das nur in ganz wenigen Ausnahmefällen sinnvoll. Generell gilt: Interrupt Handler so kurz wie möglich, dann gibts i.d.R. auch keine Kollisionen. EDIT: Angehalten wird ein Timer grundsätzlich nur dann, wenn seine Taktquelle auf "Off" gesetzt wird, und das geht nur durch löschen der CS-Bits. Kein Interrupt-Ereignis kann einen Timer anhalten.
(It doesn't matter which compiler you are using, Basic, C or assembler). By default the interrupts are not nested. When an interrupt is executed, all other interrupts (if any) are disabled automatically. When the interrupt terminates, the other interrupts are automatically enabled again. When the interrupts are enabled again, if there are pending interrupts, the order of their execution is the order you can see in the datasheet of the AVR "Interrupt/Interrupt Vectors in ....). The interrupt vector with the lower address in the program memory has the higher priority. You can have nested interrupts if you use the assembly instruction SEI in your interrupt service routine. If a second interrupt occurs while the first interrupt is executed then the first interrupt will be interrupted and the second interrupt will be serviced. When the second interrupt is over, the execution will go back to the first interrupt service routine. If you use nested interrupts make sure the stack is big enough. Nested interrupts are an advanced topic and are difficult to debug. (Don't use them).
bas_ratte wrote:
> Xmega soll das können kommt nächstes Jahr aufen Markt.
8051er können das schon seit Jahr(zehnt)en...
Hallo nochmal. Offensichtlich beeinflussen sich die Interrupts derart, daß man genau überlegen muß, welche Aufgaben man den ISR's überträgt. Und vor allem, ob man mehrere Timer gleichzeitig laufen läßt. Dummerweise gehen dann immer einige Daten verloren. Arrgghh ! Solche Probleme hattee ich in meinen Z8-Projekten nie, denn da kann man (wie auch beim 8051) alle Unterbrechungsanforderungen wunderbar priorisieren und erhält exakte Ergebnisse. Nun ja, sicherlich spielt auch die ausschließliche Verwendung von Assembler ein gewichtige Rolle. Wie dem auch sein, Danke an Alle.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.