繁体   English   中英

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

[英]How do you test your interrupt handling module?

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

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

通常,硬件中断也可以通过软件(自动测试)或调试器通过设置标志来触发。 或者通过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的正确时刻,特别是如果系统也进入睡眠模式 - 中断数。 如果添加机械开关,机械旋转(在达到稳定状态之前有数百个断裂/接触时刻),可能会令人惊讶

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

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

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

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

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

对于像这样的东西,我强烈推荐像SPIN模型检查器 你最终测试算法,而不是代码,但测试是详尽的 回到那一天, 我发现了使用这种技术的gdb一个错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM