2011-10-19 11 views
1

私は基本的にTIMERであるタスクを持っています。だから、それは眠りにつき、定期的に起きるはずです。したがって、タイマーのタスクは10msの間スリープします。しかし起きているのは、目を覚ますことで一貫性がなく、時間通りに目を覚ますことに頼ることができないということです。Linux RTOS sleep() - タイマータスクのためのwakeup()

実際、私の走りでは、睡眠時間に大きな違いがあります。ときには、それは目を覚ますのに1〜2ミリ秒で変わることがあり、まったく戻ってくることはほとんどありません。これは、カーネルスケジューラがすべてのスリープ中および待機中のタスクをキューに入れ、誰が目を覚ますかを調べるときに、ラウンドロビンだと思うからです。したがって、タスクがスケジューラーが再びポーリングするときにタスクが期限切れになることがありました。時々、割り込みがあるとき、ISRは制御を取得し、タイマが起きるのを遅らせる。

この種の問題を処理する最適なソリューションは何ですか?

(その他の詳細:タスクは、ワイヤレスネットワークのためのMACタイマーであり、RTOSは、U-velOSityマイクロカーネルである)

+0

ここでRTOSはこの問題になりますか?最後にあなたはu-velosityについて言及していますが、それはまったく言及されていない質問と全く無関係です。 – Clifford

答えて

2

代わりに、スケジューラに頼るにはOSが提供するタイマーAPIを使用する必要があります。 timer API for Linux driversの概要は次のとおりです。

+0

は@Miceaをupvoteしなければなりませんでした。私は、UARTバス上のデータを定期的に送信しなければならなかったユーザースペースアプリケーションを開発するのと同じことを発見しました。私は、タイマーが終了したときに信号をトリガしたOSタイマを使用して巻き上げました。信号は割り込みとして機能し、アプリケーション内では信号が受信されたときにタスクを実行します。これは私にとって劇的に改善されたものです。私は〜3msの変動から1msの変動まで行きました。おかげさまで – Eric

1

ハードコアのタイミングが必要な場合、OSスケジューラは(あなたが見つけたように)十分なものではない可能性があります。その後、

することができます場合は、周辺の別々のタイマーを使用し、それはあなたが(例えば、いくつかのフラグを設定し、いくつかの重要なデータをタイムスタンプ)を離れて得ることができる限り少ないを行うためにISRだ使うとあなたの高いジッタルーチンを聞かせてその保証されていないタイミングでそのデータを利用する。

+0

おそらく、あなたが提案したように周辺機器を使用することを見ていきます。 – mane

0

LinuxはRTOSではありません。これはおそらく問題の根源です。

Linuxは、さまざまな方法でさまざまな方法でリアルタイムでの使用に適しています。いくつかの方法と期待できるリアルタイム性能の評価については、を参照してください。