Armadilloフォーラム

Armadillo-420でのスレッド処理時間について

takeshi_sugamiya

2019年8月27日 15時18分

菅宮と申します。
現在、Armadillo-420内で複数スレッドを起動し、リアルタイム制御を試みています。
Armadilloの内部動作処理で確認したい事が2つあり、投稿させていただきました。

①動作確認の中で、単一スレッドのみ動かし、6μ秒程度で終了する処理が、数千回に一回程度の割合で100μ秒以上掛かることがあります。この稀に発生する動作遅延の要因はどのようなことが考えられるでしょうか?

②複数スレッド起動している際に、スレッド間の切替えが60μ秒程度掛かっています。スレッドの切替えにはこのぐらいの時間が掛かるものなのでしょうか?ちなみに、スレッドの切替え処理には、”pthread_cond_wait”と”pthread_cond_signal”を利用し、切替えています。

上記二つの確認は、”sysctl –w kernel.sched_rt_runtime_us=-1”をコマンド実行して、リアルタイムクラスへのCPU時間の制限を無くして実行しました。

開発環境
Kernel: Linux-3.14-at10
ご回答よろしくお願い致します。

コメント

izawa

2019年10月4日 15時33分

毎度お世話様、伊澤です。
久し振りにフォーラムを覗いたら、放置されている質問があったので。
以下、実際にA420で実測したわけではない一般的なLinuxの話ですが。

先ず、Linuxカーネルは定期的なタイマー割り込み(通常0.1[ms]~4[ms])ごとに
各実行可能状態のプロセスのどれにCPU時間を割り当てるかを決定します。
この処理に於いて重要なのは、実行可能状態のプロセスの消費するCPU時間を
極力均一にしようとすることです。

ご質問のケースの場合、6[us]程度のなので大抵はタイマー割り込み時に
ペナルティを喰らわずに終了するまでCPU時間を消費できるのでしょう。
それが運が悪いと、システム側で必要とするなんらかのプロセスを動かす為に
待たされてしまう場合があるのではないかと。

処理時間をどうやって計測されたのか分かりませんが、計測方法を変えることで
ある程度様子が掴める場合があります。

例えば、
処理開始→時刻Bn記録→処理→時刻An記録→処理終了を繰り返してTn = An - Bnとする方法と、
処理開始→処理→時刻An記録→処理終了を繰り返してとしてTn = An-1 - Anとする方法があります。
前者は安定して短いのに後者が長くなる場合、明らかに処理開始前に待たされているわけです。
恐らくは、この状態なのでしょう。

従って、結論を言ってしまえば単一コア環境でのリアルタイム処理は難しいでしょう。

スレッドの切り替え時間も、60[us]程度ならCPUクロックを考えれば無難でしょう。
クロックがGHzオーダーのマルチコアのx86でも数[us]は掛かっていましたので。
またその時の感覚では、切り替え間隔が短いほど割り当てられる時間はばらつきました。

その点でも、A420でそこまで求めるのは酷と言うものです。