完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
最近学习2440异常处理这一章的内容,编写好start.s文件后发现无法调用printf_cpsr()函数,原因是我的lds文件中start.o的地址在0x0000000,而min.o的地址位于0x30000000,这样要调用min.o中的printf_cpsr()函数时,使用bl或b命令是无法跳转这么长的距离;于是我使用了ldr pc,=printf_cpsr命令,但是调试时候发现start.s执行这条命令后跳转到printf_cpsr()函数执行但执行完后,函数不能返回start.s文件继续执行下面的内容,这该怎么办,另外2440硬件调试中lds文件都采用SECtiONS { firtst 0x00000000 : { start.o init.o nand.o }
second 0x30000000 : AT(4096) { main.o lib/libc.a } } 而不是: SECTIONS { . = 0x30000000; .text : { start.o init.o nand.o * (.text) } . = ALIGN(4); .rodata : { * (.rodata) } . = ALIGN(4); .data : { * (.data) } . = ALIGN(4); bss_start = .; .bss : { *(.bss) *(COMMON) } bss_end = .; } 开始文件start.s为: .text .global _start _start: ldr sp,=4096 @设置堆栈 bl disable_watch_dog @关看门狗 bl clock_init @设置时钟 bl memsetup @设置内存 bl nand_init ldr r0,=0x30000000 @1.SDRAM目标地址 mov r1,#4096 @2.源地址 mov r2,#0x4000 @3.复制文件大小 bl nand_read bl on_ddr on_ddr: ldr lr,=hello_ret ldr pc,=hello //执行打印hello函数 ,此时调用出错
cpsr20170112.zip
(234.19 KB, 下载次数: 0
)
hello_ret: ldr sp, =0x34000000 @ ÉèÖÃÕ»Ö¸Õë ldr lr, =halt_loop @ ÉèÖ÷µ»ØµØÖ· ldr pc, =main @ µ÷ÓÃmainº¯Êý halt_loop: b halt_loop 后一直编写方法是将整个程序全部链接到一个统一的目标地址,但是却无法运行程序,这是什么原因啊,求大神指点,多谢多谢! |
|
相关推荐
1 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
基于米尔MYC-LR3576开发板的实时视频识别系统设计与实现
304 浏览 0 评论
飞凌嵌入式ElfBoard-文件I/O的深入学习之阻塞I/O与非阻塞I/O
466 浏览 0 评论
大神们,想知道你们都用什么ide编程调试器? Arduino IDE?还是 e2studio ?还有其他吗?哪个好用呢
580 浏览 0 评论
865 浏览 0 评论
837 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-3 20:36 , Processed in 0.719035 second(s), Total 44, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2551