Các cụm từ được trích dẫn không phải là một cảnh báo, nó chỉ là một tuyên bố về cách mọi thứ hoạt động.
Về bản chất, không có gì sai khi sử dụng millis()
hoặc micros()
trong một thói quen ngắt được viết đúng.
Mặt khác, làm bất cứ điều gì trong một thói quen ngắt được viết không đúng là định nghĩa sai.
Một thói quen gián đoạn mất hơn một vài micro giây để thực hiện công việc của nó, trong nhiều khả năng, được viết không đúng cách.
Tóm lại: Một thói quen ngắt được viết đúng sẽ không gây ra hoặc gặp phải vấn đề với millis()
hoặc micros()
.
Chỉnh sửa: Liên quan đến việc tại sao micros () "bắt đầu hoạt động thất thường", như được giải thích trong một cuộc kiểm tra trên trang web của chức năng Arduino micros , micros()
mã trên một Uno bình thường có chức năng tương đương với
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Điều này trả về một chiều dài không dấu bốn byte bao gồm ba byte thấp nhất từ timer0_overflow_count
và một byte từ thanh ghi đếm bộ đếm thời gian-0.
Nó timer0_overflow_count
được tăng lên khoảng một lần mỗi mili giây bởi TIMER0_OVF_vect
trình xử lý ngắt, như được giải thích trong một cuộc kiểm tra của trang web hàm arduino millis .
Trước khi một trình xử lý ngắt bắt đầu, phần cứng AVR sẽ vô hiệu hóa các ngắt. Nếu (ví dụ) một trình xử lý ngắt đã chạy trong năm mili giây mà các ngắt vẫn bị vô hiệu hóa, thì ít nhất bốn lần tràn 0 hẹn giờ sẽ bị bỏ qua. [Các ngắt được viết bằng mã C trong hệ thống Arduino không được phát hành lại (có khả năng xử lý chính xác nhiều lần thực thi chồng chéo trong cùng một trình xử lý) nhưng người ta có thể viết một trình xử lý ngôn ngữ lắp ráp reentrant mà reenables bị gián đoạn trước khi nó bắt đầu một quá trình tốn thời gian.]
Nói cách khác, bộ đếm thời gian tràn ra không được xếp chồng lên trên; Bất cứ khi nào xảy ra tràn trước khi ngắt từ tràn trước đó, bộ millis()
đếm sẽ mất một phần nghìn giây và timer0_overflow_count
lần lượt sự khác biệt cũng bị micros()
sai bởi một phần nghìn giây.
Liên quan đến việc rút ngắn thời gian xử lý gián đoạn trên 500 giây, để ngăn chặn việc ngắt thời gian quá lâu, bạn có thể tăng lên dưới 1024 (s (ví dụ 1020) s) và millis()
vẫn hoạt động, hầu hết thời gian. Tuy nhiên, tôi coi một trình xử lý ngắt mất hơn 5 as là một kẻ chậm chạp, hơn 10 as là lười biếng, hơn 20 as như ốc sên.