「Linux Device Drivers」(ここで見つけることができます)の第 7 章を読みましたが、時間は「jiffies」で測定できます。ストック jiffies 変数の問題は、かなり頻繁に循環することです (特に CONFIG_HZ を 1000 に設定している場合)。
私のカーネルモジュールでは、将来のある時点に設定された jiffies 値を保存し、後でそれを現在の「jiffies」値と比較しています。32 ビット jiffy ラップを考慮に入れる関数があることを既に知っているので、これを使用している 2 つの値を比較します。
if (time_after(jiffies, some_future_jiffies_value))
{
// we've already passed the saved value
}
ここに私の質問があります: それで、'some_future_jiffies_value' を "now + 10ms" に設定したいと思います。これは、次のようにすることで簡単に実現できます。
some_future_jiffies_value = jiffies + msecs_to_jiffies(10);
これは正しいです?現在の jiffies が MAX_JIFFY_OFFSET に近く、msecs_to_jiffies(10) の結果の値がそのオフセットを超えた some_future_jiffies_value になっている場合はどうなりますか? 自動的にラップアラウンドしますか、それともこれをチェックするコードを追加する必要がありますか? これに対処する必要がなくなる機能はありますか?
アップデート:
ラップアラウンドを避けるために、スリープループを書き直しました:
// Sleep for the appropriate time
while (time_after(some_future_jiffies_value, jiffies))
{
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1);
}
これはより移植性が高いと思いますよね?
更新 2:
この質問に時間を割いて、私のコメントにもフィードバックを提供してくれた「ctuffli」に感謝します。私のカーネル ドライバーは現在正常に動作しており、これらすべてのヒントを提供する前の状況と比較して、見苦しさが大幅に軽減されています。ありがとう!