linux 中断处理流程

tech2024-12-26  16

奶奶带小孩的案例

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处的代码。在向量表里,一般都是放置一条跳转指令,

 

 

最新回复(0)