Eben nicht. Ein Vergleich auf 16-Bit-Wert ist mindestebns 2 Befehle lang. Auch beim Asuro. Wenn zwischen diesen beiden Befehlen ein Interrupt auftaucht, der den zu testenden Wert verändert, hast du ein Problem. Zwar nur seeeehr selten, aber du hast es. Hier sogar recht wahrscheinlich, weil du ausser nop und vergleichen nix machst. Das gilt ebenso für das Setzen solcher Werte.Zitat von luma
inline void sleep_millisec(uint16_t milliseconds)
{
// tmpCountTimer0 wird in der ISR oben inkrementiert
tmpCountTimer0 = 0;
while(tmpCountTimer0 < milliseconds)
asm volatile ("nop"); // Nichts tunOder du machst es über ein Flag wie von PicNick vorgeschlagen.Code:while (1) { uint16_t tmp; cli(); tmp = tmpCountTimer0; sei(); if (tmp < milliseconds) return; }
Lesezeichen