9

「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」に感謝します。私のカーネル ドライバーは現在正常に動作しており、これらすべてのヒントを提供する前の状況と比較して、見苦しさが大幅に軽減されています。ありがとう!

4

1 に答える 1