C 如何测试中断处理模块?

C 如何测试中断处理模块?,c,testing,embedded,interrupt,C,Testing,Embedded,Interrupt,我有一个中断处理模块,它控制嵌入式处理器上的中断控制器硬件。现在我想给它添加更多的测试。目前,测试仅通过在ISR内进行两次软件中断(一次低优先级,一次高优先级)来测试中断嵌套是否有效。如何进一步测试该模块?我不是嵌入式开发人员,所以我不知道这是否可行,但如何将处理中断的代码与回调注册机制分离?这将允许您编写您喜欢的模拟器代码触发中断事件 我建议你也尝试创造其他刺激 通常,硬件中断也可以由软件(自动测试)或调试器通过设置标志触发。或作为通过I/O的中断或计时器中断。或者,您可以在单步执行时通过调试

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

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

我建议你也尝试创造其他刺激

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

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

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

对于中断服务例程,我发现代码检查非常有价值。最后,你只能测试你想象的情况,在某个时候,测试的工作量会非常大。众所周知,ISR很难调试

我认为为以下各项提供测试是有用的: -isr不会因低优先级中断而中断 -isr不会因相同优先级中断而中断 -isr因高优先级中断而中断 -堆栈限制内的最大嵌套计数

您的一些测试可能作为工具留在代码中(因此您可以监视实例的最大嵌套级别)

哦,还有一件事:我通常都能将ISR保持得很短,这样我就可以避免嵌套了……如果可以的话,这将为您带来更多的简单性和更高的性能

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

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

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

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


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

对于类似的东西,我强烈推荐类似的东西。您最终测试的是算法,而不是代码,但测试是详尽的。回到过去,使用这种技术。

+1很好的总结,尤其是特别是关于短ISR和避免嵌套的评论。+1正如Al所说,另外我同意ISR是代码审查的特别好的主题。可能没有回调注册机制。发生中断,并使用适当的中断服务例程(在编译时固定)绝对正确,ISR需要在硬件中进行测试,但是我的经验是,在一个众所周知的环境中,可以做很多事情来证明它的正确性。我看到ISR在项目中途失败,出现了奇怪的症状,原因在早期硬件测试中是不可见的,但在代码修改中可能会暴露出来电子战和单元测试。
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
}