只是一个半生不熟的想法,您也许可以像这样使用计时器(伪代码):
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 - 启动和停止计时器的开销很小(通常通过单个寄存器写入完成)。编辑:第三个假设,您可以在发生计时器溢出之前捕获所有这些,但也许您也可以考虑这一点。
会有一些你无法捕捉到的上下文切换开销,这也会在你的 ISR 中添加两个额外的操作(确保为你的 start_timer/stop_timer 使用宏来消除函数调用开销)。如果您可以获得用于启动+停止计时器宏的总周期数,那么您可以从 timer1_value 中减去这些滴答声,以更准确地获得 ISR 滴答声值。您对所用 CPU 时间百分比的最终计算将是:
Usagecpu=(TicksisrTicksisr+Ticksidle)∗100