2012-05-08 3 views
2

RTパッチが適用されたバニラLinuxカーネルを構築して設定しました。すべてがうまくいって、新しいカーネルを正しく起動できるようになりました。Linuxでのリアルタイムプログラミング

私はCで作成したシミュレータプログラムを持っています。新しいカーネルで許されるように、ハードリアルタイムモードで実行します。おそらく、シミュレータ全体をリアルタイム優先度で実行する必要はありませんが、内部のタスクの中にはいくつかあります。

どうすればこの問題を解決できますか?私は、単にプログラムを実行することはできません。

答えて

7

リアルタイムコンテキストでスレッドを実行する方法と、従来のタイムシェアリングスレッドとしてスレッドを実行する方法を尋ねる場合は、schedulers properly using sched_setschedulerを設定するだけです。

時分割スレッドは、SCHED_OTHERになりたい。リアルタイムシミュレータスレッドはSCHED_FIFOまたはSCHED_RRになります。

Linuxでは、リアルタイム優先順位で実行するには、これを可能にするリソース制限(man 2 rlimit)が必要です。特に、 rlimitは、必要な最高の優先度に設定する必要があります。あるいは、アプリケーションをrootとして実行することもできます。 PAMとLinuxシステムでは、これは、典型的には、リアルタイムグループにリアルタイム優先度99までRTPRIO制限を許可する/etc/security/limits.conf

 @realtime - rtprio  99

これに適切な行を追加することによって達成されます。次に、/etc/groupsにリアルタイムグループを追加し、ユーザーがグループに属していることを確認します。

(これは初めてのことですが、デッドマンのスイッチを優先度の高いリアルタイムスレッドにして、シミュレータが不調にならないようにすることもできますシステムを使用不能にします...高いCPU負荷をシミュレートしている場合は、CPUの負荷が大きくなり、再起動する必要がなくなります。

+0

すべてのリアルタイムプロセスをリセットしないでくださいノーマルモードに? –

+0

@Victor:以前はその機能を使用していませんでしたが、どれくらい頼りにしているのか分かりません。すべてを更新し、すべての優先順位を落とすのに使用されているようですが、そうした後の通常の優先順位のようなものにどのように戻っていくのか分かりません。 – andersoj

+0

それでは、私は新たなフォークプロセスでは、このコマンドを呼んでいるとしましょう: はsched_setscheduler(GETPID()、SCHED_FIFO、&sp); これは正しく1ではなく0はsched_setschedulerリターンをexcecutedれないと私はかなり確信している理由は? sp_sched_priorityが正しく設定されている(sp.sched_priorityが98に設定されている) –