製品をRTOSから組み込みLinuxに移行することを検討しています。リアルタイムの要件はあまりなく、RTの要件は数十ミリ秒程度です。
Linuxの現在のバージョンがどれほどリアルタイムであるかを教えてくれるリファレンスを誰かに教えてもらえますか?
商用RTOSからLinuxへの移行から他に落とし穴はありますか?
Real Time Linux wikiとFAQからほとんどの回答を得ることができます。
ストック 2.6 Linux カーネルのリアルタイム機能は何ですか?
従来、Linux カーネルは、特定の状況下でのみ、あるプロセスが別のプロセスをプリエンプトすることを許可します。
- CPU がユーザー モード コードを実行している場合
- カーネル コードがシステム コールまたは割り込みからユーザー空間に戻ったとき
- カーネルコードコードがミューテックスでブロックするか、明示的に制御を別のプロセスに譲る場合
優先度の高いスレッドの実行を開始する必要があるイベントが発生したときにカーネル コードが実行されている場合、優先度の高いスレッドは、カーネル コードが明示的に制御を渡すまで、実行中のカーネル コードをプリエンプトできません。最悪の場合、レイテンシは数百ミリ秒以上になる可能性があります。
Linux 2.6 構成オプション CONFIG_PREEMPT_VOLUNTARY は、長いレイテンシーの最も一般的な原因に対するチェックを導入し、実行を待機している優先度の高いタスクにカーネルが自発的に制御を渡すことができるようにします。これは役に立ちますが、長いレイテンシ (数百ミリ秒から潜在的には数秒以上) の発生を減らしますが、それらをなくすわけではありません。ただし、CONFIG_PREEMPT (以下で説明) とは異なり、CONFIG_PREEMPT_VOLUNTARY がシステムの全体的なスループットに与える影響ははるかに小さくなります。(いつものように、スループット --- システムの全体的な効率 --- とレイテンシーの間には古典的なトレードオフがあります。最近のシステムのより高速な CPU では、より低いレイテンシーのためにスループットをトレードオフすることはしばしば理にかなっています。
2.6 Linux カーネルには追加の構成オプション CONFIG_PREEMPT があり、これにより、スピンロックで保護された領域と割り込みハンドラーの外側にあるすべてのカーネル コードが、より優先度の高いカーネル スレッドによる非自発的プリエンプションの対象となります。このオプションを使用すると、最悪の場合のレイテンシーは (約) 1 桁のミリ秒に低下しますが、一部のデバイス ドライバーには、それよりもはるかに悪いレイテンシーを導入する割り込みハンドラーが含まれている場合があります。リアルタイム Linux アプリケーションで 1 桁ミリ秒未満のレイテンシが必要な場合は、CONFIG_PREEMPT_RT パッチの使用を強くお勧めします。
また、FAQ であなたが呼んだ「Gotcha's」のリストもあります。
リアルタイム アプリケーションを作成する際に留意すべき重要事項は何ですか?
初期起動段階では、次のことに注意してください。
- main() からできるだけ早く mlockall() を呼び出します。
- アプリケーションの起動時にすべてのスレッドを作成し、各スレッドのスタック全体の各ページをタッチします。RT の表示時間中にスレッドを動的に開始しないでください。RT の動作が損なわれます。
- fopen() など、ページ フォールトを生成することが知られているシステム コールは使用しないでください。(ファイルを開くと、ページ フォールトを生成する mmap() システム コールが実行されます)。
- 「コンパイル時グローバル変数」および/または「コンパイル時グローバル配列」を使用する場合は、mlockall() を使用して、それらにアクセスする際のページ フォールトを防止します。
また、チェックアウトしたい大きな出版物ページもあります。
ゼノマイを見たことがありますか?これにより、Linux 上で「ハード リアルタイム」プロセスを実行できますが、非リアルタイムのすべてのニーズに対して通常の Linux API にアクセスすることもできます。
There are two fundamentally different approaches to achieve real-time capabilities with Linux.
Patch the existing kernel with things like the rt-preempt patches. This will eventually lead to a fully preemptive kernel
Dual kernel approach (like xenomai, RTLinux, RTAI,...)
There are lots of gotchas moving from a RTOS to Linux.
Maybe you don't really need real-time?
I'm talking about real-time Linux in my training sessions:
答えはおそらく「十分」です。
組み込みシステムを実行している場合、おそらく、ボックス上のすべてまたはほとんどのソフトウェアを制御できます。
Stock Linux 2.6 には、低レイテンシーのタスクに適した機能がいくつかあります。主に次の機能があります。
シングルコア マシンを使用していると仮定すると、スケジュール ポリシーを SCHED_FIFO または SCHED_RR に設定したタスクが 1 つだけあり (タスクが 1 つしかない場合はどちらでもかまいません)、mlockall ですべてのメモリをロックします。 () の場合、実行の準備が整うとすぐにスケジュールされます。
次に、心配しなければならない唯一のことは、完了までに許容できるレイテンシーよりも時間がかかるカーネルのプリエンプト不可能な部分でした。これは、極度のメモリ不足などの何か悪いことが起こらない限り、組み込みシステムで発生する可能性は低いです。あなたのドライバーは危険です。
「試してみてください」が良い答えだと思いますが、おそらくあなたの場合はかなり複雑です(デバイスドライバーなどの作成が必要になる場合があります)。
良い情報については、sched_setscheduler のドキュメントを参照してください。