'
pic单片机低端和中端产品(12系列和16系列)没有中端优先级控制,只能用软中端
来控制。interrupt 2----是否指用第二组工作寄存器(或者中端优先级2级),以方便数据保护。
所以不需要c51那么麻烦,但任何中断都可以引发中端。一般使用查询和软中断控制来处理。
'
11.6.4 中断函数的实现
picc 可以实现 c 语言的中断服务程序。中断服务程序有一个特殊的定义方法:
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中断
{
tmr1if = 0; //清除tmr1中断标志
//在此加入tmr1中断服务
}
} //中断结束并返回
例11-5 c语言中断函数举例
picc 会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场,所以编程
无需象编写汇编程序那样加入中断现场保护和恢复的额外指令语句。但如果在中断服务程
中需要修改某些全局变量时,是否需要保护这些变量的初值将由编程员自己决定和实施。
用 c 语言编写中断服务程序必须遵循高效的原则: 代码尽量简短,中断服务强调的是一个“快”字。 避免在中断内使用函数调用。虽然 picc 允许在中断里调用其它函数,但为了解决
递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其
它函数内的代码直接写在中断服务程序中。 避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就
算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变
量就需要大量的开销,严重影响中断服务的效率。
中档系列 pic 单片机的中断入口只有一个,因此整个程序中只能有一个中断服务函数。