1

私は、サッカー ゲームをプレイすることになっているバイパッド ロボットを制御することを目的としたプロジェクトに取り組んでいます。すべてのプログラムは、さまざまな共有ライブラリ (OpenCV、サーボ モーター コントローラーなど) にリンクされたプレーンな C++ で記述されています。

システムはパフォーマンスが重要であり、95% ハード リアルタイムである必要があるため、Xenomai パッチがカーネルに適用されています。残念ながら、スレッド切り替えレイテンシのベンチマークは、システムがすべての状況でハード リアルタイムのニーズを満たさないことを示しています。この作品にデュオ。すべてのものをカーネル空間に移植することで、パフォーマンスを向上させることができます。

カーネルモジュールを開発したことはありません...いくつかのドキュメントを読んでください。通常のユーザー空間プログラムとは異なるようです。ビルドシステムも違います。

私の質問: 広く共有ライブラリと POSIX スレッドを使用して、完全に C++ で記述された通常のユーザー空間アプリケーションをカーネル モジュールに変換することは可能ですか?

答えが「いいえ」の場合、すべてのライブラリを静的に再コンパイルし、代わりに C を使用します...これは有害で時間のかかるプロセスになります。

4

1 に答える 1

3

まず、ハード リアルタイムが必要な場合は、Linux ではなく、ハード リアルタイム システムを使用する必要があります。Linux はある程度のリアルタイム処理を行うことができますが、締め切りについて確実な保証を推論するものではありません。

しかし、あなたの質問に答えると、いいえ、カーネルにはそれを可能にする C++ ランタイムがないため、C++ アプリケーションをカーネル モジュールに変換することはできません。カーネル空間では、libstdc++ はもちろん、libc を使用することさえできません。

すべてのライブラリを静的に再コンパイルしても、それほど良くはありません。まずこれは、最終的に libc をカーネル空間に移植する必要があることを意味しますが、これは実行できません (libc はシステム コールを通じてカーネル自体を呼び出すため)。また、通常、カーネルに入るコードの量をできるだけ少なくしたいと考えています (そして、カーネルが失敗するとシステム全体をダウンさせます)。

スレッドの待ち時間を制限するために、アプリケーションを再設計する必要があるように思われる場合 (より軽量なスレッド ライブラリを使用するか、スレッド スイッチの数を減らすことによって)。いずれにせよ、カーネルでスレッドを使用すると、依然としてレイテンシが発生します。システム コールがなくなることが唯一のメリットです。

したがって、カーネルに何かを移すのではなく、設計について考える必要があると思います。

于 2012-08-30T01:36:16.923 に答える