中途半端なアイデアだと、次のようなタイマーを使用できる場合があります(疑似コード)。
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時間の割合の最終的な計算は次のようになります。
Us a gec p u= (T私のC KsI sのRT私のC KsI sのR+ T私のC Ks私はdリットルのE)∗ 100