割り込みルーチンのCPU負荷の測定


8

固定周波数でディスプレイを更新するisrがあります。オーバーヘッドを最小限に抑え、他の処理のためにできるだけ多くのCPU時間を開いておくようにルーチンを調整したいのですが、CPU負荷を判断するためのメトリックを収集する適切な方法がありません。

アセンブリを見て、ルーチンを分析することはできましたが、それを正確に行うための忍耐力や能力はありません。ISRによって占有されているCPU時間の単純なパーセンテージだけで、非常に細かい結果も必要だとは思いません。

isrがアクティブなときにのみピンをHighに設定し、外部で測定することができます。コードのオーバーヘッドは最小限ですが、何を測定するかわかりません。オシロスコープなどは持っていません。デューティサイクルを測定するために別のマイクロを使用する簡単なICまたは簡単な方法はありますか?専用の周波数カウンターチップについて聞いたことがありますが、デューティサイクルについて何かありますか?

回答:


8

中途半端なアイデアだと、次のようなタイマーを使用できる場合があります(疑似コード)。

int main(void)
{

    /* ... init timers and uart here, enable your interrupts ... */

    start_timer0();
    while (!timer1Started()){}
    stop_timer1();

    uart_puts("Idle ticks: %d, ISR ticks: %d", timer0_value, timer1_value);

}

そしてあなたのディスプレイISRで...

ISR_display()
{
    stop_timer0();
    start_timer1();

    /* ... your ISR routine ... */
}

ここではいくつかの仮定をしました。1-他の目的でタイマーを使用していないこと、および2-タイマーの開始と停止のオーバーヘッドが最小限である(通常、単一のレジスタ書き込みで行われる)。編集:そして3番目の前提として、タイマーのオーバーフローが発生する前にこれをすべてキャプチャできますが、それも考慮することができます。

キャッチできないコンテキストスイッチオーバーヘッドが発生します。これにより、ISRに2つの操作が追加されます(必ず、start_timer / stop_timerにマクロを使用して、関数呼び出しのオーバーヘッドを排除してください)。start + stopタイマーマクロに使用される合計サイクル数を取得できる場合は、これらのティックをtimer1_valueから差し引いて、ISRティック値をもう少し正確に取得できます。使用されたCPU時間の割合の最終的な計算は次のようになります。

Usagecpあなた=TckssrTckssr+Tcksdle100

1
外部ハードウェアを必要としないソリューションの場合は+1。おそらくそれを行うにはより面倒な方法ですが、それは私の制約に適合します。私は今タイマーについて学ぶ必要があるだけです。ありがとう。
captncraig

同様のプロジェクトのAVRでこれを使用しました。それは非常にうまく機能します。
drxzcl

11

ISRに入るときに出力ピンを設定し、ISRから戻る前にクリアします。RCフィルターで出力をフィルター処理します。コンデンサ両端の電圧により、ISRデューティサイクルが得られます。
たとえば、電源が3.3Vで33mVの場合、ISRに時間の1%を費やします。


2
これは、RCフィルター部分を除いて、まさに私たちが行うことです。ISRに入るときに出力ピンを設定し、戻り時にそれをクリアします。これをoスコープで見ると、あらゆる種類の有用な情報が得られます。

3
@David-私もスコープでパルスを見るだけですが、OPはパルスがないと言います。
stevenvh

1
保存範囲を広げる必要があるようです。
captncraig

@stevenvh、スコープがないことがわかったときに私が示唆していたこととまったく同じです。これが、これらの組み込み技術者がいくつかの追加のデジタル出力ピンを気に入っている理由です。
Kortuk

スコープがない場合にメーターでフィルタリングするのは良い考えです。)(非常に困難であっても非常に大きな変動を参照する- -が、かわいい):オン/オフLEDと効果的な明るさを測定するオン
ラッセル・マクマホン

7

これを行う最も簡単な方法は、シミュレーターでコードを実行し、割り込みルーチンが取るサイクルを測定することです。たとえば、Microchip MPLABシミュレータには、この目的に非常に役立つ便利なストップウォッチ機能があります。

それが失敗する場合は、割り込みの開始時にピンを上げ、終了時に下げることで解決できます。これを確認する最も簡単な方法は、オシロスコープを使用することです。マイクロコントローラと電子機器のプロジェクトをしている場合は、とにかくそれを入手する必要があります。

スコープがなければ、ピン電圧をローパスフィルターし、電圧計で測定できます。その電圧をプロセッサの電源電圧で割ると、ピンが高い時間の何分の1かがわかります。たとえば、プロセッサが3.3Vで実行されており、ローパスフィルターされたピンの電圧が800mVである場合、ピンは高く800mV / 3.3V = 24%の時間です。

どうやらコンパイラを使用しているので、この答えをいくらか下げる必要があります。コンパイラは、コードが実行される前にいくつかの割り込みエントリコードを追加し、コードが実行された後に割り込み終了コードを追加する可能性があります。真の割り込み時間は、パルスの両側で数サイクル延長されます。もちろん、割り込みのタイミングを気にするのであれば、そもそもコンパイラを使うべきではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.