你如何测试你的中断处理模块?

时间:2009-08-06 07:08:52

标签: c testing embedded interrupt

我有一个中断处理模块,用于控制嵌入式处理器上的中断控制器硬件。现在我想为它添加更多测试。目前,测试仅测试中断嵌套是否有效,方法是在ISR中进行两次软件中断,一次是低优先级,另一次是高优先级。如何进一步测试该模块?

4 个答案:

答案 0 :(得分:6)

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

通常,硬件中断也可以通过软件(自动测试)或调试器通过设置标志来触发。或者通过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 :(得分:3)

我推荐真正的硬件测试。中断处理本质上是随机的,不可预测的。

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

尝试拨打频率&amp;关闭信号发生器(改变它们之间的速率),看看会发生什么。有许多诊断代码来验证各种状态下中断控制器的状态。

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

答案 2 :(得分:0)

我不是嵌入式开发人员,所以我不知道这是否可行,但如何将处理中断的代码与回调注册机制解耦?这样你就可以根据需要编写模拟器代码来触发中断事件......

答案 3 :(得分:0)

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