1、中断概念的引入
假设有个大房间里面有小房间,婴儿正在睡觉,他的妈妈在外面看书。
问:这个母亲怎么才能知道这个小孩醒?
- 过一会打开一次房门,看婴儿是否睡醒,让后接着看书
- 一直等到婴儿发出声音以后再过去查看,期间都在读书
第一种方法 叫做查询方式
程序简单,但是累
程序的模型:
while(1)
{
1 read book(读书)
2 open door(开门)
if(睡)
return(read book)
else
照顾小孩
}
第二种方法 叫做中断方式
程序复杂,但是不累
程序的模型:
while(1)
{
read book
中断服务程序()//如何被调用?
{
处理照顾小孩
}
}
2、 中断的处理流程介绍
母亲采用中断方式的处理过程:
声音来源有很多种,有远处的猫叫,门铃声,小孩哭声。这些声音传入耳朵,再由耳朵听到声音会发送信号给脑袋,中断母亲的看书。====>中断(属于一种异常)
身体不舒服,有只蜘蛛掉下来,对于特殊情况无法回避,必须立即处理。 ====>异常
对比ARM系统:
中断源有按键、定时器、有其它的(比如网络数据),这些信号都可以发送信号给中断控制器,再由中断控制器发送信号给CPU表明有这些中断产生了,这些成为中断(属于一种异常)
指令不对,数据访问有问题,reset信号,这些都可以中断CPU,这些成为异常中断。
母亲放下看书的任务,在书里放上书签,去完成其他任务后回来,再拿起书看。
ARM系统也是同理。
重点在于保存现场以及恢复现场
arm对异常(中断)处理流程:
1 初始化:
:: a 设置中断源,让它可以产生中断
:: b 设置中断控制器(可以屏蔽某个中断,优先级)
:: c 设置CPU总开关,(使能中断)
2 执行其他程序:正常程序
3 产生中断:按下按键—>中断控制器—>CPU
4 cpu每执行完一条指令都会检查有无中断/异常产生
5 发现有中断/异常产生,开始处理。对于不同的异常,跳去不同的地址执行程序。这地址上,只是一条跳转指令,跳去执行某个函数(地址),这个就是异常向量。如下就是异常向量表,对于不同的异常都有一条跳转指令。
.globl _start
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq //发生中断时,CPU跳到这个地址执行该指令 **假设地址为0x18**
ldr pc, _fiq
//我们先在0x18这里放 ldr pc ,__irq,于是cpu最终会跳去执行__irq代码
//保护现场,调用处理函数,恢复现场
(3-5都是硬件强制做的)
6 跳到的那些函数做什么事情? 我们自己要写的代码
:: 软件做的:
:: a 保存现场(各种寄存器)
:: b 处理异常(中断):
:::: 分辨中断源
:::: 再调用不同的处理函数
:: c 恢复现场
中断处理程序怎么被调用?
CPU—>0x18 –跳转到其他函数->
:: 做保护现场
:: 调用函数
:::: 分辨中断源
:::: 调用对应函数
:: 恢复现场
cpu到0x18是由硬件决定的,跳去执行更加复杂函数(由软件决定)