完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题如下
代码 //===================================================== // 问题1 //===================================================== msr cpsr_c, #0x53 @ 设置I-bit=0,开IRQ中断 管理模式 ldr lr, =halt_loop @ 设置返回地址 疑问1:这里的lr(既R14 是管理模式的R14) 这里不是一进入管理模式就自动 把PC(R15的值存入R14) 为什么重新设置为死循环(halt_loop)的地址 ldr pc, =main @ 调用main函数 halt_loop: b halt_loop //====================================================== // 问题2 //====================================================== 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 |
|
相关推荐
1个回答
|
|
关于问题1,我的理解是:设置halt_loop作为管理模式的返回地址,就像前面HandleUndef、HandleSWI、HandlePrefetchAbort等中断向量的处理方法一样,让程序如果进入了管理模式就让它停在管理模式中,后面的ldr pc, =main却指定程序进入main循环,不会再管理模式中运行了。将halt_loop相关的语句去掉后,程序一样运行,不会有影响(已经实验验证);
关于问题2我也是疑惑,进入中断模式后lr保存上次运行的pc寄存器的值,可中断模式下的lr寄存器最初的状态是在哪里确定的呢? |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2158 浏览 6 评论
1965 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4522 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 20:06 , Processed in 0.677499 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号