新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PIC16F87X单片机中断系统应用须关注的问题

PIC16F87X单片机中断系统应用须关注的问题

作者: 时间:2012-04-10 来源:网络 收藏

初始加电时,自动将 PCLATH清0,以避免其内容出现随机值,也就是为了避免在以后的程序运行过程中CPU发生不可预料的跳转,而造成程序的“跑飞”。由此可见,寄存器 PCLATH对于程序的安全运行是至关重要的,不可轻视。程序一旦进入服务程序后,PCLATH的当前值为何就无从考证,实际上就失去了对于PCLATH 内容的知情权。只好像初始上电那样将其清0,重新把它强行“拉入”知情范围(对应程序中第7条指令)。

PCLATH的内容在2种情况下会影响到程序的走向:第1种情况是当执行GOTO和CALL这2条跳转指令时,11位地址码来源于指令码中,决定程序存储器页面的(PC值的)最高2 位,来源于PCLATH4:3>,即这种情况下只有PCLATH的2位影响程序走向。单单就这一种情况而言,只要用户程序不超过第0页(或称页0)的2KB范围,对于程序员来说,PC值的最高2位可以忽略,因而PCLATH寄存器PCLATH4:3>的2位也可以忽略。第2种情况是,以PCL为目标的算术运算、逻辑运算或传送操作指令(PIC16系列的指令中具备14条这样的指令),在操作过程中,自动用 PCLATH寄存器的低5位装载PC的高5位PC12:8>,影响程序走向的PCLATH内容就多达5位。即使对于用户程序不超过(第0页范围内的)2KB的情况,也至少会有3位影响到程序的走向。对于程序员来说,PCLATH的内容就不可忽略,必须保护。

总而言之,对于寄存器PCLATH的保护和处理(对应程序中阴影标出的部分指令,即第5~9条)并不是什么情况下都是必需的,但是在编写服务程序时,统一安排这些指令也没有任何坏处。只要主程序和服务程序中都不需要修改PCLATH寄存器的内容,就可以不保护它。具体地说,只有当同时满足以下2个条件时,阴影标出的部分指令(即第5~9条)才可以省略。

(1) 在主程序和服务程序中不都存在跨页跳转。例如:用户程序没有使用第0页2KB空间之外的程序存储器,或者用户程序虽然超出了2KB的范围,但是,在主程序和中断服务程序中没有同时用到GOTO或CALL指令,都能满足该条。

(2) 在主程序和中断服务程序中没有同时使用以PCL为目标的操作指令(比如查表)。

保护现场的操作次序与恢复现场的操作次序应该相反。程序中的第8~11条就是按照相反的顺序恢复寄存器PCLATH和 STATUS内容的。但是,不要忘记保护现场时采用“SWAPF STATUS,W”指令产生的多余的交换操作,在此只好再采用同样的方法将其交换回来(对应程序中第10条指令)。最后2条指令,将W_TEMP内容的高、低半字节交换了2遍,才被恢复到工作寄存器W中。如果只用1条传送指令“MOVF W_TEMP,W”又会产生1个新的:“MOVF W_TEMP,W”指令会影响“Z”标志位,会破坏此前已经被恢复的寄存器STATUS的内容,这是我们所不希望的,也是不能容忍的。因此,在程序中利用了2条不影响标志位的SWAP指令(即第12,13两条指令)。虽然麻烦一点,但可以使这个得到圆满的解决。

最后必须进一步强调的是,并不是所有情况下编写的中断服务程序中都需要现场保护,或者都需要像以上范例程序那样进行现场保护。有些情况下仅仅保护W、STATUS和 PCLATH这3个寄存器还不够。不过在此程序片段的基础上,再增加或者减少需要保护的寄存器的个数都是轻而易举的事。不要忘记,在保护任何文件寄存器之前都必须先把工作寄存器W保护起来才行得通。

3 需要注意的几个

(1) 中断标志位的状态与该中断源是否产生中断无关。换句话说,不管是否允许其中断,只要满足中断的条件,中断标志位就会被置位。另外,也可以利用软件将中断标志位置“1”或清“0”。

(2) 当开放某一中断源时,该中断源就是通过中断标志位向CPU申请中断的。无论什么原因,只要将中断标志位置位,就会产生中断。如果用软件强行将中断标志位置位,也会产生中断。

(3) 如果在中断被屏蔽(或禁止)的情况下,中断标志位被置位,只要不被清除就会一直潜伏下来,那么,一旦解除屏蔽,就会立即产生中断。

(4) 如果在中断被禁止的情况下,中断标志位已经被置位,但是,假如在允许其中断之前将它清除,那么,即使解除禁止,它也不会产生中断。

(5)当CPU相应的任何一个中断时,全局中断屏蔽位GIE将会自动清0;当中断返回时它又会自动恢复为1。如果在中断处理期间用软件将已经复位的GIE重新置位,这时再出现中断请求,就可以形成中断嵌套。也就是说,如果在响应某一中断期间又响应了其他中断请求,就形成了中断嵌套。发生中断嵌套时,前一中断处理过程被暂停而进入后一中断处理,当后一中断过程被处理完毕之后,才会继续处理前一中断。照此方式,还可以形成多级嵌套,甚至自身嵌套。不过嵌套的级数绝对不能超过硬件堆栈的深度。

(6) 对于中断响应和处理时间有严格要求的,保护现场的指令安排也应考虑延时问题。

(7) 如果同时发生多个中断请求,得到优先处理的中断完全取决于在中断服务程序中检查中断源的顺序。原因是各个中断源之间不存在优先级别之分。

如果清除中断标志位的指令安排在中断服务程序的尾部,就有可能丢失响应在处理中断期间该中断源第2次中断请求的机会。


上一页 1 2 3 4 下一页

评论


相关推荐

技术专区

关闭