Das hier
1 | for (i = 0; i < LED_COUNT; i++) {
|
2 | if (ledctx[i].state == LED_OFF) {
|
3 | out &= ~_BV(i);
|
sind so typische Operationen, die du nicht haben willst, wenn der µC
keinen Barrelshifter hat. Das _BV(i) muss dann vom Compiler in eine
Schleife aufgelöst werden
1 | result = 0x01;
|
2 | for( j = 0; j < i; j++ )
|
3 | result <<= 1;
|
und das willst du eigentlich nicht. Vor allen Dingen, wenn es sich
leicht vermeiden lässt
1 | uint8_t bitMask;
|
2 |
|
3 | bitMask = 0x01;
|
4 |
|
5 | for (i = 0; i < LED_COUNT; i++) {
|
6 |
|
7 |
|
8 | if (ledctx[i].state == LED_OFF) {
|
9 | out &= ~bitMask;
|
10 |
|
11 | ....
|
12 | }
|
13 | ....
|
14 |
|
15 | bitMask <<= 1;
|
16 | }
|
Deine Schreibweise ist furchtbar. Deine else hab ich erst im dritten
Anlauf gesehen. Es ist nichts falsch an
1 | if ( ..... ) {
|
2 |
|
3 | ....
|
4 | }
|
5 |
|
6 | else if( ...... ) {
|
7 | ....
|
8 | }
|
9 |
|
10 | else if( ...... ) {
|
11 | ....
|
12 | }
|
13 |
|
14 | else {
|
15 | ....
|
16 | }
|
ausser, dass so auch ein halbblinder Blindenhund auf 5 Meter Entfernung
sehen kann, dass es sich um mehrere Alternativen handelt, von denen die
erste genommen wird.
Bei
1 | if ( ..... ) {
|
2 |
|
3 | ....
|
4 | } else
|
5 |
|
6 | if( ...... ) {
|
7 | ....
|
8 | } else
|
9 |
|
10 | if( ...... ) {
|
11 | ....
|
12 | }
|
13 |
|
14 | else {
|
15 | ....
|
16 | }
|
sieht man das weit nicht so gut, weil jeder automatisch immer auf den
Zeilenafang schaut und nicht eine Zeile drüber, ob da vor dem if noch
ein else steht. Beim schnellen drüber lesen sind das 3 voneinander
unabhängige if. Und erst im dritten Anlauf entdeckt man dann noch die
else und stellt die richtige Assoziation her, dass die 3 if dann doch
nicht so unabhängig voneinander sind, wie es erst den Anschein hatte.