Alıntılanan ifade bir uyarı değildir , sadece işlerin nasıl çalıştığına dair bir ifadedir.
Düzgün yazılmış bir kesme rutini kullanarak millis()
veya micros()
içinde özünde yanlış olan hiçbir şey yoktur .
Öte yandan, yanlış yazılmış bir kesme rutini içinde herhangi bir şey yapmak tanım gereği yanlıştır.
İşini yapmak için birkaç mikrosaniyeden fazla süren bir kesme rutini, her durumda, yanlış yazılmıştır.
Kısacası: Bir düzgün yazılmış kesme rutin yol açmayacak ya da karşılaşma sorunları millis()
veya micros()
.
Düzenleme: " Arduino micros işlevinin incelenmesi " web sayfasında açıklandığı gibi "neden micros ()" düzensiz davranmaya başlar "ile ilgili olarak , micros()
sıradan bir Uno kod işlevsel olarak eşdeğerdir
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Bu timer0_overflow_count
, zamanlayıcı-0 sayma kaydından gelen en düşük üç bayt ve bir bayttan oluşan dört baytlık işaretsiz bir uzun döndürür .
timer0_overflow_count
Tarafından milisaniye başına bir kez hakkında artırılır TIMER0_OVF_vect
kesme yürütücüsü gibi bir açıklandığı Arduino Millis fonksiyonu incelenmesine web sayfası.
Bir kesme işleyicisi başlamadan önce, AVR donanımı kesintileri devre dışı bırakır. (Örneğin) bir kesme işleyicisi, kesintiler hala devre dışı bırakılmış beş milisaniye boyunca çalışacaksa, en az dört zamanlayıcı 0 taşması kaçırılır. [Arduino sistemindeki C kodunda yazılan kesintiler yeniden girilmez (aynı işleyici içinde birden çok çakışan yürütmeyi doğru şekilde işleyebilir), ancak zaman alıcı bir işleme başlamadan önce kesmeleri yeniden etkinleştirebilen bir yeniden birleştirici montaj dili işleyicisi yazılabilir.]
Başka bir deyişle, zamanlayıcı taşmaları “birikmez”; bir önceki taşma kesintisinden önce bir taşma meydana geldiğinde, millis()
sayaç bir milisaniyeyi kaybeder ve buna karşılık tutarsızlık da bir milisaniyede yanlış timer0_overflow_count
yapar micros()
.
Kesme işlemi için bir üst süre limiti olarak "500 μs'den daha kısa" ile ilgili olarak, "zamanlayıcı kesintisinin çok uzun süre engellenmesini önlemek için", 1024 μs'nin (örn. 1020 μs) biraz altına kadar çıkabilir ve millis()
yine de işe yarayabilir. saati. Bununla birlikte, 5 μs'den fazla bir sümüklü böcek, 10 μs'den fazla tembel, 20 μs'den fazla salyangoz benzeri bir kesme işleyicisi görüyorum.