奶奶带小孩的案例
1:奶奶时不时的去看一下小宝宝
2:奶奶一直陪着小宝宝,小宝宝的叫声叫醒了奶奶
3:poll的方式:奶奶陪小宝宝一会儿,然后忙其他的事情,奶奶陪小宝宝的时候小宝宝叫醒了奶奶,或者奶奶在忙的时候叫醒了奶奶
4:异步通知方式:小宝宝醒来了以后自己走到奶奶那边,这个小宝宝已经长大了哈
异常和中断不一样:
CPU在运行的过程中,也会被各种“异常”打断。这些“异常”有:
①指令未定义
②指令、数据访问有问题
③SWI(软中断)
④快中断
⑤中断
1:中断源
中断源可以很多:按键,uart(串口),定时器
有一些中断源可以不关心,就像是奶奶陪小宝宝睡觉的时候如果外面的有猫叫了,那么是可以胡略的
2:初始化
中断源 -》 中断控制器 -》cpu
设置中断源,让它可以产生中断
设置中断控制器,设置中断源的优先级
设置cpu开关(使能中断)
3:中断处理的流程
正常程序
3。3:出发中断-》中断控制器-》cpu处理异常
3。4 cpu每次处理完一条指令以后都会查看是否有异常/中断
3。5 cpu发现有异常/中断就会开始处理
对于不同的异常会有不同的处理,回调转到不同的地址执行
这个地址上面会有一条跳转指令,不同的异常会跳转到不同的指令,跳到某个执行函数,这个就是异常向量
3。3,3。4,3。5 是硬件执行来的
函数做的事情
保存现场
去执行中断,分辨不同的异常,然后执行不同的处理函数
然后回到现场,恢复现场,就像是android onrestorestate
4:异常向量
异常向量表,我们可以在driver 的
异常向量表
u-boot或是Linux内核,都有类似如下的代码:
_start: b
reset
ldrpc, _undefined_instruction
ldrpc, _software_interrupt
ldrpc, _prefetch_abort
ldrpc, _data_abort
ldrpc, _not_used
ldrpc, _irq //
发生中断时,
CPU
跳到这个地址执行该指令
**
假设地址为0x18**ldrpc, _fiq这就是异常向量表,每一条指令对应一种异常。
发生复位时,CPU就去执行第1条指令:b reset。发生中断时,CPU就去执行“dr pc, _irq”这条指令。这些指令存放的位置是固定的,比如对于ARM9芯片中断向量的地址是0x18。当发生中断时,CPU就强制跳去执行0x18处的代码。在向量表里,一般都是放置一条跳转指令,