微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Eclipse开发调试ARM裸机程序(五)MMU调试

Eclipse开发调试ARM裸机程序(五)MMU调试

时间:11-19 来源:互联网 点击:
leds.c: 循环点亮4个LED* 属于第二部分程序,此时MMU已开启,使用虚拟地址*/ #define GPBCON (*(volatile unsigned long *)0xA0000010) // 物理地址0x56000010#define GPBDAT (*(volatile unsigned long *)0xA0000014) // 物理地址0x56000014#define GPB5_out (1<(5*2))#define GPB6_out (1<(6*2))#define GPB7_out (1<(7*2))#define GPB8_out (1<(8*2))/** wait函数加上“static inline”是有原因的,* 这样可以使得编译leds.c时,wait嵌入main中,编译结果中只有main一个函数。* 于是在连接时,main函数的地址就是由连接文件指定的运行时装载地址。* 而连接文件mmu.lds中,指定了leds.o的运行时装载地址为0xB4004000,* 这样,head.S中的“ldr pc, =0xB4004000”就是跳去执行main函数。** 加volatile的原因是mini2440上带的arm-linux-gcc 4.4.3 会将其优化掉* 造成看不到效果 只是全亮 加上volatile就不会优化掉了。*/static inline void wait(volatile unsigned long dly){for(; dly > 0; dly--);}int main(void){unsigned long i = 0;// 将LED1-4对应的GPB5/6/7/8四个引脚设为输出GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; while(1){wait(30000);GPBDAT = (~(i<5)); // 根据i的值,点亮LED1-4if(++i == 16)i = 0;}return 0;}
#Makefileobjs := head.o init.o leds.oall : mmu.binmmu.bin : $(objs)arm-linux-ld -Tmmu.lds -o mmu_elf $^arm-linux-objcopy -O binary -S mmu_elf $@arm-linux-objdump -D -m arm mmu_elf > mmu.dis%.o:%.carm-linux-gcc -g -Wall -O2 -c -o $@ $<%.o:%.Sarm-linux-gcc -g -Wall -O2 -c -o $@ $
/* mmu.lds* 这个不可以调试,会直接运行* */SECTIONS { firtst    0x00000000 : { head.o init.o }second    0xB0004000 : AT(2048) { leds.o }}/** 这个链接脚本可以调试led以前的程序* 到led就不看到效果的。现在没有能力达到两全其美的高度*//*ENTRY(_start)SECTIONS {. = 0x00000000;. = ALIGN(4);.text :{head.o     (.text)init.o     (.text)leds.o	   (.text)}}*/

对比的拷贝代码,结果是一样的,并且还知道了原来eclipse调试显示的内存也是虚拟地址。不过说是内部存储器地址。

从0x800处拷贝到了0xb0004000处,截图对比:


这也算第一次真真切切的接触MMU,韦东山讲的真好,很是透彻。链接脚本的问题没有解决,不能调试运行同兼得。

另外说说今天调试遇到的问题:调试时候出现的Program received signal SIGTRAP, Trace/breakpoint trap的错误。经过总结原因有2,1是编译时候没有加-g选项;2是链接脚本的问题(正如上边脚本中的注释,原理还不能解释)。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top