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
versuche ertsmal herrauszubekommen was eine .c und was eine .h ist und was da drin zu stehen hat
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
>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.
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.
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
>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?
Dazu empfehle ich Dir noch die Lektüre des Abschnittes "Interrupts" in dem Datenblatt des Prozessors.
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.
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.
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.
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?
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.
Krapao schrieb: > Für die Definitionen von sei() und cli() Ach stimmt, das steht da ja auch mit drin. ;-)
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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.