1

学生プロジェクトとして、定義されたコースを実行し、木製の立方体を拾うロボットを構築しています。そのコアは、250MHzでARM9を搭載したdebianを実行するシングルボードコンピュータです。したがって、コントローラーには十分な処理能力があります。さらに、それはいくつかの画像処理を行います(運転中ではなく、停止したときのみ)。そのため、OSなしで単純なマイクロコントローラーを使用しません。

現時点ではすべてがうまく機能していますが、1つの問題があります。メインの制御ループが遅延なしで実行され、1kHzを超えるサイクル周波数を達成します。これで十分です。100Hzでも十分です。しかし、時々、100ms以上かかる単一のサイクルがあり、コントローラーを大きく混乱させる可能性があります。

スケジューラーが長期間CPU時間を取得していないことを検出する可能性があるため、この遅延を引き起こす他のタスクがあると思われます。

したがって、私が最も望んでいるのは次のとおりです。コントローラーのメインループで5ミリ秒の短いスリープが発生します。これは、実際には5ミリ秒しかかかりませんが、システムの残りの部分にプロセッサー時間を与えます。nanosleepを使用してたとえば500usの遅延を含めることができますが、これは実行に常に10ミリ秒以上かかるため、実際には代替手段ではありません。待機中のタスクに何かをする機会を与えるために、自発的な睡眠のようなものが好きですが、できるだけ早く戻ります。

それ以外の場合、システムはアンロードされるため、長時間にわたって実際に多くの処理を必要とする可能性のあるものはありません。

ユーザースペースでこれを行う方法はありますか?つまり、RTAIのようなものに固執する必要はありませんか?

ありがとう、フィリップ

4

4 に答える 4

0

モーター制御を行うときは、リアルタイムのインターフェースに固執することをお勧めします。OSが一度他のことを考えることにしたため、デモ中に1000kgのトラックが壁にぶつかるのを見ました...:-)

RTAIから離れたい場合(ただし、そうすべきではありません)。(おそらく)手っ取り早い解決策は、実際の運転のためにArduinoボードを叩き、Linuxボードを高レベルの処理のために維持することです。

「壁の問題」を修正するには、ドライバーボードにウォッチドッグを実装します。これにより、しばらくコマンドが到着しなかった場合にウォッチドッグが停止します...

于 2012-05-24T07:08:26.040 に答える
0

OK、完璧ではありませんが、より良い解決策を見つけました。sched_setscheduler() 関数を説明する別のスレッドがあります。私の初期化コードは次のようになります。

// Lock memory to reduce probability of high latency due to swapping
int rtres = mlockall(MCL_CURRENT | MCL_FUTURE);
if (rtres) {
  cerr << "WARNING: mlockall() failed: " << rtres << endl;
}

// Set real-time scheduler policy to get more time deterministic behaviour
struct sched_param rtparams;
rtparams.sched_priority = sched_get_priority_max(SCHED_FIFO);
rtres = sched_setscheduler(0, SCHED_FIFO, &rtparams);
if (rtres) {
  cerr << "WARNING: sched_setscheduler() failed: " << rtres << endl;
}

さらに、短いスリープをメインループから削除しました。プロセスは利用可能なすべての処理能力を消費し、(明らかに) 外界からのアクション (コンソールのキーストロークなど) に応答しなくなりますが、目前のタスクではこれで問題ありません。メインループの統計は、ほとんどの反復が完了するまでに 1 ミリ秒もかからないことを示していますが、約 1000 秒ごとに必要な反復がまだいくつかあります (約 1000 秒ごと)。100ミリ秒。これはまだ良くありませんが、少なくともさらに長い遅延はありません。

これは「唯一の」学生プロジェクトであるため、それを受け入れることができ、さらなる改善の候補として注目することができます。

とにかく、提案をありがとう。次回は、リアルタイム要件に対処する方法と、最初から RT OS を使用する方法をよく知っているでしょう。

よろしく、フィリップ

于 2012-06-03T17:09:26.360 に答える
0

作業中の ARM7 ボードで 100 Hz のループを実行しています。RT パッチを適用した標準の Linux を使用しています。これにより、カーネル内の (ほぼ) すべてのロックをプリエンプトすることができます。これを優先度の高いスレッドと組み合わせると、カーネルとユーザー空間の両方で必要なパフォーマンスが得られます。

必要なのは、パッチを適用し、完全なプリエンプションを使用するようにカーネルを構成することだけなので、使い方も非常に簡単です。ソフトウェア アーキテクチャを変更する必要はありません。パッチが完全に適用されるかどうか。

于 2012-06-03T17:32:09.267 に答える
0

リアルタイムの問題にはリアルタイム OS が必要です。

リアルタイム OS は予測可能だからです。指定された時間に結果を生成する必要があるタスクが、処理能力を必要とするが時間の制約を受けていないタスクによって優先されないように、タスクの優先順位を設定できます。

于 2012-05-24T07:19:46.017 に答える