完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
韦老师您好,我在看您的代码lcd的head.S有以下疑惑,还望您指点
mov r2, #16*1024 @ 3. 复制长度 = 16K,对于本实验,这是足够了 bl CopyCode2SDRAM @ 调用C函数CopyCode2SDRAM bl clean_bss @ 清除bss段,未初始化或初值为0的全局/静态变量保存在bss段 msr cpsr_c, #0xd2 @ 进入中断模式 ldr sp, =0x31000000 @ 设置中断模式栈指针 msr cpsr_c, #0xdf @ 进入系统模式 ldr sp, =0x34000000 @ 设置系统模式栈指针, ldr lr, =ret_initirq @ 设置返回地址 ldr pc, =init_irq @ 调用中断初始化函数 ret_initirq: msr cpsr_c, #0x5f @ 设置I-bit=0,开IRQ中断 ldr lr, =halt_loop @ 设置返回地址 ldr pc, =main @ 调用main函数 halt_loop: b halt_loop HandleIRQ: sub lr, lr, #4 @ 计算返回地址 stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器 @ 注意,此时的sp是中断模式的sp @ 初始值是上面设置的4096 ldr lr, =int_return @ 设置调用IRQ_Handle函数后的返回地址 ldr pc, =IRQ_Handle @ 调用中断分发函数,在interrupt.c中 int_return: ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr 问题来源: 当程序执行到这里 msr cpsr_c, #0xd2 @ 进入中断模式 ldr sp, =0x31000000 @ 设置中断模式栈指针 msr cpsr_c, #0xdf @ 进入系统模式 ldr sp, =0x34000000 @ 设置系统模式栈指针。 进入中断模式,给中断设置堆栈,当执行完ldr sp, =0x31000000后,便给中断模式分配了堆栈空间以便中断使用,然后执行msr cpsr_c, #0xdf,使CPU进入系统模式,给系统模式分配堆栈在0x34000000处 问题1:在进入中断模式前,CPU是处于管理模式,当执行完msr cpsr_c, #0xd2与 msr cpsr_c, #0xdf后,分别进入中断模式和系统模式,但在执行完ldr sp, =0x34000000 后即完成了堆栈的设置,但这时为什么不设置cpsr_c寄存器,使CPU返回到进入中断模式之前的管理模式呢? 问题2: 在本程序中为什么只设置中断模式与系统模式的栈指针?在这里设置的栈指针在什么时候会用到? |
|
相关推荐
3个回答
|
|
回复 2楼thisway.diy的帖子
谢谢老师的回答,我这还有点不明白,这样一来,是不是必须回到设置中断模式与系统模式之前的管理模式才能正常运行,也就是在 msr cpsr_c, #0xd2 @ 进入中断模式 ldr sp, =0x31000000 @ 设置中断模式栈指针 msr cpsr_c, #0xdf @ 进入系统模式 ldr sp, =0x34000000 @ 设置系统模式栈指针, 后加上msr cpsr_c,#d3这条指令呢? 如果不加这条指令会是什么样的结果? 谢谢! |
|
|
|
1. 是不是必须回到设置中断模式与系统模式之前的管理模式才能正常运行: 没有啊,我的程序里并没有回到管理模式
2. 必须离开中断模式,至于是用系统模式还是管理模式,无所谓 |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2160 浏览 6 评论
1968 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4523 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 12:04 , Processed in 0.691250 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号