Interrupt Service Routine erstellen

OP #7753349

Hallo,

mal eine generelle Frage zu den Interrupts. Wird solch ein Interrupt ausgelöst, springt ja (sofern es vorhanden ist) mein Programm in eine sogenannte "ISR" und arbeitet dort den Code ab.

Wie genau sind diese ISR verknüpft? Wird der ISR wie mit einem Zeiger die Speicheradresse zugewiesen?

Wie genau kann ich mir das vorstellen?

1
typedef void (*ISR)(void) = 0x0056;

Gruß bugsimpson

Der von Dir nicht genannte Prozessor hat üblicherweise eine Tabelle mit /Interruptvektoren/. Die stehen im Adressraum des Prozessors an einer fest definierten Stelle, entweder am Anfang oder am Ende.

Dort wird für jeden verwendeten Interrupt die Startadresse der zugehörigen ISR eingetragen.

OP

Harald K. schrieb:

Der von Dir nicht genannte Prozessor hat üblicherweise eine Tabelle mit Interruptvektoren. Die stehen im Adressraum des Prozessors an einer fest definierten Stelle, entweder am Anfang oder am Ende.

Dort wird für jeden verwendeten Interrupt die Startadresse der zugehörigen ISR eingetragen.

Okay und wie mache ich daraus eine Funktion das sollte ein Interrupt auftreten das er in meine Routine springt?

Gast

Herr J. schrieb:

Okay und wie mache ich daraus eine Funktion das sollte ein Interrupt auftreten das er in meine Routine springt?

Das hängt vom konkteten Mikrocontroller, Programmiersprache und Compiler ab. Es gibt keinen einheitlichen Standard.

OP

Monk schrieb:

Herr J. schrieb:

Okay und wie mache ich daraus eine Funktion das sollte ein Interrupt auftreten das er in meine Routine springt?

Das hängt vom konkteten Mikrocontroller, Programmiersprache und Compiler ab. Es gibt keinen einheitlichen Standard.

Das ganze soll in "C" geschrieben werden. Es handelt sich um einen ESP32. Die Adressen habe ich gefunden im DB. Und nun?

Gast

Um ESP32 in C zu programmieren brauchst du dessen IDF Framework. In dessen Doku ist die Verwendung von Interrupts beschrieben.

https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/intr_alloc.html https://espressif-docs.readthedocs-hosted.com/projects/esp-idf/en/latest/api-guides/hlinterrupts.html

Beachte, dass es nicht "den" ESP32 gibt, sondern dass es sich um mehrere Serien von Mikrocontrollern handelt, die mit unterschiedlichen C Compilern programmiert werden. Nicht alle ESP32 haben eine Xtensa Architektur! Auf den Begriff wirst du beim Lesen der Doku stoßen. Das IDF abstrahiert die feinen Unterschiede weitgehend, doch gerade bei Interrupts geht das nur bedingt.

OP

Monk schrieb:

Um ESP32 in C zu programmieren brauchst du dessen IDF Framework. In dessen Doku ist die Verwendung von Interrupts beschrieben. https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/intr_alloc.html Beachte, dass es nicht "den" ESP32 gibt, sondern dass es sich um mehrere Serien von Mikrocontrollern handelt, die mit unterschiedlichen C Compilern programmiert werden. Das IDF abstrahiert die feinen Unterschiede weitgehend.

Es handelt sich um einen ESP32C3. Wenn ich den Vektor kenne und dessen Adresse, gibt es da nicht die Möglichkeit mit einem Funktionszeiger dort drauf zu verweisen?

Gast

Herr J. schrieb:

gibt es da nicht die Möglichkeit mit einem Funktionszeiger dort drauf zu verweisen?

Ich sehe keinen Sinn darin, am Framework vorbei zu arbeiten. Du handelst dir damit nur unnötige Probleme ein, falls du überhaupt die notwendige Doku für Low-Level Programmierung findest. Irgendwie musst du aber auch dem Framework beibringen, deine "zu Fuß" Konfiguration nicht zu überschreiben.

Viel Glück beim Reverse-Engineering der Quelltexte. Bis du damit fertig bist, gibt es vermutlich längst ESP64 mit einem ganz anderen Framework, während Espressif die ESP32 verschimmeln lässt.

Herr J. schrieb:

Wenn ich den Vektor kenne und dessen Adresse, gibt es da nicht die Möglichkeit mit einem Funktionszeiger dort drauf zu verweisen?

Nein.

Du willst ja nicht eine ISR "von Hand" aufrufen, sondern Du möchstes, daß /Dein Code/ als ISR ausgeführt wird.

Für das Eintragen der Adressen Deiner ISR in die Interrupttabelle ist der Linker zuständig. Der kann das.

Zusätzlich ist eine ISR üblicherweise keine normale C-Funktion, sie muss mit anderen Rahmenbedingungen aufgerufen werden (alle veränderten CPU-Register auf den Stack packen und beim Verlassen den Stack entsprechend wieder abräumen) und bei den meisten Prozessorarchitekturen wird eine ISR mit einer anderen Maschineninstruktion beendet als eine normale Funktion.

Der ESP32-C3 verwendet den RISC-V-Befehlssatz, wenn Du wirklich rausfinden willst, wie da mit Interrupts hantiert wird, lies Dir das hier durch:

https://www.embien.com/blog/blog/introduction-to-risc-interrupt-handling https://www.embien.com/blog/interrupt-handling-in-risc-v-architecture

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 2 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.