Ungkapan yang dikutip bukanlah peringatan, itu hanya pernyataan tentang bagaimana segala sesuatu bekerja.
Secara intrinsik tidak ada yang salah dengan menggunakan millis()
atau micros()
dalam rutinitas interupsi yang ditulis dengan benar.
Di sisi lain, melakukan apa saja dalam rutinitas interupsi yang ditulis dengan tidak benar secara definisi salah.
Rutin interupsi yang membutuhkan lebih dari beberapa mikrodetik untuk melakukan tugasnya, kemungkinan besar, ditulis secara tidak benar.
Singkatnya: Rutin interupsi yang ditulis dengan benar tidak akan menyebabkan atau menghadapi masalah dengan millis()
atau micros()
.
Sunting: Mengenai "mengapa micros ()" mulai berperilaku tidak menentu "", seperti yang dijelaskan dalam laman " pemeriksaan fungsi mikro Arduino ", micros()
kode pada Uno biasa secara fungsional setara dengan
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Ini mengembalikan empat byte unsigned long yang terdiri dari tiga byte terendah dari timer0_overflow_count
dan satu byte dari register penghitung timer-0.
Ini timer0_overflow_count
bertambah sekitar satu kali per milidetik oleh TIMER0_OVF_vect
interrupt handler, seperti yang dijelaskan dalam pemeriksaan halaman web fungsi arduino millis .
Sebelum pengendali interupsi dimulai, perangkat keras AVR menonaktifkan interupsi. Jika (misalnya) interrupt handler dijalankan selama lima milidetik dengan interupsi masih dinonaktifkan, setidaknya empat timer 0 overflow akan terlewatkan. [Interupsi yang ditulis dalam kode C dalam sistem Arduino bukan reentrant (mampu menangani dengan benar beberapa eksekusi yang tumpang tindih dalam handler yang sama) tetapi orang dapat menulis handler bahasa assembly reentrant yang mengaktifkan kembali interupsi sebelum memulai proses yang memakan waktu.]
Dengan kata lain, kelebihan waktu tidak "menumpuk"; setiap kali overflow terjadi sebelum interupsi dari overflow sebelumnya telah ditangani, millis()
penghitung kehilangan milidetik, dan perbedaan timer0_overflow_count
pada gilirannya membuat micros()
kesalahan dengan milidetik juga.
Mengenai "lebih pendek dari 500 μs" sebagai batas waktu atas untuk pemrosesan interupsi, "untuk mencegah pemblokiran timer terlalu lama", Anda bisa naik hingga di bawah 1024 μs (misalnya 1020 μs) dan millis()
masih akan berfungsi, sebagian besar waktu. Namun, saya menganggap interrupt handler yang mengambil lebih dari 5 μs sebagai sluggard, lebih dari 10 μs sebagai slothful, lebih dari 20 μs sebagai seperti siput.