9 中断体系结构
9.1 ARM中断体系
ARM CPU工作模式和状态
- 工作模式,7种,1种用户模式,其他6选中特权模式
- usr 用户模式,ARM处理器正常的工作模式
- fiq 快速中断模式,高速数据传输或者通道处理
- irq 中断模式,通用中断处理
- svc 管理模式,操作系统使用的保护模式
- abt 数据访问终止模式,数据或指令预取终止时进入该模式,用于虚拟存储及存储保护
- sys 系统模式,运行具有特权的操作系统任务
- und 未定义指令终止模式,未定义的指令得到执行的时候进入该模式,可用于支持硬件协处理器的软件仿真
大多数程序运行于用户模式,进入特权模式是为了处理中断、异常,或者访问被保护的系统资源。
- 工作状态,2种
- ARM状态,处理器执行32位的ARM指令
- Thumb状态,处理器执行16位的Thumb指令
CPU一上电就处于ARM状态,无需关心CPU状态。
- 寄存器
- 同一时刻可见的寄存器有17个
- r0 - r12
- r13 sp
- r14 lr
- r15 PC
- 不同模式下并不会复用所有的寄存器
- fiq r8 - r14 是独立的
- svc,abt,irq,und r13, r14 是独立的
- fiq,svc,abt,irq,und SPSR是独立的
- CPSR各位含义,详见CPSR
- N 结果是否为负数
- Z 运算结果是否为0
- C 进位/错位/移位溢出
- V 溢出
- I,F IRQ中断禁止,FIQ中断禁止
- T Thumb状态
- mode CPU当前工作模式
- 同一时刻可见的寄存器有17个
异常进入和返回流程
- 异常进入
- 异常工作模式下的lr保存进入前的下一个指令地址
- CPSR复制到SPSR
- 设置CPSR到当前异常的工作模式
- 设置PC到这个异常的异常向量表入口地址
- 异常返回
- 异常模式下的LR,减去适当的值,设置到PC
- SPSR的值恢复到CPSR
中断处理过程
- 中断控制器汇集各类外设发出的中断信号,通知CPU
- CPU保存当前程序运行环境,调用中断服务程序ISR来处理这些中断
- ISR中通过读取中断控制器、外设的相关寄存器识别中断源,进行相应处理
- 清除中断,读写中断控制器和外设寄存器
- 恢复被打断的程序
2440中断处理流程
- 中断源
- 含有自子中断的中断源,上图可以看到,子中断先过一遍mask,再设置SRCPND
- 不含有子中断的中断源,直接设置SRCPND
- 中断屏蔽
- 子中断先经过INTSUBMASK判断
- 不含有子中断和经过判断的子中断,再过一遍INTMASK
- 优先级
- 如果是FIQ,INTMOD是1,不用经过优先级选择,直接执行。FIQ只能分配一个。
- 如果是IRQ,需要经过优先级选择,最高优先级的中断,被设置到INTPND
- 中断执行
- ISR(中断处理程序)读INTPND或者INTOFFSET确定中断源
9.2 2440中断控制寄存器
SUBSRCPND
- 2440有15个子中断源,能看到分为5组,分别是这5个中断的子中断
- INT_WDT_AC97 看门狗
- INT_CAM 摄像头
- INT_ADC 触摸板
- INT_UART0, UART1, UART2 串口
- 发生中断的时候相应的位被自动设置成1
- 想要清除的话,需要再写入对应位置的1,请注意不是清零,是写1
INTSUBPND
某位被置1的时候,对应中断被屏蔽
SRCPND
处于pending状态的中断源。
来源有两类,参考上文,带有子中断的,和不带有子中断的。
清除某一位,需要对某一位写1而不是清0.