Forum: Mikrocontroller und Digitale Elektronik Ist Priorität der Interrupt's = Interruptadresse?


von Sepp -O- (Sepp_O) (Gast)


Lesenswert?

Salve

Kann ich davon ausgehen dass die Priorität der einzelnen Interrupts der
Interruptadresse entspricht wobei 0x00 dem Interrupt mit der höchsten
Priorität entspricht?

Was passiert eigentlich wenn ein Interrupt von hoher Prorität
ausgeführt wird und ein Interrupt von niederer Priorität auftritt?

Diese Informationen konnte ich leider nicht im Datenblatt finden.

mfg Sepp

von crazy horse (Gast)


Lesenswert?

von welchem Prozessor redest du??

von Wolfgang Horn (Gast)


Lesenswert?

Moin, Sepp,

Mit hoher Wahrscheinlichkeit kannst Du davon ausgehen, aber schau
besser in das Datenblatt.

"Was passiert eigentlich wenn ein Interrupt von hoher Prorität
ausgeführt wird und ein Interrupt von niederer Priorität auftritt?"

Das hängt nicht nur von der Hardware des Prozessors ab, sondern auch
vom Compiler und von Deinen Interrupt-Routinen.

Daher kein Versäumnis der Datenblatt-Autoren.
Mit meinem Compiler (GCC für AVR) kann ich zwei Arten von Routinen
schreiben. Eine davon wird vom Interrupt höherer Priorität
unterbrochen, die andere nicht.

Ciao, und viel Spaß beim Programmieren und Debuggen :-)

Wolfgang Horn

von Sepp -O- (Sepp_O) (Gast)


Lesenswert?

Tschuldigung.

Hab ich ganz vergessen zu schreiben.

Mich interresiert es wies generell bei den AVR-Risc aussieht.

Speziell interresiert's mich bei den Controllertypen ATmega8 und
ATtiny15.

mfg Sepp

von Sepp -O- (Sepp_O) (Gast)


Lesenswert?

@Wolfgang Horn

Ich programiere aAssambler mit AvrStudio und C mit Code Vision.

Wie und wo kann ich ersehen ob der Interrupt unterbrochen wird?

Ich hab's schon mit simulieren versucht, aber da hab ich's noch nicht
geschafft dass ich 2 Interrußt's gleichzeitig auslöse.

mfg Sepp

von crazy horse (Gast)


Lesenswert?

beim AVR gibt es keine echten Prioritäten. Treten allerdings mehrere
Ints gleichzeitig auf, so wird die mit der kleineren Interruptadresse
zuerst ausgeführt.
Sind also Int0 und 1 freigegeben und treten beide gleichzeitig auf,
wird zuerst Int0 ausgeführt. Kommt Int1 früher, wird dieser zuerst
ausgeführt, ein in dieser Zeit auftretender Int0 interbricht NICHT die
Ausführung von Int1.
Ausnahme von dieser Regel: du gibst explizit weitere Interrupts in
einer ISR frei ("sei"). Normalerweise wird bei Annahme eines
Interrupts automatisch das i-flag gelöscht und damit weitere Interrupts
unterbunden. Die Freigabe ermöglicht allerdings allen anderen Interupts,
die gerade laufende ISR zu unterbrechen.
Sowas wirklich korrekt zu programmieren, ist nicht ganz einfach und
normalerweise nicht nötig. Ich habs noch nie gebraucht. Und wenn du
eine einfache Regel beherzigst, wirst du es auch nicht brauchen:
Interupt-Programme so kurz wie möglich halten!

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Freunde, aus meinem Compiler:

INTERRUPT() ist eine Routine, die selbst unterbrochen werden kann.
Ich habe das noch nicht benutzt, aus Faulheit wegen der Risiken.

Ciao
Wolfgang Horn

"SIGNAL(signame);

Return Value
Parameters
signame Predetermined signal name

Remarks
Introduces an interrupt handler function that runs with global
interrupts initially dis-abled."

"INTERRUPT(signame);

Return Value
Parameters
signame Predetermined signal name

Remarks
This macro creates the prototype and opening of a function that is to
be used as an interrupt. The routine will be executed with interrupts
enabled."

von Sepp -O- (Sepp_O) (Gast)


Lesenswert?

Danke für eure Hilfe

Dass hat mir etwas weitergeholfen.

Da ich mehrere Interrupt's verwende die leider etwas länger sind, muß
ich mir wie's aussieht selbst eine Verriegelung programmieren.

Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig sauber
abzudrehen und danach wieder zu aktivieren?

mfg Sepp

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Sepp,

"Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig
sauber
abzudrehen und danach wieder zu aktivieren?"

Das ist eine Frage der Grundstruktur des Programms - ich benutze - aus
Faulheit -
* eine schnelle Schleife in main(),
* Jede Interrupt-Routine macht nicht mehr als daß sie beispielsweise
vom UART ein empfangenes Byte und die Fehlerflags liest und in einem
Ringpuffer ablegt.
* Main()-Routine fragt dann die Zeiger auf den Ringpuffer ab, ob es was
Neues gibt.


Aber ist das was Neues?
Was könnte uns zwingen, Interrupt-Routinen so aufwendig zu machen, daß
die sich schachteln müssen?

Ciao
Wolfgang Horn

von Sepp -. (sepp_o)


Lesenswert?

Salve

Ungefär so, wie du es beschrieben hast hatte ich es auch vor.

Wir haben das Problem dass im aktuellen Fall alles über Interrupt's
läuft.

Und da der Mikrokontroller als Fail-Save funktioniert, sollten doch so
viele Fehlermöglichkeiten wie möglich untersucht, bewertet und soweit
wie möglich vermieden werden.

Ich möchte also ganz genau wissen was der Mikrocontroller wie macht.

Und die Interupt's sind ein Bereich den ich mir jetzt ganz genau
anschaue.

mfg Sepp

von peter dannegger (Gast)


Lesenswert?

@Sepp,

"Gibt eigentlich eine Möglichkeit alle Interrupt's kurzfristig
sauber abzudrehen und danach wieder zu aktivieren?"

Jo, das nennt sich cli() und sei().

Ist z.B. nötig, wenn man Variablen mit Interrupts austauscht, auf die
nicht atomar zugegriffen werden kann (16 oder 32 Bit).


"Wir haben das Problem dass im aktuellen Fall alles über Interrupt's
läuft."

Dann verschenkst Du aber eine Ausführungsebene.

Es programmiert sich einfacher, wenn man alle nicht eilige Sachen im
Main macht, da dann nicht soviel gepusht und gepopt werden muß. D.h.
der Code wird kleiner und schneller.


Peter

von Sepp -. (sepp_o)


Lesenswert?

Salve

Klar sollte man so viel wie möglich im Main machen.

Leider kann ich in dieser Anwendung nur mit Interrupts arbeiten.
Ich muz dabei genaue Zeitintervalle einhalten und auf Pegeländerungen
eines externen Eingangs reagieren.

Ich habe in diesem Fall eigentlich keine Aufgaben die im Main
abgearbeitet werden können.
Es gibt da leider nur eilige sachen deren Dringlichkeit aber unterstuft
ist.

Danke für den Tipp mit cli().
Das werd ich gleich mal ausprobieren.

mfg Sepp

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.