Forum: Mikrocontroller und Digitale Elektronik ISR in main.c einbinden nötig?


von Patrick B. (patrick_b)


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
von fdssd (Gast)


Lesenswert?

versuche ertsmal  herrauszubekommen was eine .c und was eine .h ist
und was da drin zu stehen hat
von Patrick B. (patrick_b)


Lesenswert?

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
von Naja (Gast)


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.
von Naja (Gast)


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.
von Patrick B. (patrick_b)


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
von Naja (Gast)


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?
von Naja (Gast)


Lesenswert?

Dazu empfehle ich Dir noch die Lektüre des Abschnittes "Interrupts" in 
dem Datenblatt des Prozessors.
von Krapao (Gast)


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.
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Nur in die *.c . Ich gehe mal davon aus, das du deine *.h Datei nimmst 
um irgendwelche prototypen und defines zu machen und da brauchts keine 
ISR includes.
von Stefan E. (sternst)


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.
von Stefan E. (sternst)


Lesenswert?

Krapao schrieb:
> Das #include <avr/interrupt.h> sollte in dem/den C-File(s) stehen wo
> ...
> 2) der Interrupt, der die ISR aufruft, konfiguriert/initialisiert wird

Wofür das?
von Krapao (Gast)


Lesenswert?

Für die Definitionen von sei() und cli()
von Werner (Gast)


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.
von Stefan E. (sternst)


Lesenswert?

Krapao schrieb:
> Für die Definitionen von sei() und cli()

Ach stimmt, das steht da ja auch mit drin. ;-)
von Patrick B. (patrick_b)


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.
von Stefan E. (sternst)


Lesenswert?

Patrick B. schrieb:
> Außerdem weiß ich, dass ich die ISR nicht
> aufraufen kann.

Doch, kannst du.
Aber die Notwendigkeit dazu besteht eigentlich nie (nur zum Debuggen 
manchmal nützlich).
von Patrick B. (patrick_b)


Lesenswert?

Ok, danke für die Info.
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.