tq2440 MMU实验收获

2019-07-13 03:33发布

本实验根据《韦东山 嵌入式linux完全手册》进行. 主要参考资料:ARM920T Technical Reference Manual
1.刚开始的时候,直接把书中附带的源代码编译之后dnw到板子上了.结果发现led灯是常亮的,并不是源代码中实现的跑马灯.源代码中已经在GPBDAT = (~(i<<5))之前添加了wait()函数来减缓led变换的速度.但是好像这个wait函数并没有实现目的.看了下Makefile,原来arm-linux-gcc -Wall -O2 -c -o $@ $<当中启用了优化,把wait()这个函数直接优化掉了。 解决方案.关闭GCC优化;或者,将static inline void wait(unsigned long dly)修改为static inline void wait(volatile unsigned long dly).

2.为什么wait函数要用static inline修饰? inline只不过是个优化而已,跟宏函数比较相似.有没有对实验效果无明显影响
static才是关键.为什么要用static?因为head.S当中对pc的操作采用了明确的地址ldr pc, =0xB0004000来调用main函数
假如不添加static,程序无法正常运行. 假如在led.C将wait函数的实现代码移到main之后,去掉static,程序正常运行.
所以更方便的方法是使用ldr  pc,=main. 注意bl main(bl 指令范围的有效范围是前后32M)所以有可能超出范围.
经过此次实验,发现还有必要学习下编译以及C程序内部结构相关的知识.