Hallo Community, ich sitze gerade an einem Problem und bekomme es einfach nicht gelöst. Mein Ziel ist es anhand von eingebundenen Dateien das Verhalten des Programmes zu steuern ( genauer die ISR). Spricht folgendes, wenn ich z.B die Butten-HAL einbinde, möchte ich das bei einem Interrupt von der ISR aus die Funktion ButtenISR aufgerufen wird, die sich in der Butten-HAL definiert ist. Falls aber die Butten-HAL nicht eingebunden ist soll dies nicht geschehen und mögliche andere Funktionen aufrufen, die ebenfalls in der ISR definiert sind. Mein erster Ansatz mit Makros funktioniert leider nicht und nach längerer suche im Internet bin ich leider auf keine Lösung gekommen. Gruß GAMES Als Eckdaten noch: Controller : MSP430 Entwicklungsumgebung : CCS 5.3 von TI
Kopfkratz Einfach einen Funktionpointer in die ISR und den dann jeweils passend setzen ? Dein nicht funktionierender Code wäre auch nicht schlecht, dann wissen wir was Du eigentlich versucht hast :-P
1 | // Stark vereinfacht aber das wesentliche sollte zusehen sein
|
2 | #ifdef BUTTONHAL_H_
|
3 | #include "ButtonHAL.h" |
4 | #endif
|
5 | |
6 | #pragma vector=PORT1_VECTOR
|
7 | __interrupt void Port_1 (void) |
8 | {
|
9 | #ifdef BUTTONHAL_H_
|
10 | ButtonISR(); |
11 | #endif
|
12 | //Hier können/sollen später weiter Funktionen folgen
|
13 | |
14 | }
|
15 | |
16 | |
17 | /*.... Eine Andere Datei ....*/
|
18 | |
19 | #ifndef BUTTONHAL_H_
|
20 | #define BUTTONHAL_H_
|
21 | |
22 | void initButton(); |
23 | void setISR(void (*interruptSR)(void)); //Dies ist eine Benutzerschnittstelle |
24 | void ButtonISR(); // Ruft die von setISR gesetzte Funktion auf |
25 | |
26 | #endif
|
27 | |
28 | |
29 | /*.... Main ....*/
|
30 | |
31 | int main() |
32 | {
|
33 | initButton(); |
34 | setISR(&foo()); |
35 | }
|
So in der Art habe ich es mir vorgestellt. Ich sehen keine Möglichkeit wie ich das mir Funktionszeiger machen könnte. Ich will ja das "automatische" zuschalten in der ISR realisieren. Der Versuch mit den #defines hat leider nicht funktioniert da diese nur innerhalb einer Übersetzungseinheit sichtbar sind.
> Ich sehen keine Möglichkeit wie ich das mir Funktionszeiger machen > könnte. Ich will ja das "automatische" zuschalten in der ISR > realisieren. Das geht schon. Wichtig ist die Reihenfolge beim Compilieren. Es kommt auch darauf an, wie die HAL eingebunden, also ob es eine Headerdatei ist, die included wird (oder eben nicht), oder ob die HAL in einem C-File liegt (dann ist die Reihenfolge beim Compilieren wichtig). Den Funktionspointer lässt du dann eben auf NULL zeigen, wenn die HAL nicht aktiv ist, andernfalls lässt du den FZ auf die aufzurufende Funktion zeigen. Die HAL selbst macht sich dann z.B. durch ein "#define HAL_ACTIVE" bekannt, und das sollte sich dann per #if-Abfrage entsprechend verwerten lassen. Ralf
Es ist immer noch nicht klar WAS Du WIRKLICH willst ? Wenn es darum geht während des compilierens die passende ISR einzubauen kannst Du das über #define regeln. Wenn es dynamisch während der Laufzeit geschehen soll mußt Du entsprechende Variablen anlegen und darüber dereferenzieren. Zeige den gesamten Code und was Du WIRKLICH willst und wir schaun mal :-P
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.