Ich habe eine Frage, auf die ich denke, dass die Antwort ganz einfach ist. Aber ich konnte keine klare Antwort darauf finden.
Wenn ich diese Serviceroutine in einem Modul foo.c habe
#pragma vector = SOME_VECTOR
interrupt void fooISR(){
dosomething;
IFG = 0;
}
wenn ich in meiner Hauptsache habe.
#include "foo.h"
Dann scheint es, dass fooISR()
tatsächlich in den SOME_VECTOR geladen wird und der ISR immer dann ausgelöst wird, wenn der entsprechende IFG gesetzt ist.
Ich wollte fragen, ob dies der richtige Weg ist, Module zu schreiben, die Interrupts verwenden. Denn bei diesem Ansatz fooISR()
befindet sich der immer dann im SOME_VECTOR, wenn ich foo.h einfüge, dies lässt nicht wirklich viel Konfiguration für die Person zu, die in main arbeitet.
Wenn main.c
ich zum Beispiel auf einige Funktionen von foo.c zugreifen wollte, aber eine separate ISR für SOME_VECTOR schreiben wollte, hätte ich mit dieser Methode kein Glück, oder?
Die Sorge, die Sie im letzten Absatz äußern, ist richtig. Es scheint keine gute Idee zu sein, eine ISR mit anderen Funktionen zu bündeln, die Sie möglicherweise getrennt von der ISR wiederverwenden möchten.
Normalerweise mache ich eines der 3 Dinge:
main()
. ISRs sind kurz, damit sie nicht main.c
zu sehr überladen werden.Sie können den ISR in einen #ifdef
Block stecken, wenn dies in Ihrer speziellen Situation sinnvoll ist.
Zunächst einmal ist es nicht sinnvoll, diese Dinge zu diskutieren, es sei denn, Sie haben eine Art Programmdesign. Wenn Sie ein einfaches Programm mit weniger als 1.000 LOC oder so haben, brauchen Sie möglicherweise kein Design, es könnte ausreichen, einfach ziellos herumzuhacken.
Für größere, professionelle Programme benötigen Sie Programmdesign:
Sie sollten ISRs in derselben Datei platzieren wie den Rest des Treibers, der diese bestimmte Hardware steuert, da eine ISR Teil des Hardwaretreibers ist . Sie sollten nicht in main() sein, sie sollten nicht in einer nicht verwandten Datei sein.
Sie sollten sich nicht in einer „hier sind alle meine ISRs“-Datei befinden, es sei denn, Sie sind aufgrund von Hardware- oder Toolbeschränkungen gezwungen, sie zusammenzufassen. Möglicherweise müssen Sie die Vektortabelle jedoch in einer eigenen Datei aufbewahren, es sei denn, ihr Speicherort wird vom Linker verwaltet.
main() sollte nicht mit ISRs herumspielen. Sie haben eine Abstraktionsschicht über den Treibern und main wird die Abstraktionsschicht aufrufen. Das bedeutet, dass Sie keine enge Kopplung zwischen dem Algorithmus und der Hardware haben und dass Sie den Treiber einfach ersetzen können, ohne das gesamte Programm von Grund auf neu schreiben zu müssen.
Andrejs Gasilows
Lundin
Benutzer2601592