'Linux Aygıt Sürücüleri' bölümünde bölüm 7'yi okudum, bu zaman 'jiffies' içinde ölçülebilen '(which can be found here). Stok jiffies değişkeniyle ilgili problem, sık sık etrafı sarar olmasıdır (özellikle CONFIG_HZ'niz 1000'e ayarlanmışsa).Linux çekirdeğinde Zaman İşleyişi 2.6
Çekirdek modülümde, ileride bir zamana ayarlanan ve geçerli 'jiffies' değeriyle daha sonra karşılaştırılan jiffies değerini kaydediyorum.
İşteif (time_after(jiffies, some_future_jiffies_value))
{
// we've already passed the saved value
}
sorumu gelir: Yani şimdi 'some_future_jiffies_value' ayarlamak istediğiniz Orada bu yüzden bu kullanıyorum iki değeri karşılaştırmak için dikkate 32bit lahza wrap almak işlevleri olduğunu zaten öğrendik "şimdi + 10 ms". Bu işlem şu şekilde yapılabilir:
Bu doğru mu? Geçerli jiffler MAX_JIFFY_OFFSET yakınındaysa ve sonuçta oluşan msecs_to_jiffies değeri (10) bu offset'i aşarak bazı_future_jiffies_value değerini verirse ne olur? Otomatik olarak sarılır mı yoksa bunu kontrol etmek için bir kod eklemem gerekir mi? Bununla başa çıkmamı engelleyen fonksiyonlar var mı?
Güncelleme: Bunu daha taşınabilir doğru olduğunu varsayalım
// Sleep for the appropriate time
while (time_after(some_future_jiffies_value, jiffies))
{
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1);
}
:
sarımla şeyler önlemek için benim uyku döngüsü yeniden kaleme aldık?
Güncelleme 2:
bu soruya geri gelmek için zaman ayırdığınız ve de benim yorumlarda bazı geribildirim sağlamak için size 'ctuffli' çok teşekkür ederim. Çekirdek sürücüm şimdi çalışıyor ve bana bu ipuçlarını vermeden önce durumla karşılaştırıldığında çok daha az çirkin. Teşekkürler!
Başka bir düşünce: get \ _jiffies \ _64() 'i kullanmak, hiç bir zaman, her şeyden kurtulmayı düşünmek zorunda kalmam ve sadece basit matematik yapmama izin verir mi? – Benjamin