上个礼拜在用microchip编程,因为没有注意中断的优先级别,导致浪费1天的时间来分析定位,在此提示备注下。
背景条件:1,一个子程序使用 输入捕捉 功能 来计算频率,中断优先级是使用默认的最低优先级。用Timer2来做时钟源,Timer2中断关闭。当有输入时,将产生一个中断,该中断将读取Timer2的时刻,并计时。
2,另外要求是每秒钟调用一次频率计算子程序;由于单个Timer的计时长度只有16位,于是合并两个Timer4,Timer5来做计时。当Timer5每次溢出时,Timer4计数+1。Timer5的中断优先级较高,是5级,Timer4的优先级同样默认垫底。
出现的问题:由于编程的时候没有留意中断优先级问题,导致以下问题: 在每秒的计时周期里,Timer4+Timer5有中断产生,并开始调用 输入捕捉 子程序;但是输入捕捉子程序始终不能获得中断响应,程序挂死。
原因分析:Timer4+Timer5的整体中断优先级等同于 输入捕捉 的中断优先级;在Timer4+Timer5中调用子程序,则子程序不结束,Timer4+Timer5中断不能结束退出;该Timer4+Timer5中断的优先级不低于 输入捕获 子程序所必须的中断优先级,导致 输入捕获 不能产生中断,输入捕获挂死,整体程序挂死。
解决方法:在Timer4+Timer5的中断中设置一个定时到期的标志,通过主程序无限循环查询该标志位来判断是否到时间,以调用 输入捕捉 子程序,结果达到预期目标。
当然,还可以调整中断优先级,让Timer5的中断优先级不变;增加 输入捕捉 中断的优先级,使之高于Timer5),这样在运行Timer4的中断的过程中,可以响应 输入捕捉 的中断,从而达到预期目的。