Forum: Compiler & IDEs Interruptpriorität


von Tobse (Gast)


Lesenswert?

Die Sache mit den Interrupts sind kein Problem, nur wie kann ich ihnen
unterschiedliche Prioritäten geben? ...soll heißen z.B. INT5 vor INT1.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Welcher Controller?  AVR?

Geht dort nicht.  Die Prioritäten beim AVR sind fest.  Außerdem
vermute ich, dass du sowieso 'ne falsche Vorstellung davon hast,
was die Prioritäten genau tun.

Ist übrigens überhaupt nicht GCC-spezifisch...

von seacrash (Gast)


Lesenswert?

>INT5 vor INT1


Machbar wäre es aber, oder!?

z.B indem man das globale I-Flag im INT1 setzt. Natürlich ist dies
nicht schön und kann zu unüberschaubaren Problemen führen. Außerdem
müßte man alle anderen Interrupts, die man nicht benötigt deaktivieren.
Zudem kann der INT5 auch nur einmal in der INT1 aufgerufen werden, es
sei denn, man setzt das I-Flag mehrmals. Aufpassen müsste man auch mit
den Rücksprungadressen, welche sich im Stack unkontrolliert vermehren,
sollte man nicht mit einem ordentlichen "reti" zurückkehren.

Grüße

von Tobse (Gast)


Lesenswert?

Ich benutze den ATMega128 mit WinAVR. Ist es wirklich nicht möglich die
Interrupts a la Daisy Chain zu priorisieren?? Das kann ich mir nicht
vorstellen.
Ist es des weiteren möglich im Ablauf einer Interrupt Service Routine
die globalen Interrupts mit cli() zu verbieten? Hat bei mir nicht
geklappt! Danke

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Ist es wirklich nicht möglich die Interrupts a la Daisy Chain zu
> priorisieren?

Ja, ist es nicht.

> Das kann ich mir nicht vorstellen.

Es gibt halt Dinge zwischen Himmel und Erden, die sich unserer
Vorstellungswelt entziehen. ;-)

Typischerweise wird eine solche Priorisierung nur von denjenigen
vermisst, die zuvor 8051 programmiert haben...  Der AVR ist schnell
genug, man packt einfach das Notwendigste in die ISR, damit wird die
hinreichend kurz.  Dann setzt man ein Flag, und lässt den Rest in
aller Ruhe in der main loop ausführen.

> Ist es des weiteren möglich im Ablauf einer Interrupt Service
> Routine die globalen Interrupts mit cli() zu verbieten?

Nein, ist es nicht -- die sind nämlich bereits verboten.

Lass mich raten, willst du etwa mit einem externen Interrupt einen
(mechanischen) Taster abfragen?  Das tut man nicht.  Die Dinger
prellen so sehr, dass du das sowieso in Software tiefpassfiltern
musst, da kannst du die ganze Abfrage dann auch gleich in den
Timerinterrupt verlagern.

Ansonsten Grundregel #1 für externe Interrupts: in der ISR als
Allererstes mal den Interrupt selbst verbieten.  Damit ist
sichergestellt, dass er nicht bei immer noch anhängiger
Interruptbedingung zu schnell hintereinander wieder aufgerufen wird.

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.