嵌入式ARM 中断 IRQ代码编写 基于S5pv210
2019-07-12 23:39发布
生成海报
ARM共有7种模式
IRQ是异常模式的一种。
IRQ 处理流程: 1)保护现场;
2)中断IRQ处理;
3)恢复现场;
首先:我们要知道几个重要的寄存器LR , PC , CPSR , SPSR .
LR
保存程序返回地址
PC
保存程序运行地址
CPSR
程序状态寄存器
SPSR
备份程序状态寄存器
那么我们程序都会做什么呢?
1.保护现场。假设开启ARM系统最先进入SVC模式,当发生IRQ后,会保存SVC模式下的必要寄存器R0-R12,既然需要保存数据,那么就需要栈SP寄存器,当我们执行完中断处理函数的时候需要返回,所以LR寄存器也需要保存,同时将SVC模式下的CPSR自动备份在IRQ模式下的SPSR中。
2.中断处理。 当发生IRQ时,所要执行的中断处理函数。
3.恢复现场。 当执行玩中断处理函数,将保存在SP中的数据恢复,并将1步中LR,给当前模式下的PC,将备份的SPSR,恢复到当前的CPSR中。
代码实现:
irq_handler:
sub lr,lr,#4
stmfd sp!,{r0-r12,lr} //保护现场
.weak do_irq
bl do_irq //跳转到中断处理函数
ldmfd sp!,{r0-r12,pc}^ //恢复现场
在代码之前一定要完成好栈的设置,很多人可能不理解sub lr,lr,#4 这句代码的意思!举个简单的例子:
这是一段汇编代码:

经过反汇编后:
位置0x0000_0048:
我们发下0x0000_0048位置上的数就是0x11111,这种方式叫做地址池,所以当前的位置减去立即数64,
十六进制就是0x0000_0040,当前PC的值是0X0000_0048-0X0000_0040。
PC=0X0000_0008,意思就是执行当前语句时,实际CPU已经执行第3条指令了,这就是指令流水。
然而我们要的返回的LR,是当前指令的下一句,所以-4,就是我们需要返回之后要执行的地址!
图:
所以要存当前-4地址。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮