Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1319801
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-08-10 22:14:50

HandleIRQ: sub lr, lr, #4 @ 计算返回地址 stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器 @ 注意,此时的sp是中断模式的sp @ 初始值是上面设置的3072 ldr lr, =int_return @ 设置调用ISR即EINT_Handle函数后的返回地址 ldr pc, =EINT_Handle @ 调用中断服务函数,在interrupt.c中 int_return: ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr 如上程序,假如现在我已经进入了这个中断,然后保存现场,然后再调用 C 函数来处理一些应用,处理完,返回到这里,再退出中断!! 我想问一下,这条语句干嘛用的【 ldr lr, =int_return @ 设置调用ISR即EINT_Handle函数后的返回地址 】 它是设置 C函数的返回地址吗? 就是调用c ,完成后,通过 lr 来返回吗?? l
最佳答案
不同的编译器对C 函数的处理不同,如armcc和gcc就有很多不同,从你的代码来看,应该使用的是armcc编译器; 应注意到代码中涉及两次返回:函数返回和中断返回; 进入中断后,lr寄存器保存的是中断函数的返回地址,因此中断返回时出栈时将该返回地址赋给PC即可,这一点比较好理解; 但函数返回的问题比较复杂: 1.为什么不使用BL来调用C函数? 因为bl 指令跳转范围有限(好像4M左右吧),但bl指令可以将返回地址保存在lr中,当然,如果你的跳转范围不大,也可使用BL,则不需要ldr lr, =int_return 。 ;而“ldr pc, =EINT_Handle”跳转范围为4G,但不会保存返回地址。 2. C函数使用 ldr pc, lr来实现返回,所以lr应预先保存好返回地址,即ldr lr, =int_return
追问
就是说 ldr pc,lr ,这条语句我不需要写在程序里面,它调用完 C函数,自动实现这条语句? 是这样吗??
回答
是的,armcc是这么实现函数返回的,你可以看一下C函数的汇编代码就明白了。
2
回答时间:2011-3-1 16:35 | 

回答者:  | 采纳率:31%

擅长领域:   

参加的活动: 暂时没有参加的活动

提问者对于答案的评价:

很感激。我想加你为百度好友。感觉你好牛,崇拜!!

====

阅读(775) | 评论(0) | 转发(0) |
0

上一篇:异常处理的返回

下一篇:关于 PC指针问题

给主人留下些什么吧!~~