ISR in main.c einbinden nötig?

OP #2501589
Lesenswert?

Hi,

kurze Frage. Für euch sicherlich leicht zu benatworten.

Ich habe eine Datei xxx.h und xxx.c. In der C-Datei befindet sich meine 
ISR. Muss ich die H-Datei in main.c einbinden, damit bei einem Interrupt 
die ISR aufgerufen wird oder funktioniert das auch so automatisch? Da in 
der H-Datei keine Informationen enthalten sind, aus denen hervogeht, 
dass überhaupt eine ISR in der C-Datei existiert, gehe ich davon aus, 
dass man sie nicht einbinden muss.

Gleicher Fall wie oben. Muss ich #include <avr/interrupt.h> in beide 
C-Dateinen einbinden oder nur in xxx.c?

Danke,

Patrick
Gast #2501602
Lesenswert?

>Das weiß ich ...

So?

Und warum dann diese Formulierung?
>... die .h in die main.c zu binden ...

Was ist mit "binden" in diesem Satz gemeint?

Deine Frage ist eine ganz andere, hat nichts mit H-Dateien zu tun. (Was 
wieder darauf hinweist, das Du nicht weisst was Interrupts sind).

Es geht darum ob der Object-Code der Interruptroutine in dem Abbild des 
Programmes enthalten ist.
Kurze Antwort: Ja.
Hängt das davon ab, ob irgendeine H-Datei in main eingefügt (include) 
wird?
Nein.
Gast #2501607
Lesenswert?

Warum stellst Du dann überhaupt so eine Frage?

Weil Du nicht weisst, auf welche Weise ein Interrupt-Handler im Abbild 
eingefügt wird, obwohl er ja nie explizit aufgerufen wird.

OK. Und warum fragst Du nicht danach, sondern irgendwelchen ... mit 
H-Files?

Keine Ahnung.
OP #2501610
Lesenswert?

Habe ich doch oben geschrieben, dass ich nicht davon ausegehe, dass man 
die .h ind die main.c einbinden muss. Also #include "xxx.h" schreiben 
muss, da eine ISR nicht in einer H-Datei definiert werden muss.

Meine Frage zielt viel eher darauf ab, woher mein Programm weiß wo für 
ein Interrupt, dass ausgelöst wird, die passende ISR zu finden ist. Wie 
wird den nach der ISR gesucht?

Muss ich #include <avr/interrupt.h> nur in die xxx.c schreiben oder auch 
in meine main.c?

Danke
Gast #2501613
Lesenswert?

>Habe ich doch oben geschrieben, dass ich nicht davon ausegehe, dass man
>die .h ind die main.c einbinden muss.

So?
Warum lautet Deine Frage dann: "ISR in main.c einbinden nötig?" wenn Du 
die Antwort schon weisst?

Schau Dir mal die Dokumentation (und im Falle von gnu c den Quelltext 
an).
Was unterscheidet eine Interrupt-"Funktion" von einer C-Funktion?
Gast #2501620
Lesenswert?

Das #include <avr/interrupt.h> sollte in dem/den C-File(s) stehen wo

1) die ISR Funktion definiert wird
2) der Interrupt, der die ISR aufruft, konfiguriert/initialisiert wird

Das kann und wird meistens ein der gleichen C-Datei gemacht und oft ist 
es auch das C-File in der die main() Funktion definiert wird.

Das Programm braucht nicht zu wissen, wo die ISR zu finden ist. Der 
Interrupthandler des µC muss es wissen. Und der bekommt es gesagt, indem 
die Interrupt Service Routine mit dem Schlüsselwort ISR und einem 
Vektornamen definiert wird. Die bewirkt, dass die Toolchain beim 
Kompilieren einen Programmcode erzeugt, bei dem die Einsprungadresse der 
Funktion an einer wohlbestimmten Adresse im µC liegt und bei genau dem 
auftretenden Interrupt angesprungen werden kann.
#2501624
Lesenswert?

Patrick B. schrieb:
> Meine Frage zielt viel eher darauf ab, woher mein Programm weiß wo für
> ein Interrupt, dass ausgelöst wird, die passende ISR zu finden ist. Wie
> wird den nach der ISR gesucht?

Weil die ISR einen speziellen Namen hat, wird vom Linker in der 
Vektor-Tabelle ein Sprung auf die Funktion eingetragen.

Patrick B. schrieb:
> Muss ich #include <avr/interrupt.h> nur in die xxx.c schreiben oder auch
> in meine main.c?

Nur in die c-Datei, in der die ISR steht.
Gast #2501632
Lesenswert?

fdssd schrieb:
> versuche ertsmal  herrauszubekommen was eine .c und was eine .h ist
> und was da drin zu stehen hat.

Patrick B. schrieb:
> Das weiß ich, ...

Zusätzlich solltest du noch verstehen, welche Funktion die Dateien 
haben.

Wenn du dann noch aus dem Datenblatt deines (uns unbekannten) Prozessors 
herausbekommen hast, wie das dort mit den Interupt-Vektoren geregelt 
ist, sollte schon vieles klarer werden.
OP #2501649
Lesenswert?

Danke für die Antworten.

@Naja: Dass ich eine Interruptfunktion nicht wie eine C-Funktion 
definieren brauch, weiß ich. Außerdem weiß ich, dass ich die ISR nicht 
aufraufen kann. Diese wird aufgerufen wenn ein Interrupt eintritt, 
welches zu dem festgelgten Namen der ISR gehört. Definiert sind sie in 
der avr/interrupt.h. Das Problem war, dass ich nicht wusste, dass es ein 
Interrupthandler bzw. Linker gibt.

@Krapao: Danke für die ausführliche Erklärung mit den Fachbegriffen. Die 
kannt ich nicht davor und deshalb war meine Frage zu begin wohl 
undeutlich gestellt.

@Matthias Sch.: Ja in der xxx.h steht natürlich nichts von der ISR. Da 
stehen nur prototypen und defines wie dus geschrieben hast.

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