新闻中心

PIC中断编写

作者: 时间:2016-11-13 来源:网络 收藏
中断服务程序: voidinterruptISR(void);

其中的函数名“ISR”可以改成任意合法的字母或数字组合。

本文引用地址://m.amcfsurvey.com/article/201611/316101.htm

中断函数可以被放置在原程序的任意位置。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 语言编写中断服务程序必须遵循高效的原则:

· 代码尽量简短,中断服务强调的是一个“快”字。

· 避免在中断内使用函数调用。虽然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 中没有显式使用这些寄存器。必须要保存这些寄存器,因为一般来说,编译器不知道被调用函数使用了哪些资源。



关键词:PIC中断编

评论


技术专区

关闭