对于嵌入式系统来说,中断的响应时间在时序要求非常严格的情况下十分的重要,所以必须要能够找到中断测试的方法。本文主要介绍两种常用中断测试方法的理论。
如果需要测试中断响应时间,那么必须要理解为什么会有中断响应时间,以及到底测试的是什么数据?
对于处理器来说,当设置了外部中断,从理论上分析,应该系统会从立即正常运行程序的状态转到中断处理程序的状态,从而调用中断处理函数去执行具体的中断程序。当中断处理完成后,又恢复到之前运行程序的状态中去执行。
而上下文则是当前的线程的执行状态,更加准确的说就是处理器相关的寄存器。比如对于cortex-m系列处理器来说,则保存R0~R15和xPSR寄存器。然后通过SP的偏移将寄存器压入栈内存中。然后跳转到具体的中断处理函数中。中断处理完成后则恢复现场,也就是将栈内存中的数据又写回寄存器中。此时又可以从打断的地方开始执行了,这就是一个中断处理过程的基本流程。
而系统的中断响应时间指的是什么?
由于处理器的设计,响应时间无法完全的做的立即进入中断处理函数,而此时从中断的产生,到中断函数处理的这个过程就是中断响应时间,文字描述就是硬件响应+硬件压栈+软件压栈。
中断测试的办法,目前我可以想到的有两种,第一种就是PWM中断引脚测试法,第二种则是定时器法。下面分别描述这两种办法的思路。
首先用示波器通道1输入一个固定频率的方波,然后示波器通道2接到一个测试的gpio上。
其测试方法是当pin1输入一个方波接到mcu的引脚上,并写程序设置pin1为中断上升沿(或下降沿),pin2则最开始为低电平,当到中断处理入口时,设置为高电平。那么示波器上显示如下的图形则可以得出中断响应时间。
由于上升沿中断产生后,pin2通道二中断处理时,会将硬件gpio拉高,此时只需要测试两者之间的时间即可。
该测试技巧在于使用芯片内部的两个定时器进行测量。原理上是开启两个计数器,一个是向上递增的计数器,另外一个是向下递减的计数器。递减的计数器当一直递减到0时,产生中断。
暂时定义为这两个定时器为timer1和timer2。
在某一个时间点,同时设置timer1倒计时2s,并且记录此时timer的计数1,cnt1。当2s倒计时后,中断响应,此时硬件在做处理,执行到实际的中断处理后,在最开始的代码处记录下timer2的计数cnt2。于是可以得到中断响应时间应该为
cnt2-cnt1-2s
当然,这个倒计时可以根据具体的情况进行调节。
从测量芯片的中断响应时间上,具体的硬件可能会有一些差异,有些芯片可以之间通过中断向量找到中断产生的原因,而有些中断处理则是统一入口处理,然后通过读取寄存器来判定异常或者中断产生的原因,这样的中断处理效率也会下降,上文的中断测试方法只是提供一种通用的思路解决办法,具体的芯片的处理流程则需要自己去设定中断响应时间的测试策略。