ISR in main.c einbinden nötig?

OP #2501589
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
OP #2501595
Das weiß ich, hat aber nichts mit meiner Frage zu tun. Habe ja oben 
geschrieben dass in der H-Datei nichts von der ISR steht und es somit 
auch kein Sinn machen würde die .h in die main.c zu binden. Angenommen 
man braucht nichts anderes aus xxx.c in main.c
Gast #2501602
>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
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
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
>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
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
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
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
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

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