在PIC的一些中、低端型号中,往往只有一个中断函数入口,而且没有中断优先级,这对于很多在学校学习89C51核出来的学生,往往给他们带来一定的学习障碍。
1、PIC中档MCU的中断入口固定为ROM首叶的0X0004地址,无论发生什么样的中断,应用程序都将被打断并跳转到这个地址去执行相关的中断处理函数。
2、在51系列中,中断源的区分是由硬件完成的,但在PIC上,这个需要工程师自己通过软件去判断。
3、因为只有一个中断入口,所以也没有51那样的两级中断优先级,具体何种中断源应该优先执行完全由工程师自己的软件确定,这是通过中断函数中的中断源查询代码的顺序决定的,可以把这个概念称呼为软件优先级。
4、PIC的中断结构决定了PIC一般不考虑中断嵌套,假使现在正在处理软件优先级中低优先级的中断源,即使此时产生更高优先级的中断,一般也必须处理完毕后退回MAIN函数后再次响应进入,这是因为响应中断后,MCU硬件会自动关闭GIE标志位,这样其它中断请求就会被暂时挂起并在中断退出后立即响应,当然,此时发出的中断请求标志在被响应前将会一直被保持。
5、因为PIC中端MCU采用的是全硬件堆栈,没有数据堆栈,所以,关于中断现场保护也完全交给工程师自由把握,所以进入中断后惟一办法就是把需要保护的数据保存到RAM中进行备份,中断退出时再给予恢复,至于那些积存器需要被保护,这完全取决于工程师,一般来说,W、STATUS、PCLATH、FSR是必须的,其它需保护的内容取决于工程师在中断函数将会使用到哪些变量,并且这些变量在其它函数中也确定有使用记录。对于代码超过2K的程序,PCLATH是必须的,否则可不考虑它的保存,这是因为PC本身可保证2K以内的寻址空间,而PC是由硬件自动压栈到硬件堆栈中去了。
6、一个中断入口不代表只能处理中断源,通过上面的描述,我们可以清楚的了解,其实事情很简单,其道理就是:多个中断源对着一个中断入口,当发生某一个中断时将转想中断入口,处理完毕后退出,如果发生别的中断,还是从这个入口进去。
7、如何写一个可靠的中断函数是一个麻烦,当然这是针对ASM而言,如果你使用PICC,那么C编译器会自动帮你处理掉大多数问题,但有关中断源的查询写法还是要注意一下的,这点你可以自己搜索网络文章,网络有很多地方可提供张明峰先生那本入门书中有关PICC的那个独立章节,那里面把最基本、最关键的问题都讲过了,请自行查阅。