www.mikrocontroller.net

Forum: Compiler & IDEs Interruptpriorität


Autor: Tobse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: seacrash (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

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.