完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
注意:如果点击空白处无法输入,则点击字会有输入提示符 | 则可以使用键盘进行输入!
此板块为 [ARM裸机加强版]
启动main函数 1000: e1a0c00d mov ip, sp 1004: e92dd800 stmdb sp!, {fp, ip, lr, pc} 1008: e24cb004 sub fp, ip, #4 ; 0x4 100c: e24dd004 sub sp, sp, #4 ; 0x4 调用uart函数 1030: eb000028 bl 10d8 uart函数启动: 000010d8 10d8: e1a0c00d mov ip, sp 10dc: e92dd800 stmdb sp!, {fp, ip, lr, pc} 10e0: e24cb004 sub fp, ip, #4 ; 0x4 使用优化选项-O2后: 启动main函数: 1000: e92d4030 stmdb sp!, {r4, r5, lr} 调用uart函数 101c: eb000019 bl 1088 启动uart函数 (无压栈) 00001088 1088: e3a01456 mov r1, #1442840576 ; 0x56000000 108c: e3a03020 mov r3, #32 ; 0x20 1090: e5813054 str r3, [r1, #84] 1094: e3a0c205 mov ip, #1342177280 ; 0x50000000 在不使用优化选项-O的时候,编译得到的代码无法调用uart0_init函数。 只有使用优化选项之后才能调用。 我简单调试得到一个规律,当子函数一进入就进行压栈操作的时候(保存sp或者将变量压入内存) 就会引起程序死机,我认为是SDRAM工作比CPU慢 但是我检查了例程的代码,把例程中Makefile文件中的arm-linux-gcc中的-O2选项去除 得到的反汇编与本人写的也是相同的,但是例程中却可以正常调用uart0_init函数。 写成表格: 注:子函数开头压栈用的代码是long i = 65535; uart0_init()是c程序中第一个子函数。换成别的函数好像也会引起死机。
|
|
相关推荐
1个回答
|
|
解决了。。。是我访问了steppingstone外的地址。。
代码如下: copy_2ed_to_sdram: @copy 4KB from 4k to sdram mov r1, #4096 ldr r2, =SDRAM_BASE add r3, r1, #4096 但是很好奇为什么复制该地址还是有几率能成功执行呢。。 |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2166 浏览 6 评论
1975 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4531 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 16:40 , Processed in 0.540960 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号