嵌入式ARM 中断 IRQ代码编写 基于S5pv210

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地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值