嵌入式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地址。