2013-08-06 11 views
10
short rtimer_arch_now(void) 
{ 
    short t1, t2; 
    do { 
    t1 = TA1R; 
    t2 = TA1R; 
    } while(t1 != t2); 
    return t1; 
} 

TA1R to rejestr Timer_A. Wciąż nie rozumiem, dlaczego istnieje pętla. Jeśli chcą zwrócić czas, który po prostu zwrócą TA1R. Do czego służy pętla?Co oznacza poniższy kod:

+0

TA1R może zmieniać wartości między odczytem, ​​ponieważ jest rejestrem. –

Odpowiedz

13

Próbuje uniknąć przypadku, gdy pytasz o bieżący czas, ale zwraca wartość tuż przed upływem czasu. Zatem zwraca tylko bieżący czas, jeśli odczyt jest stabilny.

+8

Założę się o mnie przez kliknięcie – TheBlastOne

+0

Tak. Teraz ma to sens – user2578666

2

Kod próbuje czekać do zmiany TA1R, a następnie zwraca starą wartość TA1R.

Ten kod zadziała tylko, jeśli TA1R został zadeklarowany jako volatile, w przeciwnym razie kompilator może zoptymalizować pętlę.

+0

Co się stanie, jeśli kolejne odczyty timera (t1 i t2) będą nieustannie zwracać różne wartości? Nie wydaje się to dobrym rozwiązaniem, jeśli czasomierz ma wysoką częstotliwość. – jozzas

+4

Również twoja odpowiedź jest niepoprawna - zauważ, że '! =' In 'while (t1! = T2)' –

+0

zgodziło się, że nie jest to niezawodne rozwiązanie. – markgz