Forum: Mikrocontroller und Digitale Elektronik bascom avr: timer interrupt priorität


von nummernschalter (Gast)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von Anonymous (Gast)


Lesenswert?

(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).

von bas_ratte (Gast)


Lesenswert?

Xmega soll das können kommt nächstes Jahr aufen Markt.

von Rahul D. (rahul)


Lesenswert?

bas_ratte wrote:
> Xmega soll das können kommt nächstes Jahr aufen Markt.

8051er können das schon seit Jahr(zehnt)en...

von nummernschalter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.