您的位置 首页 培训

PIC中止编写

中断服务程序:voidinterruptISR(void);其中的函数名ISR可以改成任意合法的字母或数字组合。中断函数可以被放置在原程序的任意位置。…

中止服务程序: void interrupt ISR(void);

其间的函数名“ISR”能够改成恣意合法的字母或数字组合。

中止函数能够被放置在原程序的恣意方位。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 中没有显式运用这些寄存器。有必要要保存这些寄存器,由于一般来说,编译器不知道被调用函数运用了哪些资源。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/272136.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部