嵌入式 | ARM中断异常
<div align=center>
<div align=center>
异常优先级:
<div align=center>
ARM处理器的异常空间:
<div align=center>
在所有异常的入口,IRQ 中断被屏蔽 ,只有重新被使能才可触发内核响应。(如:中断嵌套处理)
在 FIQ 和 Reset 异常的入口,FIQ中断被屏蔽。
ARM处理器响应异常的过程如下(只能在ARM状态下完成):
- CPSR寄存器的内容——复制——> SPSR_<mode>寄存器(对应模式下)
- 返回地址(PC值)——保存——> LR_<mode>寄存器(对应模式下)
- 对 CPSR 寄存器的一些控制位进行设置:
- 无论发生异常时处理器处于Thumb 状态还是ARM状态,响应异常后处理器都会切换到 ARM 状态,即CPSR[5]=0;
- 将模式位 CPSR[4:0]设置为被响应异常的模式编码;
- 设置中断屏蔽位:如果异常模式为Reset 或 FIQ 则
CPSR[6]=1 禁止快速中断
CPSR[7]=1 禁止正常中断
- 将程序计数器(PC)设置为异常向量的地址
从异常处理程序返回时(执行特定的异常返回指令,需注意对于复位异常不需要返回,只能在ARM状态下完成),处理器执行下列动作:
- SPSR_<mode>的内容——恢复——> CPSR;
- 将PC设置为LR_<mode> 的值
图解APM CPU进入IRQ异常模式:
<div align=center>
异常返回地址的纠正:(ARM7的三级流水线)
异常类型 | ARM指令下正确的返回地址 | 地址纠正的原因 |
---|---|---|
复位 | —— | 复位没有定义lr |
数据中止 | lr-8 | 发生异常的指令已执行,PC寄存器的值已更新,Lr值为下一条指令的下一条地址,但需指向导致数据中止异常的那条指令 |
FIQ | lr-4 | 发生异常的指令已执行,PC寄存器的值已更新,Lr值为下一条指令的下一条地址,且需FIQ处理程序的返回地址(发生异常的下一条) |
IRQ | lr-4 | 发生异常的指令已执行,PC寄存器的值已更新,Lr值为下一条指令的下一条地址,且需IRQ处理程序的返回地址(发生异常的下一条) |
指令预取中止 | lr-4 | 发生异常的指令未执行,PC寄存器的值未更新,Lr值为下一条指令的地址,但需指向导致预取指令中止异常的那条指令 |
SWI | lr | 发生异常的指令未执行,PC寄存器的值未更新,Lr值为下一条指令的地址,且需指向SWI指令的下一条指令 |
未定义指令 | lr | 发生异常的指令未执行,PC寄存器的值未更新,Lr值为下一条指令的地址,且需指向未定义指令的下一条指令 |
注意:
- 发生异常时的PC寄存器是否已更新,已更新,则Lr值为下一条指令的下一条地址;未更新,则Lr值为下一条指令的地址。
- 异常返回后被打断的当前指令是否还需要执行。
- 主要是受ARM处理器流水线的影响
例如:SWI常用中断返回方式:
MOVS PC,R14 ;更新PC值,加S表示将SPSR加载到CPSR
例如:FIQ和IRQ常用中断返回方式
SUBS PC,R14,#4 ;重新执行发生异常的指令
如果链接寄存器的内容被压入堆栈中保存,并且压栈前返回地址已经被矫正。
可用LDMFD sp!,{pc}^来表示。
LDMFD为数据出栈指令,
“!”表示改变sp的值,
“^”表示更新状态,将SPSR的值赋给CPSR。
注意:如果使用MOV指令,地址值必须是合法的ARM立即数(能够通过一个0~255范围内的数通过右循环偶数位得到)
以下特性能够让CPU Core能够尽快地响应FIQ中断:
- FIQ 向量在异常向量表的最后,这样使FIQ处理程序可以直接从FIQ向量处开始,省去了跳转的时间开销;
- FIQ 模式下有五个额外的寄存器 (r8_FIQ to r12_FIQ),对于这些寄存器在进入和推迟FIQ时无须保存和恢复,节省了时间;
ARM支持大端和小端的内存数据方式,可以通过硬件的方式设置(没有提供软件的方式)端模式。
小端是低位存低地址,大端是高位存低地址。
I/O端口编址方式:
<div align=center>
存储器映射编址 | I/O映射方式 | |
---|---|---|
优点 | •可采用丰富的内存操作指令访问I/O单元 •无需单独的I/O地址译码电路 •无需专用的I/O指令 | •I/O单元不占用内存空间 •I/O程序易读 |
缺点 | •外设占用内存空间 •I/O程序不易读 | I/O操作指令仅有单一的传送指令,I/O接口需有地址译码电路 |
举例 | ARM中,I/O端口与内存单元统一编址 | Intel 80X86系列,I/O端口与内存单元分开编址,I/O端口有自己独立的地址空间,其大小为64KB |