Du hast schlicht ein Atomizitäts-Problem. g_msec ist größer als ein Byte, und damit kann der Vergleich nicht atomar sein. Er besteht aus mehreren Maschinenbefehlen und der Interrupt kann da mitten rein fallen. Was ganz genau passiert, ist folgendes:if (g_msec > 999)
...
PS: der Wert von g_msec, wenn er fälschlich reinspringt, ist offenbar immer 768 (dez.)
- g_msec ist 767 (0x02ff) wenn der Vergleich beginnt.
- Zuerst wird das Low-Byte genommen (0xff).
- Jetzt kommt der Interrupt und ändert g_msec von 767 (0x02ff) auf 768 (0x0300).
- Der Vergleich macht weiter mit dem High-Byte (0x03).
- Ergebnis des Vergleichs: True, weil 1023 (0x03ff) größer ist als 999.







Zitieren
Lesezeichen