在程序中有多个中断需要处理的时候,几个准则不得不看,以免跳转到莫名其妙的illegalISR还一头雾水找不到原因:
准则1:不要采用直接修改的方法手动清除(或者说编程操作)PIEIFR的位:
对PIEIFR进行人为读操作或者读-修改-写操作时,将要发生的中断请求可能丢失。为了清除一个PIEIFR的位,处于挂起状态的中断必须被响应。如果希望清除PIEIFR位,但是又不执行相应的中断服务子程序,需要执行下面的流程:
1.用EALLOW指令使能对PIE向量表的写操作。
2.修改PIE向量表使得所修改的外设中断向量指向一个暂时的中断服务子程序。这个暂时存在的中断服务子程序只执行IRET操作(return from interrupt,即进入中断之后紧接着退出)。
ISR.
3. 使能这个暂时存在的中断服务子程序
4. 在上述的中断完成IRET操作之后,PIEIFR位被清除.
5. 别忘了修改PIE向量表,将向量表的映射状态改为正常状态,这样才能使得中断服务子程序响应正确的外设中断事件.
6.清除EALLOW位,恢复PIE向量表的写保护状态。
准则2:处理不同优先级的软件中断(即不是有硬件事件触发的中断,而是我们自己定义的中断)
在《C2833x C/C++ Header Files and Peripheral Examples in C》即TI网站的SPRC530软件包中有一些这样的例子。操作的步骤为:
1. 使用CPU IER寄存器判断全局优先级,单独的PIEIER寄存器判断中断在组中的优先级,此时PIEIER寄存器只能在中断中读写,且在此中断中只能修改同一个组的PIEIER。PIEACK 此时可以阻止CPU响应其它的中断(除非清除这个应答位)。
(b) 在中断服务子程序处理一个组的中断事件时,注意不要不要不小心禁止了其余组的PIEIER位(在赋值时用“或”操作会保险一些)。