2009-02-17 16 views
8

'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.

İşte
if (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!

+0

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

cevap

6

Burada ne uyguladıklarını Bu fonksiyon şartname milisaniye cinsinden olan ve içten sarılması jiffies ayrıntılarını gizler avantajına sahiptir() (linux/kernel/timer.c)

/** 
* msleep_interruptible - sleep waiting for signals 
* @msecs: Time in milliseconds to sleep for 
*/ 
unsigned long msleep_interruptible(unsigned int msecs) 

esasen msleep_interruptible olduğunu. Bu arama geri kalan jiffilerin sayısını döndürdüğünden, dönüş değerlerini kontrol ettiğinizden emin olun. Sıfır, aramanın belirtilen sayıda milisaniye uyuduğu anlamına gelir; sıfır olmayan bir değer ise aramanın bu kadar erken saatte kesintiye uğradığını gösterir.

Sarma ile ilgili olarak, jilet ve sargıların açıklaması için bkz. Bölüm 6.2.1.2. Ayrıca, bu post özette sarmalamayı açıklamaya çalışır.

+0

Eğer msleep_interruptible kaynağına bakarsak, gerçekten de benzer görünüyor! Kesilen uyku beklenenden daha erken dönebileceğinden, doğru bir şekilde anladığım takdirde bu fonksiyondan geri dönüş değerini dikkate almam gerekirdi. – Benjamin

+0

MAX_JIFFY_OFFSET işaretinin üzerine bir zaman aşımı koyma konusunda, bunun iyi olup olmadığı hakkında bir fikriniz var mı? Çekirdek kaynaklarda çok şey olduğunu görüyorum ama bu benim merak ettiğim daha teorik bir şey. Şimdiye kadar yanıt vermek için zaman ayırdığınız için teşekkürler! :) – Benjamin

İlgili konular