Interruptstrukturen

Gast #37815
Hallo zusammen!

Ich möchten mit einem Mikrocontroller, der keine gegenseitgig
unterbrechbaren Interrupts (wie z.B. der C166) unterstützt
programmieren und dabei eine ähnliche Interruptstruktur erzeugen wie
sie der C166 hardwareseitig besitzt. D.h. die Abarbeitung der
Interrupts soll Priotirätengesteurt funktionieren und wenn ein
Interrupt gerade abgearbeitet wird und es kommt einer mit höherer
Priorität, dann soll dieser zwischengeschoben werden.
Habt ihr eine Idee, wie man dieses am günstigsten machen kann?
Habe mir schon überlegt, dass ich vielleicht gleich nach dem springen
in die ISR ein Flag setze und dann alle Ints wieder frei gebe. Und wenn
dann ein neuer kommt prüfe ich dann ob die Priorität des neuen Ints
höher ist.
Oder vielleicht könnte man auch alle Vektoren auf eine Funktion legen,
die dann entscheidet. Also so ne Art switch case Struktur, die nach
Prioritäten sortiert ist.

Habt Ihr da vielleicht schonmal was in der Richtung gemacht und kennt
vielleicht eine gute Lösung? Um so eine Struktur komme ich glaube ich
nicht herum , da ich hohe Echtzeitanforderungen habe.

Viele Grüße,

Ralf
Gast
Eine Möglichkeit währe vielleicht, wie du schon gesagt hast,
über eine gemeinsame funktion zu gehen, dir zu merken welcher
Interrupt gerade ausgeführt wird.
Prüfe dann immer ob ein höherer INT gerade in der Ausführung ist.
Wenn ja wird nur ein Merker gesetzt und die höhere INT-Fkt. muss am
Ende prüfen, ob niedrigere INTs noch ausgeführt werden sollen..
Ansonsten wird sofort ausgeführt und erst danach mit der niedrigeren
Funktion fortgefahren.

Problem ist nur, wenn mehrmals der gleiche INT in diesem Zeitraum
kommt, falls dies überhaupt möglich ist.

Hoffe ich konnte helfen.

Andre
Gast
Der gleiche Int sollte eigentlich nicht zwei mal gleich hintereinander
kommen, es sei denn, meine Signale sind gestört. Ist diese Lösung denn
aus zeitlicher Hinsicht gut, oder gibt es vielleicht noch schnellere
Lösungen? Ich muß bestimmte Zeiten sehr genau messen und habe keinen
Capture mehr frei.
Gast
Hallo,

das ist eigentlich ganz einfach.
Halte ein Kopie aller Interrupt Mask Register (TIMSK dund EIMSK) im
RAM. Sobald Du in einem Interrupt bist, kannst Du in den beiden
Registern alle Interrupts freigeben, die den momentan aktiven Interrupt
unterbrechen dürfen. Danach einfach wieder alle Interrupts freigeben.
Am Ende des Interrupts müssen dann die ursprünglichen Werte aus dem RAM
zurückgeschrieben werden.

Gruß
Dieter
Gast
Hallo,

habe vergessen zu sagen, dass es sich um einen Hitachi H8 handelt, den
ich programmieren muß. Bei diesem Controller sind die Interrupt-Enable
Register über eine ganze Reihe von Registern verteilt, die ich dann
alle zunächst zwischenspeichern müsste um sie dann wieder am Ende
freigeben zu können.

Gruß,

Ralf
@Ralf,

das gefällt mir am AVR auch nicht, da ist es genauso.
Zu allem Übel sind da manchmal auch die Interruptflags mit drin. D.h.
die muß man dann noch extra rausmaskieren.

Auch müssen beim AVR die UART und I2C-Interrupts sich erst selber
sperren, da sie nicht beim Eintritt gelöscht werden. Sonst würden sie
sich immer wieder selbst aufrufen, bis der Stack überläuft.


Beim 8051 sind die Interruptbits ins 1-2 Bytes mit der globalen
Interruptfreigabe zusammengefaßt. Aber der hat ja schon 2..4
Prioritäten in Hardware.


Ist schon verrückt. Da wo es bequem wäre, braucht mans nicht. Und da wo
mans braucht, ist es maximal umständlich :-(


Peter
Gast
Zeitlich gesehen ist die von mir vorgeschlagene Lösung eher
im Mittelfeld.. im oberen Feld währe wohl einfach ein anderer MC. ;-)
Du solltest sie halt einfach mal (zumindest teilweise)implementieren
und dann die Laufzeit bzw. Verzögerung messen.
Danach kannst du ja entscheiden, ob diese für dein Projekt
ausreichend ist.

Andre
Gast
Naja, werde wohl nicht drumherum kommen es zu probieren. Ein anderer uC
wäre zwar schön aber man bekommt halt nicht immer das was man will
:-(.

Danke für eure Hilfe!

Ralf

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.