Forum

Einloggen | Registrieren | RSS  

Armer Neuling

29.12.2016,
09:58
 

Interrupt-Handler - Keine Parameter angeben? (Computertechnik)

Hallo,

ich habe da mal eine kleine Frage bezüglich Interrupt-Handler.

Warum können einem Interrupt grundsätzlich keine Parameter übergeben
werden, bzw. warum hat er keine Rückgabewerte?


Also es handelt sich hierbei um eine Frage aus einer Klausur.


Ich hätte jetzt einfach gedacht, dass das Problem ist, dass der
Interrupt irgendwann auslöst und mein main-Programm dadurch unterbrochen
wird.
Da er an einer X-beliebigen Stelle unterbrochen wird und ich ihn nicht
gezielt also z.B. genau in der Codezeile 77 im Programmcode aufrufen
kann, also nicht irgendwelchen Variablen angeben kann, die dessen
Rückgabewerte speichern sollen, hat es auch keinen Sinn
Rückgabeparameter zu verwenden.

Außerdem habe ich oft etwas von einem Stack und Variablen sollten
volatile sein gelesen und deshalb kann man keine Parameter angeben.


Über Hilfe in einfachen und verständlichen Worten wäre ich sehr erfreut!
;)
Schonmal Danke an die Leute die sich dafür die Zeit nehmen!

bastelix(R)

30.12.2016,
00:40

@ Armer Neuling

Interrupt-Handler - Keine Parameter angeben?

» Warum können einem Interrupt grundsätzlich keine Parameter übergeben
» werden, bzw. warum hat er keine Rückgabewerte?
Das kann man nicht allgemein beantworten. Darum gehe Ich mal davon aus, dass sich deine Frage auf µC-Programmierung mit C/C++ bezieht .

» Also es handelt sich hierbei um eine Frage aus einer Klausur.
Für welches Fach? (aus reiner Neugier ;-) )

» Ich hätte jetzt einfach gedacht, dass das Problem ist, dass der
» Interrupt irgendwann auslöst und mein main-Programm dadurch unterbrochen
» wird.
Ja; dein Programm wird unterbrochen, der Interrupt-Handler wird ausgeführt, dann wird an die unterbrochene Stelle in deinem Programm zurückgesprungen und der normale Programmflow geht weiter. Wenn der Interrupt-Handler verlassen wird ist da kein Code der den Rückgabewert des Interrupt-Handlers abfragen und weiter verarbeiten könnte, der Interrupt kann ja jederzeit auftreten.

Bezüglich der Parameter ist deine Frage, selbst mit meinen Annahmen, zu ungenau. Darum sage ich dazu im Moment lieber nichts als was falsches.

» Außerdem habe ich oft etwas von einem Stack und Variablen sollten
» volatile sein gelesen und deshalb kann man keine Parameter angeben.
Volatile sagt dem Compiler nur, dass er für diese Variable beim Optimieren aufpassen muss. Variablen die nicht als volatile deklariert sind, werden nicht für jede Operation erneut aus dem RAM geladen. Leseoperationen aus dem RAM sind teuer (= zeitaufwändig), daher wird der Wert einer Variable einmal aus dem RAM geladen und dann so lange in einem CPU-Register/Cache gehalten wie es der Compiler für sinnvoll hält und der Wert der Variablen wir erst dann in den RAM zurückgeschrieben wenn die Variable aus dem Register entfernt wird. Mit volatile sagst du dem Compiler, dass er die Variable jedes mal aus dem RAM holen soll.
Wenn ein Interrupt-Handler den Wert der Variable verändert, dann ist volatile wichtig, da die CPU ansonsten die Variable gerade im Cache halten könnte während der Interrupt-Handler auf die Variable zugreift.

Thomas Kuster(R)

01.01.2017,
03:04
(editiert von Thomas Kuster
am 01.01.2017 um 03:06)


@ Armer Neuling

Interrupt-Handler - Keine Parameter angeben?

Hallo Armer Neuling
wenn ein Interrupt ausgelöst wird, kann das laufende Programm nicht wissen, durch welchen Interrupt es unterbrochen wird. Deshalb ist es logischerweise auch nicht möglich, dem unbekannten Interrupt Daten mitzugeben. Gleich sinnlos ist es, beim Verlassen des Interrupts direkt Daten vom Interrupt zu erwarten, weil ja das Hauptprogramm gar nicht wissen kann, wodurch es unterbrochen geworden war.

Mit vielen freundlichen Grüssen Thomas

el-haber

03.01.2017,
12:58

@ Armer Neuling

Interrupt-Handler - Keine Parameter angeben?

Hey,
Ein Interrupt wird meißt von einem Kanal (I/O-Pin) oder einer Prozess-Exception ausgelöst.
Diese ist elektrisch im Prozessor-Steuerwerk verdrahtet und aktiviert eine Aktion an einer bestimmten Programm-Adresse.
Damit das Umschalten schnell erfolgen kann und das laufende Programm nicht beeinflusst wird, dürfen weder die Registerfiles noch der Stack verändert werden.
Es wird lediglich die Rücksprungadresse auf dem Stack abgelegt - für einen größeren Datensatz ist hier keine Zeit und kein Platz, damit die Umschaltung schnell und sicher erfolgen kann.

Die sonst bei Funktionen übliche Methode: Call-Stack mit Variablen oder Register-Datenübergabe kann hier also nicht greifen.
Es ist auch nicht definierbar, welche Daten ein externer Interrupt übernehmen soll - bei Z80 gab es mal eine Interrupt-Gerätekennung, mit der in 8bit codiert werden konnte, welches Gerät den INT ausgelöst hatte. Letztlich war es dann aber nur eine Programm-Adress-Berechnung mit dem 8-bit-Wert, an der die Steuerung weitermachte.


cu
ST