Forum: Mikrocontroller und Digitale Elektronik Interrupt Service Routine erstellen


von Herr J. (bugsimpson)


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

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Herr J. schrieb:
> Wie genau sind diese ISR verknüpft?

Ist nicht immer gleich, deshalb steht sowas im Datenblatt des 
verwendeten Prozessors.

Gruss
WK

von Harald K. (kirnbichler)


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.

von Herr J. (bugsimpson)


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?

von Monk (Gast)


Lesenswert?

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.

von Herr J. (bugsimpson)


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?

von Harald K. (kirnbichler)


Lesenswert?

Herr J. schrieb:
> Die Adressen habe ich gefunden im DB. Und nun?

Sieh in die Dokumentation des von Dir verwendeten Compilers. Da wird das 
drinstehen, wie Du eine Funktion als ISR deklarierst.

von Rainer W. (rawi)


Lesenswert?

Herr J. schrieb:
> Okay und wie mache ich daraus eine Funktion das sollte ein Interrupt
> auftreten das er in meine Routine springt?

Kannst du da vielleicht noch ein paar Satzzeichen einstreuen und auch 
die Schreibung etwas überarbeiten, damit daraus ein verständlicher 
deutscher Satz wird?

: Bearbeitet durch User
von Monk (Gast)


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.

von Herr J. (bugsimpson)


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?

von Monk (Gast)


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.

von Harald K. (kirnbichler)


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

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.