Vielen Dank für deine Meinung!
>Wird nur begrenzt funktionieren, das Interrupt meisten quittiert werden
>müssen und fast alle Device-Interrupts ausser vielleicht solchen Timern
>auf I/O zugreifen.
In meinem Fall werden in der Timer-ISR auch Ausgänge gesetzt und
gelesen. Es sind lauter einfache IO-Operationen. Ich hätte mir es aber
so gedacht, dass ich IO-Routinen durch Defines ersetze. Wenn ich das
Programm auf einem PC compilieren möchte, dann z.B. durch Funktionen
HAL.c
1 | #define CLEAR_VEC_ADDR() VICVectAddr = 0;
|
2 | #define CLEAR_Timer0_ISR_FLAG() T0IR = 0x01;
|
3 | #define DONE_TIMER0_ISR() {CLEAR_Timer0_ISR_FLAG(); CLEAR_VEC_ADDR
|
4 |
|
5 | // Beispiel setzten digitaler Ausgang
|
6 | #define MODULE_LED_PIN 22
|
7 | #define MODULE_LED_MASK (1 << MODULE_LED_PIN)
|
8 | #define MOUDLE_LED_PORT_ON FIO0SET
|
9 | #define MOUDLE_LED_PORT_OFF FIO0CLR
|
10 |
|
11 | #define MODULE_LED_ON MOUDLE_LED_PORT_ON = MODULE_LED_MASK
|
12 | #define MODULE_LED_OFF MOUDLE_LED_PORT_OFF = MODULE_LED_MASK
|
Im Controllerspezifischen Code würde man dann am Ender der Timer0ISR das
Define DONE_TIMER0_ISR(); aufrufen
Ist dieser Ansatz deiner Meinung nach eine Sackgasse?
>Bei einem zyklischen Timer könnte das beispielsweise ein Treiber sein,
>in den sich Routinen der Anwendung als Callbacks einklinken können. Das
>ist geringfügig weniger effizient, aber trennt Hardware von Anwendung.
Würde das deiner Ansicht dann ein sinnvolles Gerüst wenn es sich nur um
einfache IO-Operationen handelt?
1 | // file hal.c - controllerspezifischer Code
|
2 | void (*Timer0ISR_CallBack )(void);
|
3 |
|
4 | void Timer0ISR() INTERRUPT
|
5 | {
|
6 | Timer0ISR_CallBack();
|
7 | VicVectAddr = 0;
|
8 | }
|
9 |
|
10 | // Aktiviere Timer 0 Interrupt
|
11 | #define EnableT0ISR() T0MCR = 3
|
12 |
|
13 | // Deaktiviere Timer 0 Interrupt
|
14 | #define DisableT0ISR() T0MCR = 0
|
15 |
|
16 | ();}
|
17 |
|
18 | // file common.c - controllerunabhängiger Code
|
19 | #include "hal.h"
|
20 |
|
21 | void InitmyTimer0ISR(void)
|
22 | {
|
23 | Timer0ISR_CallBack = &myTimer0ISR;
|
24 | EnableTimer0ISR();
|
25 | }
|
26 |
|
27 | void myTimer0ISR(void)
|
28 | {
|
29 | // führe hier controllerunabhängigen Code aus
|
30 | ..
|
31 | ..
|
32 | }
|
Ein Vorteil der Treiber-Idee wäre meiner Meinung nach dann, wenn die
IO-Routinen komplexer werden und viel controllerspezifischen Coder
erfordern.
Wie gross ist denn die Einbusse eigentlich?
Könnte mir vorstellen:
1.) Einbusse für Aufruf einer Funktion in einer ISR
2.) Einbusse für das Sichern von Registern?
3.) ??