MCU正常是运行在用户模式,也就是运行在我们写的主函数main中。但是,当有一些异常发生时,比如指令不对,数据访问有问题或者Reset等异常情况发生时,CPU就会进入特殊模式进行异常处理。
比如,我们希望按键按下就把LED小灯点亮,这个时候如果在程序中轮询按键的状态,就有可能发生检测延时。按键按下了但是程序还没执行到询问按键状态的地方,等执行到了,按键已经松开了,这样就达不到我们期望的效果。
为了可以即时的做出响应,MCU硬件上有一种异常,叫做中断,我们可以把按键这个引脚配置为一个外部中断引脚,当按键按下的时候进入响应的中断服务程序,在子程序中更改标志位,在主程序中做出处理,把LED小灯点亮。
在进入中断服务程序,我们需要将原来的程序状态保存一下,主要是保存寄存器的状态,然后跳到中断服务程序进行处理,处理完还要跳回原来的程序接着运行。所以,中断处理程序过程如下:
- 保存现场(保存各类寄存器);
- 调用处理程序(处理中断/异常);
- 恢复现场(回到原来的程序继续执行)。
ARM对中断/异常的使用过程:
- 首先需要初始化,a.设置中断源,让它可以产生中断;b.设置中断控制器(设置是否要屏蔽,设置优先级等);c.使能中断总开关;
- 中断未触发,这时先执行其他程序;
- 产生中断,比如按下按键,这时中断控制器会收到信号,然后中断控制器给CPU发信号;
- CPU每执行完一条指令,都会检测有无中断/异常产生(这一功能是由硬件实现);
- 发现有异常/中断产生,开始处理。对于不同的异常,CPU会跳到不同的地址(异常向量,有一个异常向量表)执行程序;(这些地址上,只是一条跳转指令,跳去执行其他函数, 这些函数,需要保存现场,处理异常(中断)调用处理函数,恢复现场)。
2440的异常向量表如下:
那么,中断函数怎样调用呢?
答:不多说了,很基础了,看图就能懂。