5

Linux で C/C++ でタイミング イベントを実行する方法を探しています。
たとえば、100 ミリ秒ごとにコードを実行します。(それ以上でもそれ以下でもないソフトリアルタイム)

私が今まで見た唯一のオプションは次のとおりです。

  • 無限にループし、実行する時間かどうかを毎回確認します。
  • 実行する時間になるまでスレッドをスリープさせます。

実行する時間かどうかを無限にチェックすると、(あまりにも) CPU を集中的に使用するという欠点があります。
時間になるまで寝ていると、正確ではないという欠点があります。睡眠時間は単なる目安であり、もっと眠ることができます。

Linux で C/C++ でリアルタイム タイミング イベントを実行する方法を知っている人がいるかどうか疑問に思っていました。

4

5 に答える 5

4

何を使用するかはほとんど問題ではありません — a select()epoll()、。一部のメソッドは、より高い解像度のタイムアウトを「取得」できますが、一部のメソッドは取得できません。しかし、Linux はリアルタイム OS ではないため、正確にその時点でプロセスをウェイクアップすることを期待するべきではありません。これで、CPU を回転させても、カーネルはその CPU を他のプロセスまたは割り込みハンドラーに割り当てることを決定した場合に、プロセスを簡単に中断できます。usleep()settimer()

API の観点 (および最近の傾向) からは、おそらくこれに固執する必要がありtimerfd()ます — 使用するクロックを指定でき、他の Linux イベント ディスパッチ メカニズム (epoll、AIO など) とうまく統合できます。

それ以外は、プログラマーとしての制御外です。Linux からほぼリアルタイムの動作を実現するには、通常、多大な努力が必要です。パッチを適用したカスタム カーネルを構築し、割り込みのシールドを含む全世界のアフィニティを構成することから、BIOS にパッチを適用し、ハードウェアを調整することまで、多岐にわたります。

現状では、高負荷ではないコモディティ x86_64 サーバーで新しいバニラ カーネルを実行すると仮定すると、ウェイクアップ時間は約 50 µs になると予想されます (システムの大まかなアイデアを得るために簡単にベンチマークできます)。

于 2013-02-28T19:20:13.627 に答える
3

非リアルタイム OS で実行する場合、完全に信頼できるユーザー空間アプローチはありません。睡眠は不正確であり、寝坊する可能性があることは間違いありませんが、同じことがループにも当てはまります。OS が時間内にタスクをスケジュールしない可能性があり、スロットを逃すことになります。

必要な信頼性に応じて、 QNXRTLinuxなどのリアルタイム オペレーティング システム (RTOS) を検討してください。RTLinux の wiki は少し古くなっているため、どの程度活発であるかはわかりません。

もう 1 つの方法は、一部のハードウェア デバイス (GPS カードなど) のタイミングに依存することです。プログラムは、時間自体を計ろうとするのではなく、外部イベントに反応します。たとえば、ハードウェア デバイスは「ファイル」を公開する可能性があります。あなたのプログラムはそれを開いてブロックしread()ます. 100 ミリ秒ごとに、ハードウェア デバイスからデータが送信されます。

于 2013-02-28T19:10:39.883 に答える
1

Linux 用のリアルタイム アプリケーション インターフェイスであるRTAIを試すことができます。

[...] これにより、お気に入りのオペレーティング システム用に厳密なタイミング制約のあるアプリケーションを作成できます。Linux 自体と同様に、このソフトウェアはコミュニティの取り組みです。

初心者ガイド より:

RTAI は、Linux カーネル コアと同じサービスを提供し、産業用リアルタイム オペレーティング システムの機能を追加します。これは基本的に割り込みディスパッチャーで構成されています。RTAI は主に周辺機器の割り込みをトラップし、必要に応じてそれらを Linux に再ルーティングします。これは、カーネルの侵入的な変更ではありません。HAL (ハードウェア抽象化レイヤー) の概念を使用して、Linux から情報を取得し、いくつかの基本的な機能をトラップします。この HAL は、Linux カーネルへの依存関係をほとんど提供しません。これにより、Linux カーネルでの簡単な適応、Linux のバージョンからバージョンへの容易な RTAI 移植、および RTAI の代わりに他のオペレーティング システムの使用が容易になります。RTAI は、Linux を、リアルタイム アクティビティが発生していないときに実行されているバックグラウンド タスクと見なします。

于 2013-02-28T19:07:18.453 に答える
0

また、Linux 固有のtimerfd_create(2) -and friends- (多重化/待機用のpoll(2)libev 、またはorのようなイベント ライブラリlibevent、または内部的に呼び出す Gtk または Qt イベント ループpoll) または Posix timer_create( 2) . clock_gettime(2)およびその仲間も参照してください

time(7)の man ページを読むことを強くお勧めします。それは多くを説明します。また、Vladが答えたように、Linux は真のリアルタイム カーネルではありません (近いかもしれませんが)。

于 2013-02-28T19:59:49.917 に答える
-1

libevent をチェックしてください: http://libevent.org/

libevent API は、ファイル記述子で特定のイベントが発生したとき、またはタイムアウトに達した後に、コールバック関数を実行するメカニズムを提供します。さらに、libevent は、シグナルまたは通常のタイムアウトによるコールバックもサポートします。

于 2013-02-28T19:04:09.207 に答える