首页 理论教育 嵌入式中断服务函数编写技巧

嵌入式中断服务函数编写技巧

时间:2023-11-19 理论教育 版权反馈
【摘要】:在嵌入式C编程的过程中通常将这段代码封装成一个函数来进行调用,这就是中断服务函数。2)一般的函数被编译后的返回指令是RTS,而中断服务函数被编译后的返回指令是RTI。3)中断服务函数的参数个返回值类型总是void。

嵌入式中断服务函数编写技巧

中断处理过程中提供功能性作用的是中断服务程序,简称为ISR(Interrupt Service Routines),其作用是CPU为了能响应中断源并为其进行服务的一段功能性程序代码。在嵌入式C编程的过程中通常将这段代码封装成一个函数来进行调用,这就是中断服务函数。编写中断服务函数几乎是每一个嵌入式项目开发必须的一个内容,但中断服务函数与嵌入式C语言中正常的函数又有一些区别,主要体现在:

1)一般的函数是通过调用的方式进入的,而中断服务函数是通过中断机制进入的。

2)一般的函数被编译后的返回指令是RTS,而中断服务函数被编译后的返回指令是RTI。

3)中断服务函数的参数个返回值类型总是void。

通过上述内容可知,对于中断服务函数在编写和执行过程都需要一些特殊的方法,针对飞思卡尔单片机的中断服务函数编写,在CodeWarrior IDE环境中有3种方式可以实现。

1.用关键词interrupt和中断向量编号定义中断服务函数(推荐使用)

这种方式最直观也最简单,其具体形式如下。

interrupt 中断向量编号 void 函数名()

其中中断向量编号就是中断向量表6-1中的中断号码,例如定时器1的溢出中断编号就是11,则对应的中断服务函数定义就可写成:

978-7-111-50417-7-Chapter06-4.jpg

使用这种方法优点是简单、直观,不需要对单片机各中断向量的入口地址和在存储器中的位置有详细的了解,但缺点是程序的可移植性稍差。在定义中关键词“interrupt”会告诉编译器此函数为中断服务函数,如数字“11”就是告诉连接器该中断矢量的偏移位置(以复位矢量偏移为0计),其中各个中断响应对应的矢量入口编号可以在该芯片的数据手册中查到。

2.用关键词interrupt定义中断服务函数,中断矢量入口由prm文件指定(www.xing528.com)

这种方式的具体形式如下。

interrupt void 函数名()

其中“函数名”必须与prm文件中对应出现的函数名称一致,仍以上面定时器1的溢出中断服务函数为例,其定义方式如下。

978-7-111-50417-7-Chapter06-5.jpg

随后在项目对应的prm文件中添加一行向量位置定义。

978-7-111-50417-7-Chapter06-6.jpg

3.用#pragma TRAP_PROC定义中断函数,中断矢量入口由prm文件指定

该方式中使用到的“#pragma”声明是一种基于单片机开发特点而对标准C语法的一个扩充。“#pragma TRAP_PROC”用于定义一个函数为中断服务类型。此类型的函数编译器在将C代码编译成汇编指令时会在代码前后增加必要的现场保护和恢复汇编代码,同时函数的最后返回用汇编指令“RTI”而不是针对普通函数的“RTS”。例如:

978-7-111-50417-7-Chapter06-7.jpg

注意用“TRAP_PROC”定义的中断服务函数其实际中断矢量地址,它必须通过prm文件指定,所以该方式实际上就是用“#pragma TRAP_PROC”定义中断函数,再按照和“interrupt”相同的方法在prm文件中指定矢量入口。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈