中止服务程序: void interrupt ISR(void);
示例:
void interrupt ISR(void) { //中止服务程序
} //中止完毕并回来
PICC 会主动参加代码完成中止现场的维护,并在中止完毕时主动康复现场,所以编程员无需象编写汇编程序那样参加中止现场维护和康复的额定指令句子。但假如在中止服务程序中需求修正某些全局变量时,是否需求维护这些变量的初值将由编程员自己决议和施行。
· 代码尽量简略,中止服务着重的是一个“快”字。
· 防止在中止内运用函数调用。
· 防止在中止内进行数学运算。数学运算将很有或许用到库函数和许多中心变量,就算不呈现递归调用的问题,光在中止进口和出口处为了维护和康复这些中心暂时变量就需求很多的开支,严重影响中止服务的功率。
中档系列PIC 单片机的中止进口只要一个,因而整个程序中只能有一个中止服务函数。(PIC18有两个中止向量,PIC16只要一个)
《MPLAB? C30C 编译器用户攻略》
7.3.1 编写中止服务程序的方法
? 不带参数并以void 回来值类型声明ISR (强制)
? 不要经过一般程序调用ISR (强制)
? 不要用ISR 调用其他函数(主张)
MPLAB C30 的ISR 和任何其他C 函数相同,能够有局部变量,能够拜访全局变量。可是, ISR 需求声明为没有参数,没有回来值。这是有必要的,由于ISR 作为对硬件中止或圈套的呼应,对它的调用与一般C 程序异步(即ISR 不是按一般的方法调用的,因而不能有参数和回来值)。
ISR 只能经过硬件中止或圈套调用,不能经过其他C 函数调用。ISR 运用中止回来(RETFIE)指令退出函数,而不是运用一般的RETURN 指令。不康复现场运用RETFIE 指令退出中止服务程序会损坏处理器资源,如status 寄存器的值。最终,由于中止呼应时刻的原因,主张不要运用ISR 调用其他函数。
7.6 中止呼应时刻
有两个要素影响中止源产生到履行ISR 代码第一条指令之间的周期数。这两个要素是:
? 处理器处理中止时刻 — 处理器辨认中止并跳转到中止向量第一个地址的时刻。这个值与详细器材和所运用中止源有关。
? ISR 代码 — MPLAB C30 在ISR 中保存它运用的寄存器,这包含作业寄存器和RCOUNT 特别功用寄存器。并且,假如ISR 调用一个一般的函数,编译器要保存一切的作业寄存器和RCOUNT,即便在ISR 中没有显式运用这些寄存器。有必要要保存这些寄存器,由于一般来说,编译器不知道被调用函数运用了哪些资源。