Ich habe mal den genialen Tip bekommen, für den schreibenden Zugriff auf
einzelne I/O Pins bei AVR Makros zu verwenden:
1 | #define writeBit(port,bit,value) { if ((value)>0) (port) |= (1<<bit); else (port) &= ~(1<<bit); }
|
Dieses Makros kann der Compiler wunderbar optimieren, wenn bit und value
Konstanten sind. Aus "writeBit(PortA,3,1)" wird zum Beispiel "PortA|=1".
Aber Makros finde ich häßlich, vor allem wirken sie sich auf
Fehlermeldungen störend aus. Wenn ich sie intensiv nutze, meldet mir der
Compiler in Fehlermeldungen oft (aber komischerweise nicht immer)
falsche Zeilen Nummern.
Deswegen erwäge ich, lieber Funktionen/Prozeduren zu verwenden. Aber
dann klappt die Optimierung nicht mehr so gut, oder doch?
1 | void writeBit(??? port, uint8_t bit, uint8_t value) {
|
2 | if (value>8)
|
3 | port |= (1<<bit);
|
4 | else
|
5 | port &= ~(1<<bit);
|
6 | }
|
Wie kann ich das so verbessern, dass sowohl der Funktionsaufruf als auch
der if-Ausdruck weg optimiert werden, sofern bit und value Konstanten
sind?
Und was gehört an der Stelle ??? hin?