一、内核中断方式
- 查询方式:简单,但是累
- 休眠-唤醒:不累,但是休眠干不了活了
- poll方式:要浪费点时间,但是可以继续干活
- 异步通知:妈妈、小孩互不耽误
1.1 嵌入式系统的情况
CPU运行过程中有多种中断源,汇集到中断控制器,由中断控制器选择优先级最高的中断并通知CPU。
比如:① 按键、② 定时器、③ ADC转换完成、④ UART发送完数据、收到数据、⑤ 等等
CPU在运行的过程中,也会被各种“异常”打断。这些“异常”有:
① 指令未定义、② 指令、数据访问有问题、③ SWI(软中断)、④ 快中断、⑤ 中断
1.2 中断的处理流程
arm对异常(中断)的处理过程:
- 初始化
- 设置中断源,让它可以产生中断
- 设置中断控制器(可以屏蔽某个中断,优先级)
- 设置CPU总开关(使能中断)
- 执行其他程序:正常程序
- 产生中断:比如按下按键—>中断控制器—>CPU
- CPU 每执行完一条指令都会检查有无中断/异常产生
- CPU发现有中断/异常产生,开始处理。
- 软件:保存现场(各种寄存器)、处理异常(中断)、恢复现场
1.3 异常向量表
u-boot或是Linux内核,都有类似如下的代码:
_start: b reset //发生复位时,CPU就去 执行第1条指令: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
这些指令存放的位置是固定的,比如对于ARM9芯片中断向量的地址是0x18。
当发生中断时,CPU就强制跳去执行0x18处的代码。
在向量表里,一般都是放置一条跳转指令,发生该异常时,CPU就会执行向量表中的跳转指令,去调用更复杂的函数