购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.7 中断服务程序设计

MPLAB XC、HI-TECH PICC/PIC-C18、Microchip C18均支持C语言中断服务程序设计。以XC8为例,其中断服务程序定义方法如下:

其中函数名“ISR”指中断服务例程(Interruption Service Routine),它可以改成任意普通的函数名称,但其入口参数和返回参数都必须是“void”,因为中断函数不允许有入口参数和返回值。另外注意“interrupt”关键字写在函数名称前面,而编写8051单片机的Keil C程序时,“interrupt”关键字是写在函数名称后面的。

用C语言编写的PIC单片机中断函数可以放置在源程序中的任意位置,且不需要声明。由PIC单片机内存结构图可知,PICC编译器最后编译连接代码时,会将其自动定位到0x0004中断入口处,以便响应中断,提供中断服务功能。编译器还会在中断函数的末尾自动添加中断函数返回的汇编指令“retfie”。

下面是一个简单的中断服务程序范例:

对于中断函数,编译器能自动生成相关压栈代码保护中断现场,并在中断结束时弹栈恢复现场,故而不需要像汇编语言程序那样专门加入中断现场保护和恢复语句。

用C语言编写中断服务例行程序要遵循高效的原则。

(1)中断函数代码应尽量简洁,一般不宜在中断函数内编写大量复杂冗长的代码。

(2)应尽量避免在中断函数内调用其他自定义函数。

(3)尽量避免在中断内调用数学函数,因为某些数学函数涉及相关的库函数调用和中间变量较多,可能出现交叉调用,出现这种情况时将导致编译失败。在必须使用数学函数时,可考虑将复杂的数学函数运算任务交给主程序完成,中断函数通过全局变量引用其结果。

(4)宏的定义与调用。在中断函数,包括其他普通函数内调用宏,可减少在函数调用中压栈与弹栈的开销。因为编译器会在宏调用的位置直接“复制嵌入”宏定义的源代码,故而不存在函数调用的压栈与弹栈开销。

本书第3章有关案例中编写了外部中断、定时器溢出中断、比较匹配中断、串行异步接收中断、模拟比较中断、输入捕获中断等中断服务程序,所附源程序提供了很详细的注释语句,对这些中断程序的设计要熟练掌握。 i+WYNdvKkvjHUBbxPYThd8R8Ct5haRBLGooPlGk5ZTIliBX5lfFb38inCzFV8xsN

点击中间区域
呼出菜单
上一章
目录
下一章
×