本帖最后由 Violin11 于 2018-4-3 10:49 编辑
MCS-51中断系统中的复位问题
MCS-51系列单片机提供了多个中断源(8051提供5个,8052提供了6个中断源),每个中断源可编程两种级别的中断,高级中断请求和低级中断请求,因此可实现两级中断服务嵌套。即使同一级别的中断源,在同时请求中断时,CPU响应也有先后顺序的区别。因此MCS-51在实时系统,仪器仪表中使用十分广泛,中断系统的设计则是软件设计中的一个关键点,处理不好往往使软件达不到设计效果。
下面是在应用过程中曾遇到过的一个问题。
我们设计的一台电力测量仪含有键盘和秒时钟,键盘中断采用INT0,秒时钟用T0,INT0设置为高优先级别中断,T0为低级别,秒中断服务占有约750ms。要求CPU对键盘具有很高的响应速度,而且一旦接收有效的键盘命令,使程序重新从等待处进入的测量状态,不再回到被键盘打断的地方。软件流程如图1所示。
最初的键盘服务程序末尾如下: 在调试过程中,常常响应键盘中断后,不能正常进入秒中断,只在WAIT处等待循环,此时EA=1,TR0=1,TF0=1,可见EA=1,TR0=1,TF0=1不是中断T0响应的充要条件。
经多方查询有关资料发现,MCS-51系列单片机的中断系统有两个不可寻址的优先状态触发器,它们的置位状态,一个指示CPU正在执行的高优先级中断服务程序,另一个指出正在执行低优先级中断服务,这两个触发器的置位状态分别屏蔽所有中断申请和同一优先级的其它中断请求。
秒中断服务需要750ms,当按下键盘时有75%的机率正在执行秒中断服务程序,指示执行低优先级中断服务的触发器已置位。响应键盘中断后,指示执行高优先级中断服务的触发器置位,而整个过程中只执行了一次RETI指令,指示CPU正在执行T0中断的触发器没有复位,即使TR0=1,TF=1,EA=1,CPU仍认为程序已执行秒中断服务,因而不能再次进入秒中断服务,为此,将原程序改为 汇编装入系统后,一切正常。
|