微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM简单启动代码及中断处理分析

ARM简单启动代码及中断处理分析

时间:11-24 来源:互联网 点击:

bl init_irq //分析同上

msr cpsr_c,# 0x5f //开中断,即允许普通中断IRQ

ldr lr,=halt_loop //这个也很有意思,在这里为什么不直接用 bl main代替这两条命令呢,因 //为。。。。。想嘚瑟一下(玩笑了),主要是想学习另外一种常见常用的跳转方 //法。BL命令很好用,但是有缺点,就是跳转的范围,因为它只能跳转区区32MB, //换算成ARM的命令,也就只有8M的地址(因为一条命令4个字节),也就 //是-4MB~+4MB,所以范围有限,而嵌入式程序,尤其是有操作系统时,程序存放地 //址跨度比较大,所以呢,需要有一个长跳转指令,所以就引出了LDR命令,这个命 //令的跳转范围是4G,所以知道为什么LDR长用了吧,因为无论地址在哪,它都能跳 //到,跳转范围大是LDR命令的优点,但是它也有缺点,就是它负责跳转,不能保存 //PC,如果在跳转前不往LR中放返回地址,就会出现,跳到了子程序的位置,子程序 //执行完后,跳不回来了,所以如果使用ldr调用子程序,一定要在调用前给LR一个 //返回地址。

ldr pc,=main

halt_loop:

b halt_loop //main函数的返回地址,或者说是返回操作,让CPU原地踏步

HandlerIRQ:

sub lr,lr,# 4 //这条指令用于计算中断处理完毕后的返回地址,在这里有个隐含的地方,即当发生中 //断时,处理器会自动的向LR寄存器中存放被中断指令的地址加4,或者也可以理解成,

//存放的是PC的值,而PC的值是当前运行命令地址加8,虽然发生了中断,但是CPU仍然会 //运行完当前命令后才去处理中断,所以LR-4的值,正是被中断指令的下一条命令,当中 //断处理完毕以后,返回到被中断指令的下一条指令进行执行。

stmdb sp!,{r0-r12,lr} //入栈指令,表示将R0~R12,以及LR寄存器的内容入栈,这个命令格式暂不分析,具体的可以参考 //相关手册

ldr lr,=int_return //这两条命令的分析跟上面跳转到main函数原理是一样的,可以使用一条命令

//bl EINT_Handle代替,因为这个程序本身并不大,不会超过4Kb

ldr pc,=EINT_Handle

int_return:

ldmia sp!,{r0-r12,pc}^ //出栈指令,跟上面的入栈指令相呼应,表示将sp对应的地址内容递增(因为ARM的堆栈式满递减 //形式)的依次存放到r0~r12,以及pc中,而且这个很有意思,按照顺序,sp即r13肯定不包括在 //内,所以到pc的时候,赋值的内容寄存器正好是LR,而LR已经在中断开头处理了,而且^表示将 //spsr的值复制到cpsr中,至此完成了中断的返回


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top