
一层是硬件相关,目的是执行中断找到中断向量,为中断服务历程提供运行环境(比如保存中断前的各工作寄存器状态,屏蔽中断,中断嵌套计数,或者取消屏蔽)等等,搞定后跳转到中断向量指向的位置,执行中断服务(通常如果是完善的程序,这里应该允许添加多个服务历程)。。
服务例程就是具体要执行的内容,是和硬件无关的,换一个型号的CPU理论上应该保证也能顺利使用不用该代码。。
无非就这两层关系,如果要移植程序,硬件相关的中断处理必须修改,硬件无关的,理论上是不用修改,但写的水平很差劲,没有完全脱离硬件,也得改。。。
1、ISR不能有返回值,必须用void;2、ISR不能传递参数,必须用void;
3、ISR应该是短而高效的,所以不推荐在ISR中做浮点运算,应该只由中断发出消息或置位标志然后由应用层去处理其他工作;
4、ISR中不应该有重入和性能上的问题,因此使用pintf()函数也是不好的。
你好,这两个不是关键字,51中定时器和中断是通过中断向量号对应的,外部中断0、定时器0、外部中断1、定时器1、串口中断分别对应1-5为了便于理解和阅读,很多人把定时器等器件的初始化函数中加上_Init这几个字符,代表这个函数是初始化函数,一眼就可以看出来,比如定时器0的初始化函数可以写为
void Timer0_Init(void)
{
...
...
}
中断函数很多人会加上_ISR,比如定时器0的中断服务程序可以这样写:
void Timer0_ISR(void) interrupt 1
{
...
...
}
其中_Init _ISR这两个只是函数名称而已,可以任意写的,但是interrupt后边的数字是中断向量号,不能随便写的,在keil软件中,这个数字一定要和我上边说的对应,就像定时器0对应的中断向量号是1,所以这里的数字必须是1,不然是不能进入定时器0的中断服务程序的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)