www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt Prioitäten


Autor: Heidi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es beim  ATmega168 auch Interrupt-prioitäten zum setzen.im
Datenblatt nichts gefunden!!

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein gibt es nicht bei AVR. Jedenfalls bei denen die mir bekannt sind.

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es bei AVRs generell nicht!
Die einzige Priorität ist die Reihenfolge der Interrupt-Vektor-Tabell,
das mit der niedrigeren Adresse zuerst.
Wenn während eines zeitkritisch "unwichtigen" Interrupts ein
Zeitkritischer Interrupt erfolgen soll/muss dann in dem Interrupt mit
"SEI" einfach Interrupts erlauben.

MfG
Andi

Autor: Heidi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es schon.Habe nachgeguckt!!!Interrupts mit der niedrigeren
Vektor-Adresse habe eine höhere Prioität!!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gibt es schon.

Nein.

> Interrupts mit der niedrigeren Vektor-Adresse habe eine höhere
> Prioität!!

Die Frage war aber, ob die Priorität einstellbar ist.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zumindest war die Frage so formuliert....

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nun es ist auch dann keine Priorität. lediglich eine Interrupt
Reihenfolge.

Prioritäten sind es dann, wenn ein Interrupt einen anderen unterbrechen
kann.

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz einfache Antwort für alle Standard AVR:
Interrupt Prioritäten? ja
Per Software einstellbar ? nein, da festverdrahtet über Tabelle.
Ist aber per bei entsprechender Stückzahl wohl änderbar, neue
"Verdrahtung" dieser Tabelle auf Chip-Ebene ;)

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein es ist auch dann keine Priorität im Sinne was man unter
Interruptpriorität versteht!

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@mr_boetsch
(fast) jeder µc sperrt nach dem Erkennen und Ausführen einer Interrupt
Anforderung die Ausführung (wohlgemerkt nur Ausführen, nicht das
Erkennen) weiterer Interrupts. Meistens via Interrupt-Flag Register im
Prozessor-Status-Register. Die Ausführung weiterer Interrupt muß
explizit durch programmtechnische Manipulation dieses Flags erlaubt
werden. Vielleicht verwechselt du Int-Prioritäten mit im allgemeinen
nicht blockkierbaren NMI (non maskable interrupt) über die einige
Prozessorfamilien ja auch noch verfügen und die nicht blockierbar sind.

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein ich rede von Prioritäts level. Und diese hat die AVR Familie nicht

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber sicher gibt`s Prioritätslevel nur eben harwdwired und nicht per
software änderbar!
Datasheet lesen hilft weiter.

Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

die Prioritäten bei den AVR geben nur an wer
"drankommt", wenn mehrere Interrupts gleichzeitig
anliegen.
Wird in einer ISR der Interrupt wieder freigegeben,
wird die ISR unterbrochen und es kommt wieder der
zu diesem Zeitpunkt höchste anliegende dran.
(Spezialfall "Reset" mal außen vorgelassen).

Damit kann jeder Interrupt jeden anderen unterbrechen.

Hat ein Prozessor "echte Interrupt-Prioritäten"
dann kann eine ISR nur von einer ISR mit einer höheren
Priorität unterbrochen werden (wenn in der ISR der
Interrupt wieder freigegeben wurde).

Beispiel: NEC V25, 2 UARTS mit Interrupts gleicher
Priorität. Ich mußte nun erreichen, daß jeder UART
Interrupt von dem anderen unterbrochen werden konnt.

Das ging nur, indem die UART-Interrupts einen freien
niedrig prioren Interrupt simuliert haben, in dem die
eigentliche Arbeit erledigt wurde. Diese konnten dann
natürlich von dem anderen UART unterbrochen werden.
Natürlich nur EIN Mal - dann waren ggf. die beiden
simulierten niedrigen ISR dran, die sich halt nicht
gegenseitig unterbrechen können.

Gunter

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sollte denn auch passieren, wenn mehrere Interrupts gleichzeitig
anstehen? Da müßte man ja schon extra einen Zufallsgenerator einbauen,
um keine Prioritäten zu haben.

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du meinst...

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dies war für Mmerten bestimmt.

Weiter stimme ich dem kommentar von Gunter bedingungslos zu.

Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
scho klar ;-)

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Interruptprioritäten versteht man üblicher Weise, daß ein
Interrupt höherer Priorität einen mit niederer Priorität unterbrechen
kann ohne jegliche Software.

Der Witz dabei ist, daß dann der Interrupt höherer Priorität keinerlei
Verzögerung (Latenz) erfährt, er fühlt sich so, als wäre er der einzige
Interrupt auf der ganzen CPU.

Und beim AVR geht das eben nicht.

Beim AVR kann man nur tricksen, indem man es in Software nachbildet
(umständlich die Interrutpregister laden, die entsprechenden Bits raus
UNDieren und ORieren (SREG muß gesichert werden !) und wieder
zurückschreiben, was dann je nach Komplexität einige 10...100 oder mehr
Zyklen zusätzliche Latenzzeit bedeutet.


Unter seltenen Umständen kann man nur mit einem SEI auskommen, wenn der
nieder priorisierte ein Timerinterrupt ist und durch den Programmablauf
gesichert ist, daß er sich nicht selbst unterbricht (genügend Zeit bis
zum nächsten Überlauf).

Leider ist aber oft genau der Timerinterrupt derjenige mit hoher
Priorität (Software-PWM mit wenig Jitter) und z.B. die UART derjenige
der nicht eilig ist und da bewirkt ein nur SEI, daß sofort der Stack
überläuft.


Peter

Autor: mmerten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@gunter
jetzt kommen wir der Sache schon näher, der V25 (so er denn noch
produziert wir war ja nen x86 angelehntes Derivat mit einiges an
Peripherie on chip, auch programmierbarer interrupt controller)
Sowas hat der avr nicht und es gibt auch nur ein globales Interrupt
disable Flag. Wenn ich nun innerhalb einer Int-Routine selektiv
Interrupts höherer Priorität (gemäß Tabellenposition) oder auch nur
einige wieder zulassen, geht dies zwar auch, erfordert aber einige
"Handstände" auf der Softwareseite (Interrupt Maskenregister
entsprechend bearbeiten)

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie werd ich das Gefühl nicht los, das hier alle ein wenig
aneinander vorbei Reden. Jeder weis wie's funktioniert, aber wir
diskutieren trotzdem.

Autor: Gunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@mmerten
jo, Peter hat es ja schön erklärt.
Nur bevor ich mir sowas antue, überlege ich doch
lieber, ob ich nicht besser eine andere CPU nehmen
sollte.
Gunter

Autor: Mr_Boertsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube der Konsens ist gefunden. Danke Peter

Autor: jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

was passiert denn jetzt beim AVR wenn est ein Interrupt kommt,
und während dieser ausgeführt wird, ein Interrupt kommt der höher
priorisiert ist?

1. der 1. Interrupt wird abgearbeitet, dann der 2. Interrupt

2. der 1. Interrupt wird unterbrochen, und der 2. Interrupt wird
zunächst abgearbeitet.?


????????

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.

Peter

Autor: Mark Hämmerling (haemi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve,

also ich kann das Fehlen dieser Prioritäten beim AVR durchaus
verkraften. Wenn ich in einer ISR explizit andere Interrupts erlauben
will, dann ist das doch mit dem Setzen bzw. Modifizieren von meistens
zwei oder drei Interruptmasken-Registern getan. D.h. in + andi/ori +
out, oder auch nur ldi + out. Für ein oder zwei Bits geht je nach
Registeradresse evtl. sogar je ein cbi/sbi. Also zwei bis vier Zyklen
pro Maskenregister, plus sei.
In einem mir gerade vorliegenden Fall brauche ich gerade mal 12 Zyklen
um TIMSK, SPCR und GICR anzupassen, im TIFR und GIFR ein paar Flags zu
löschen, und die Interrupts global zu erlauben. Am Ende braucht's
nochmal 8 Zyklen, um den Spaß wieder rückgängig zu machen. Ich finde,
das kann man verkraften.
Natürlich darf man nicht verschweigen, daß man bei dieser Art der
Programmierung genau aufpassen muß, was man tut. Es ist also auf jeden
Fall fehleranfälliger, unübersichtlicher und umständlicher zu warten.
Aber die Funktionalität an sich bekommt man schon hin.

Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.