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

TA1R là Đăng ký Timer_A. Tôi vẫn không hiểu tại sao có một vòng lặp. Nếu họ muốn trả lại thời gian whydont họ chỉ đơn giản là trả lại TA1R. Vòng lặp là gì?Đoạn mã sau làm gì

+0

TA1R có thể thay đổi giá trị giữa thời gian được đọc vì đó là lần đăng ký. –

Trả lời

13

Nó cố gắng tránh trường hợp khi bạn hỏi thời gian hiện tại nhưng nó trả về giá trị ngay trước thời gian. Vì vậy, nó chỉ trả về thời gian hiện tại nếu đọc ổn định.

+8

Bạn đặt cược cho tôi bằng một đánh dấu – TheBlastOne

+0

Đúng. Điều đó có ý nghĩa bây giờ – user2578666

2

Mã đang cố gắng đợi cho đến khi TA1R thay đổi và sau đó trả lại giá trị cũ của TA1R.

Mã này sẽ chỉ hoạt động nếu TA1R được khai báo là volatile, nếu không trình biên dịch có thể tối ưu hóa vòng lặp.

+0

Điều gì sẽ xảy ra nếu lần đọc tiếp theo của bộ hẹn giờ (t1 và t2) liên tục trả về các giá trị khác nhau? Điều này không có vẻ là một giải pháp mạnh mẽ nếu bộ đếm thời gian có tần số cao. – jozzas

+4

Ngoài ra, câu trả lời của bạn không đúng - lưu ý '! =' Trong 'while (t1! = T2)' –

+0

đồng ý rằng đây không phải là giải pháp mạnh mẽ. – markgz

Các vấn đề liên quan