只是一个半生半熟的主意,您也许可以像这样使用计时器(伪代码):
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时间百分比的最终计算将是:
ü小号一个克ËÇ p ü= (Ť我Ç ķs我小号[RŤ我Ç ķs我小号[R+ T我Ç ķs我d升è)* 100