ビーグルボーンブラックのPREEMPT-RTパッチLinux OSにリアルタイムで優先順位を付けたロボットがあります。すべてのコードはCで書かれており、500Hzで動作しています。リアルタイム埋め込みLinuxでのデータロギング中にレイテンシが急上昇する
私はコードを実行するたびに数百ミリ秒の範囲でレイテンシに気付き、私が書いたデータロギング機能まで追跡しました。この待ち時間は、リアルタイム機能に依存するため、ロボットの制御が失敗する原因になります。
コードの関連部分は以下のとおりです。分かりやすくするためにたくさんのコードを削除しましたが、何かが必要な場合はこの投稿を編集します。
FILE *file;
int main(int argc, char** argv) {
file = fopen(logname, "w");
while (1) {
/* Control code stuff*/
logData();
time_msec = time_msec + controlLoopTime;
}
}
void logData() {
if (time_msec - logTimer_msec >= LOG_TIMER) {
logTimer_msec = time_msec;
if (!bLogCreated) {
fprintf(file,
"SensorData1 SensorData2 SensorDataN"
);
bLogCreated = TRUE;
}
// log data to file
fprintf(file,
"%.2f %.2f\n",
sensorData1, sensorData2, sensorDataN
);
}
}
複数の変数(恐らく20-50)のデータを良いレート、おそらく100-125Hzでログする必要があります。データは制御レート(2msごと)で記録する必要はありませんが、それを12msに減らしましたが、数分ごとにレイテンシスパイクが表示されます。
遅延は、fprintf
コールの問題です。これはBeagleBone Blackの制限、私のコード、または単にデータロギングの性質ですか?
同様の質問がここに頼まれましたが、私の問題に対処していないようでした:fprintf
を使用してFinding latency issues (stalls) in embedded Linux systems
デフォルトでは、非ttyファイルハンドルはブロックされています。したがって、fprintfが4096バイト後にバッファがディスクにフラッシュされ、それによってレイテンシが発生する可能性があります。実際のログを別のスレッドにアウトソースすることはできませんか?ログメッセージをキューに入れ、ログスレッド内でデキューします。 – Ctx
このコードは通常のプロセスの一部として実行されていますか?デバイスドライバをブロックするミューテックスやセマフォなどを制御していますか? – wallyk
@jekso:ログ(p)スレッドを作成し、ダブルリンクリストのようなものをキューとして(先頭にエンキュー、最後にデキューします)、pthread_cond_wait/notifyを使って新しいエントリを通知します。 – Ctx