【问题标题】:How do you test your interrupt handling module?你如何测试你的中断处理模块?
【发布时间】:2010-11-17 06:23:05
【问题描述】:

我有一个中断处理模块,它控制嵌入式处理器上的中断控制器硬件。现在我想向它添加更多测试。目前,测试仅通过在 ISR 中进行两个软件中断来测试中断嵌套是否有效,一个具有低优先级,一个具有高优先级。如何进一步测试这个模块?

【问题讨论】:

    标签: c testing embedded interrupt


    【解决方案1】:

    我不是嵌入式开发人员,所以我不知道这是否可能,但是如何将处理中断的代码与回调注册机制解耦?这将允许您编写模拟器代码以触发中断事件...

    【讨论】:

    • 可能没有回调注册机制。发生中断,并调用相应的中断服务程序(在编译时固定)。
    【解决方案2】:

    我建议您也尝试创建其他刺激。

    通常,硬件中断也可以由软件(自动测试)或调试器通过设置一个标志来触发。或者通过 I/O 作为中断。或定时器中断。或者,您可以在单步执行时通过调试器在中断控制器中设置中断位。

    您可以对不应该发生的事情添加一些运行时检查。有时我会选择将输出引脚设置为外部监控(如果您有示波器或逻辑分析仪,那就太好了......)

    low_prio_isr(void)
    {
        LOW_PRIO_ISR=1;
        if (1 == HIGH_PRIO_ISR)
        { this may never happen. dummy statement to allow breakpoint in debugger }
    
    }
    
    high_prio_isr(void)
    {
        HIGH_PRIO_ISR=1
    } 
    

    软件中断的缺点是时刻是固定的;总是相同的指令。我相信您希望看到它始终有效的证据;无死锁。

    对于中断服务例程,我发现代码审查非常有价值。最后,您只能测试您想象的情况,并且在某些时候测试的工作量会非常高。众所周知,ISR 难以调试。

    我认为提供以下测试很有用: - isr 不会因较低优先级的中断而中断 - isr 不会因相同优先级中断而中断 - isr 被中断以获得更高优先级的中断 - 堆栈限制内的最大嵌套数。

    您的一些测试可能会作为检测保留在代码中(因此您可以监控例如最大嵌套级别。

    哦,还有一件事:我通常设法将 ISR 保持得如此之短,以至于我可以避免嵌套......如果可以的话,这将为您带来更多的简单性和更高的性能。

    [编辑] 当然,ISR 也需要在系统中的硬件上进行测试。除了一点一点、一步一步的方法之外,您可能还想证明: - 系统在最大中断负载下的稳定性(最好是预测最大负载的几倍;如果您的 115kbps 串行驱动程序也可以处理 2MBps,您就可以了!) - 启用/禁用 isr 的正确时刻,尤其是在系统也进入睡眠模式时 - # 中断。如果您添加机械开关、机械旋转(在达到稳定状态之前有数百个断开/接触时刻)可能会令人惊讶

    【讨论】:

    • +1 很好的总结,尤其是关于短 ISR 和避免嵌套的评论。
    • +1 正如 Al 所说,另外我同意 ISR 是代码审查特别好的主题。
    【解决方案3】:

    我建议进行真正的硬件测试。中断处理本质上是随机且不可预测的。

    使用信号发生器并将方波输入适当的中断引脚。使用多个生成器(或具有多个输出的一个)来测试多个 IRQ 线路并验证优先级处理。

    尝试在信号发生器上调高和调低频率(改变它们之间的速率),看看会发生什么。有大量的诊断代码来验证中断控制器在各种状态下的状态。

    替代方案:如果您的平台有可以触发中断的计时器,您可以使用它们来代替外部硬件。

    【讨论】:

    • 绝对正确,ISR 需要在硬件中进行测试,但是我的经验是,可以做很多事情来证明它在众所周知的环境中的正确性。我已经看到 ISR 在项目中途失败并出现奇怪的症状,原因在早期硬件测试期间不可见,但在代码审查和单元测试中会暴露出来。
    【解决方案4】:

    对于这样的东西,我强烈推荐SPIN model checker 之类的东西。您最终会测试算法,而不是代码,但测试是详尽的。回到过去,I found a bug in gdb 使用这种技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多