中断对于嵌入式设计的重要性不言而喻,但是以前没有深入的理解和掌握,最近重新回顾了这块知识,结合书本和网上的知识,进行了一些归纳和整理,以便梳理。
1、中断服务函数的执行过程
其实,关于中断在很多教材中都会涉及到,但很多教材讲的基本千遍一律,无非对“中断发生->保护现场->执行中断->现场恢复”的讲解。那回归到实际操作,在自己编写的ISR中硬件是怎样执行的呢?在《项目驱动-单片机应用设计基础》中是这样描述的:
在SDCC-51编译器环境下,中断服务函数一般定义如下;
void time0ISR(void) __interrupt 1
{
.......
}
(1)__interrupt或interrupt是扩展关键字,表明这个函数时中断服务函数。后面紧跟的“1”是中断编号。不同的中断源是有不同编号的,以便在程序设计中甄别,在此,编号“1”表示T0中断。还有,可选关键字using用以告诉编译器是选用那组寄存器,但书中作者不推荐使用using关键字,除非ISR对速度要求非常高且代码不简单。
(2)需要注意的是,中断服务函数是没有输入参数和返回值的。
(3)中断服务函数的执行机制:当中断被响应时,会根据中断编号将PC指向中断向量(中断向量的定义如下),其实,编译器已经在对应的中断向量处放置了一条长跳转指令(LJMP),这样,程序就可以跳到中断服务函数地址处执行中断服务程序,执行完毕会在程序末位自动添加中断返回指令RET
1、中断服务函数的执行过程
其实,关于中断在很多教材中都会涉及到,但很多教材讲的基本千遍一律,无非对“中断发生->保护现场->执行中断->现场恢复”的讲解。那回归到实际操作,在自己编写的ISR中硬件是怎样执行的呢?在《项目驱动-单片机应用设计基础》中是这样描述的:
在SDCC-51编译器环境下,中断服务函数一般定义如下;
void time0ISR(void) __interrupt 1
{
.......
}
(1)__interrupt或interrupt是扩展关键字,表明这个函数时中断服务函数。后面紧跟的“1”是中断编号。不同的中断源是有不同编号的,以便在程序设计中甄别,在此,编号“1”表示T0中断。还有,可选关键字using用以告诉编译器是选用那组寄存器,但书中作者不推荐使用using关键字,除非ISR对速度要求非常高且代码不简单。
(2)需要注意的是,中断服务函数是没有输入参数和返回值的。
(3)中断服务函数的执行机制:当中断被响应时,会根据中断编号将PC指向中断向量(中断向量的定义如下),其实,编译器已经在对应的中断向量处放置了一条长跳转指令(LJMP),这样,程序就可以跳到中断服务函数地址处执行中断服务程序,执行完毕会在程序末位自动添加中断返回指令RET