1

私はLinuxカーネル2.6.32を使用しています。2つのISR(シリアルとイーサネット)の1つが、何度か/わからないシナリオで、より多くの時間(数百マイクロ秒)を費やしているという問題に直面しています。ISRを実行するたびに時差を取得したいと思います。

最善の方法は何でしょうか(関連するオーバーヘッドの点で最も安価です)。ARMアーキテクチャにTSCレジスタ(read_tsc api)があり、他のアーキテクチャで提供されているように時間に直接アクセスできるとは思いません。

つまり、アイデアは1)ISRが呼び出された瞬間に時間を測定します。2)ISRが完了した瞬間に時間を測定します。3)1と2の差を取得し、それをいくつかの変数に格納します。4)手順1〜2を続行し、手順3で受け取った値が過去の値よりも大きい場合は、それを上書きします(最大遅延で値を保持/保持します)。問題が発生したとき(突然の状態で値が出力されます)または最後の10個の値の配列)。

カーネルドライバーで行う必要があるので、最も安価な方法を教えてください。

4

1 に答える 1

1

OMAP3にはCortex-A8コアがあります。それにはパフォーマンスモニターユニット(PMU)があります。サイクルカウント(CCNT)はx86 TSCに対応しますが、読み取る前にカウントを有効にする必要がある場合があります。BeagleBoardの投稿に良い情報があります。

2.6.32.55では、arch / arm / oprofile/op_model_v7.cが完全なアクセスと制御を提供していることがわかります。私のニーズはベアメタルでした。シンプルでうまく機能するARMサンプルコードを使用しました。

OMAP3 GPTを使用することも可能ですが、PRCMからクロック入力を設定するなど、より手間がかかります。

于 2013-01-14T01:19:49.157 に答える