测量中断程序的cpu负载


8

我有一个isr,它以固定的频率更新显示。我想调整例程以最小化开销,并为其他处理保留尽可能多的cpu时间,但是我没有任何好的方法来收集指标以确定我的cpu负载。

我可以查看程序集并分析例程,但是我没有足够的耐心或能力来做到这一点。我也不觉得我需要非常精细的结果,仅是ISR占用的CPU时间的简单百分比。

我只能在isr处于活动状态时将其设置为高电平并从外部进行测量。这在代码中具有最小的开销,但是我不知道用什么来衡量它。我没有示波器或类似的东西。是否有简单的集成电路或简便的方法可以使用另一个微计来测量占空比?我听说过专用的频率计数器芯片,但是占空比有什么用吗?

Answers:


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-启动和停止计时器的开销很小(通常是通过一次寄存器写入完成)。编辑:和第三个假设,您可以在计时器溢出发生之前捕获所有这些信息,但是也许您也可以对此进行解释。

您将无法捕获一些上下文切换开销,并且这还会在ISR中添加两个额外的操作(请确保对start_timer / stop_timer使用宏以消除函数调用开销)。如果可以获取用于启动+停止计时器宏的总周期数,则可以从timer1_value中减去这些滴答声,以更准确地获得ISR滴答声值。您最终使用的CPU时间百分比的最终计算将是:

Usagecpu=(TicksisrTicksisr+Ticksidle)100

1
+1不需要外部硬件的解决方案。可能是一种更麻烦的方法,但这符合我的限制。我现在只需要了解计时器。谢谢。
captncraig 2011年

我在AVR上用于类似项目。效果很好。
drxzcl 2011年

11

进入ISR时设置输出引脚,并在返回之前清除它。用RC滤波器对输出进行滤波。电容器两端的电压应为您提供ISR占空比。
例如,如果您的电源为3.3V,而测量值为33mV,则您将1%的时间花费在ISR中。


2
这正是我们要做的,除了RC滤波器部分。我们在进入ISR时设置输出引脚,然后在返回时将其清除。在一个观察镜上看这将提供各种有用的信息。

3
@David-我也只是看着示波器上的脉冲,但是OP表示他没有。
stevenvh 2011年

1
看来我需要开始保存一个良好的范围。
captncraig 2011年

@stevenvh,恰恰是我看到没有示波器时要建议的内容。这就是为什么那些嵌入式专家喜欢几个额外的数字输出引脚的原因。
Kortuk

在没有示波器的情况下进行过滤是一个好主意。打开/关闭LED并测量有效亮度:-)。(很难看到很大的变化-但很可爱。)
罗素·麦克马洪

7

最简单的方法是在模拟器中运行代码并测量中断例程占用的周期。例如,Microchip MPLAB仿真器具有方便的秒表功能,为此非常有用。

失败的话,在中断开始时提高引脚并在结束时降低引脚会有所帮助。最简单的查看方法是使用示波器。如果您正在执行微控制器和电子项目,无论如何都应该得到一个。

没有示波器,您可以简单地对引脚电压进行低通滤波,然后使用电压表进行测量。该电压除以处理器电源电压将为您提供引脚为高电平的时间的分数。例如,如果处理器以3.3V运行,并且低通滤波后的引脚电压为800mV,则该引脚处于高电平的时间为800mV / 3.3V = 24%的时间。

由于您显然使用的是编译器,因此您需要对这个答案有所降低。编译器可能会在代码运行之前添加一些中断入口代码,并在代码运行之后添加中断出口代码。真正的中断时间将在脉冲的任一侧延长几个周期。当然,如果您关心中断定时,则不应首先使用编译器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.