最后必须进一步强调的是,并不是所有情况下编写的
中断服务程序中都需要现场保护,或者都需要像以上范例程序那样进行现场保护。有些情况下仅仅保护W、STATUS和PCLATH这3个寄存器还不够。不过在此程序片段的基础上,再增加或者减少需要保护的寄存器的个数都是轻而易举的事。不要忘记,在保护任何文件寄存器之前都必须先把工作寄存器W保护起来才行得通。
3 需要注意的几个问题
(1) 中断标志位的状态与该中断源是否产生中断无关。换句话说,不管是否允许其中断,只要满足中断的条件,中断标志位就会被置位。另外,也可以利用软件将中断标志位置“1”或清“0”。
(2) 当开放某一中断源时,该中断源就是通过中断标志位向CPU申请中断的。无论什么原因,只要将中断标志位置位,就会产生中断。如果用软件强行将中断标志位置位,也会产生中断。
(3) 如果在中断被屏蔽(或禁止)的情况下,中断标志位被置位,只要不被清除就会一直潜伏下来,那么,一旦解除屏蔽,就会立即产生中断。
(4) 如果在中断被禁止的情况下,中断标志位已经被置位,但是,假如在允许其中断之前将它
清除,那么,即使解除禁止,它也不会产生中断。
(5) 当CPU相应的任何一个中断时,全局中断屏蔽位GIE将会自动清0;当中断返回时它又会自动恢复为1。如果在中断处理期间用软件将已经复位的GIE重新置位,这时再出现中断请求,就可以形成中断嵌套。也就是说,如果在响应某一中断期间又响应了其他中断请求,就形成了中断嵌套。发生中断嵌套时,前一中断处理过程被暂停而进入后一中断处理,当后一中断过程被处理完毕之后,才会继续处理前一中断。照此方式,还可以形成多级嵌套,甚至自身嵌套。不过嵌套的级数绝对不能超过硬件堆栈的深度。
(6) 对于中断响应和处理时间有严格要求的应用,保护现场的指令安排也应考虑延时问题。
(7) 如果同时发生多个中断请求,得到优先处理的中断完全取决于在中断服务程序中检查中断源的顺序。原因是各个中断源之间不存在优先级别之分。如果清除中断标志位的指令安排在中断服务程序的尾部,就有可能丢失响应在处理中断期间该中断源第2次中断请求的机会。