Heiko Nocon schrieb:
[zur C-Deklaration "volatile void *next;"]Es sagt dem C-Compiler zweierlei.
- Es handelt sich um einen Zeiger auf etwas unbestimmtes (void)
- Das, worauf gezeigt wird, kann durch nicht vom Compiler veranlassten Code geändert werden. Gerade (2) ist im Hinblick auf Optimierungen wichtig.
Mit volatile verhinderst Du, daß ein guter Optimierer zu viel und deshalb aus Programmierersicht falsch optimiert. Beispiel:
/*0*/ int irq_counter; /* wird in ISR inkrementiert */
/* wartet, bis mindestens ein Interrupt auslöst */ void wait_for_irq() { /*1*/ int start_counter = irq_counter; /*2*/ while(start_counter == irq_counter) ; /* !! */ /*3*/ /* hier kommt er vielleicht nie hin */ }
Ein optimierender Compiler erkennt, dass sich nach (1) offensichtlich start_counter und irq_counter nicht ändern. Deshalb ist die while-Bedingung immer true und es entsteht eine Endlosschleife. Eine Endlosschleife kann zu Label: jmp Label optimiert werden. OK, ein guter Compiler sollte vielleicht noch eine Warnung ausgeben.
Wenn (0) als volatile int irq_counter; deklariert wird, sagt es dem Compiler, daß er die Bedingung in der while-Schleife tatsächlich generieren muß.
- Heinz