user schrieb:
> Alle hardwareabhängigen Codestellen werden immer in einer eigenen C bzw.
> H Datei festgelegt.
user schrieb:
> Hmmm...das macht das ganze unübersichtlich.
Da geb ich dir Recht, das macht es wirklich unübersichtlich, und auch
schwer Wartbar und Portierbar. Besser du fasst alle Hardware
Abhängigkeiten in einem Softwaremodul zusammen. (lass uns dieses
Softwaremodul "IOMUX" nennen)
IOMUX kümmert sich um die Initialisierung aller Pins und Alternate
Functions, damit sich die Schnittstellentreiber nicht mehr darum kümmern
müssen. Beispiel SPI: Der SPI-Treiber modifiziert nur SPI-Register,
keine GPIO-Register! So lassen sich Treiber von einem Board auf ein
anderes portieren, ohne den Code anfassen zu müssen.
IOMUX kann sich dann auch um EXTI kümmern, da diese ja stark von den
Pins abhängt. Zusätzlich bietet es Makros, die dann die Treiber
verwenden. z.B. so:
1 | iomux.h
|
2 | -------
|
3 | #define SPI_ExtiIrq EXTI0_IRQHandler
|
4 | #define UART_ExtiIrq EXTI3_IRQHandler
|
5 |
|
6 | #define ETHERNET_ExtiIrq EXTI14_IRQHandler /* Dies ist kein Hardware-Handler! */
|
7 | /* Sonder Teil von EXTI15_10 */
|
8 |
|
9 |
|
10 | iomux.c
|
11 | -------
|
12 |
|
13 | #include "iomux.h"
|
14 |
|
15 | // externe funktionen bekannt machen
|
16 | extern void ETHERNET_ExtiIrq ();
|
17 |
|
18 | //wrapper für exti9_5 und exti15_10
|
19 | void EXTI15_10_IRQHandler () {
|
20 | if (/*line 14*/) ETHERNET_ExtiIrq();
|
21 | ...
|
22 | }
|
23 |
|
24 | ethernet.c
|
25 | ----------
|
26 | #include "iomux.h"
|
27 |
|
28 | void ETHERNET_ExtiIrq () {
|
29 | // deine IRQ
|
30 | }
|
Dieses konzept muss noch erweitert werden, um die Interrupt Flags zurück
zu setzen, sowie die initialisierung der EXTI in einer IOMUX_Init().