注意:如果点击空白处无法输入,则点击字会有输入提示符 | 则可以使用键盘进行输入!
此板块为 [
ARM裸机加强版]
- 问题所在章节:第11章通用异步收发器UART
- 发生问题的运行环境:LINUX系统,arm-Linux-gcc编译,硬件为JZ2440-V3
- 问题发生描述:学习完理论之后,我根据理解自己写了一套代码,经过很多曲折之后确实可以用,但是遇到了很奇怪的问题。
首先,是优化配置的问题,arm-linux-gcc有优化选项-O,不使用优化选项得到的反汇编结果为:
启动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程序中第一个子函数。换成别的函数好像也会引起死机。
本问题无错误信息
0
|