Max schrieb:
> /* Implementierung für SPI Slave*/
> static SpiDriver* spiDriver = 0;
> int32_t spislave_Open(const SpiDriver* const driverPtr, ...)
> {
> spiDriver = driverPtr;
> ...
> }
>
> int32_t spislave_Read(...)
> {
> spiDriver->Read(...);
> ...
> }
>
> int32_t spislave_Write(...)
> {
> spiDriver->Write(...);
> ...
> }
Wenn du dir schon so viel mühe machen willst, solltest du es auch
ordentlich machen -> Wenn eine Funktion einen Rückgabewert hat, solltest
du diesen auch auswerten, sonst macht der Rückgabewert keinen Sinn. Dann
kommen wir zur nächsten Frage: Was hast du von dem Rückgabewert/der
Auswertung?
Mal angenommen deine Read-Funktion gibt eine -1 zurück, weil nicht
gelesen werden konnte (warum auch immer)... was machst du damit? In der
Regel hat man bei sowas keine Anzeige, die dir sagt:
Hey ich konnte nicht lesen, was soll ich jetzt machen?
Außerdem würd ich mir das mit dem int32 als return überlegen, wenn du
das für die kleinen 8bitter machst. Ein int32 braucht erheblich länger
als ein int8. Mag bei einem einmaligen Aufruf egal sein, aber wenn du
die Funktion im extrem Fall Hunderte male die Sekunde aufrufst, dann
geht da auf dauer ganz schön viel Zeit verloren. Und da du von einem
"Treiber" sprichst, sollte Performance eine hohe Priorität bekommen,
denn das ist etwas, wodrauf in der Treiberentwicklung geachtet wird.
Ansonsten wie schon gesagt wurde:
Arne Maximilian R. schrieb:
> Wie wahrscheinlich ist ein Hardwarewechsel?
Wenn du innerhalb einer Controllerfamilie bleibst, z.B. Atmel AVR dann
sind die Anpassungen zwischen den controllern sehr gering (Registernamen
ändern, und gut ist). Wenn du den Code natürlich von AVR auf
Cortex(SAM3X) heben willst, oder noch besser von Atmel auf PIC oder
sonst wohin, dann ist schon mehr arbeit nötig.
Max schrieb:
> Wie handhabt ihr das? Greift ihr immer direkt auf die Hardware durch
> oder baut ihr auch "Zwischenschichten" um den Zugriff zu abstrahieren?
Ich hab mir z.B. eine Klasse (ja, ich benutze auch auf den 8bittern C++)
für den UART geschrieben, ganz simpel, keine Vererbung oder Templates
oder sowas.
1 | class UART
|
2 | {
|
3 | public:
|
4 | UART(uint32_t baudrate);
|
5 | ~UART();
|
6 | void TransmitData(char value);
|
7 | char ReceiveData(void);
|
8 | };
|
Ganz easy, keine sonderwünsche, reicht für meine Anforderungen. Ist
momentan noch auf einen bestimmten UART-Port festgenagelt, aber das ist
für mich nicht so schlimm. Wenn ich den Port wechsel muss ich nur die
Registernamen anpassen und gut ist. Und die Klasse(C++) erzeugt hier
auch keinen riesigen Overhaed, wie es hier von so vielen Propagiert
wird. Das mag durch aus anders aussehen, wenn man von 36 Klassen
ableitet und dazu noch Container aus der STL, wie "string",
"stringstream", "vektor" und ähnliches verwendet. Aber das ist ein
anderes Thema^^
Grüße