中断服务程序有一个特殊的定义方法: void interrupt ISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键词“interrupt”。
中断函数可以被放置在原程序的任意位置。因为已有关键词“interrupt”声明,PICC 在最后进行代码连接时会自动将其定位到0x0004 中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令“retfie”。
一个简单的中断服务示范函数如下:
void interrupt ISR(void) //中断服务程序
{
if (T0IE && T0IF)//判TMR0 中断
{
T0IF = 0; //清除TMR0 中断标志 //在此加入TMR0 中断服务
}
if (TMR1IE && TMR1IF)//判TMR1 中断 T
{
MR1IF = 0; //清除TMR1 中断标志
//在此加入TMR1 中断服务
}
} //中断结束并返回
PICC 会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场,所以编程员无需像编写汇编程序那样加入中断现场保护和恢复的额外指令语句。
但如果在中断服务程序中需要修改某些全局变量时,是否需要保护这些变量的初值将由编程员自己决定和实施。
用C 语言编写中断服务程序必须遵循高效的原则:
1. 代码尽量简短,中断服务强调的是一个“快”字。
2.避免在中断内使用函数调用。虽然PICC 允许在中断里调用其它函数,但为了解决递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其它函数内的代码直接写在中断服务程序中。
3.避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变量就需要大量的开销,严重影响中断服务的效率。
中档系列PIC 单片机的中断入口只有一个,因此整个程序中只能有一个中断服务函数。