Ich hab das spasseshalber mal für ein Projekt (zumindest Ansatzweise)
umgesetzt:
hal.c:
1 | #include "hal.h"
|
2 |
|
3 | void initPort(uint8_t port, uint8_t direction)
|
4 | {
|
5 | switch(port)
|
6 | {
|
7 | case 'a':
|
8 | DDRA = direction;
|
9 | break;
|
10 |
|
11 | case 'b':
|
12 | DDRB = direction;
|
13 | break;
|
14 |
|
15 | case 'c':
|
16 | DDRC = direction;
|
17 | break;
|
18 |
|
19 | case 'd':
|
20 | DDRD = direction;
|
21 | break;
|
22 | }
|
23 | }
|
hal.h:
1 | #include <inttypes.h>
|
2 | #include <avr/io.h>
|
3 | #include "lcd.h"
|
4 |
|
5 | void initPort(uint8_t port, uint8_t direction);
|
6 | void setPort(uint8_t port, uint8_t value);
|
Die hal.h macht man dann der Anwendung bekannt. Dinge, die die
Anwendung nicht kennen darf, packt man in ne separate Header, die man
auch in der hal.c einbindet (z.B. darf das Definitionsfile für den
Controller, z.B. m8def.in, nur der HAL bekannt sein, da ansonsten die
Anwendung wieder direkten Zugriff auf die Hardware bekommt.).
Das verlangt natürlich eine gewisse Disziplin, das durchzuhalten. Und
wie gesagt, ob das im Hobbybereich Sinn macht, sei dahingestellt. Auf
den ersten Blick sieht es deutlich nach Mehraufwand auf, aber
spätestens beim 2. Projekt amortisiert sich das dann wieder.
Man kann diese Trennung auch mal mit einem Betriebssystem vergleichen.
Dieses lässt auch keine direkten Zugriffe auf die Hardware zu, sondern
kapselt jeglichen Zugriff (sofern überhaupt möglich) in Funktionen, die
gleich noch Kontrollfunktion haben. Somit kann man schon im Vorfeld
falsche Parameter filtern.
Na ja, genug geredet. Falls du noch mehr Infos dazu willst, kannst du
ja schreiben.
Gruß, ERDI - Soft.