Interrupt Service Routine erstellen

OP #7753349
Lesenswert?

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

#7753355
Lesenswert?

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 #7753373
Lesenswert?

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?

OP #7753388
Lesenswert?

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 #7753401
Lesenswert?

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 #7753407
Lesenswert?

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 #7753418
Lesenswert?

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.

#7753672
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren