Eclipse在线调试ARM11——Tiny6410+OpenJTAG
http://download.csdn.net/detail/girlkoo/4632348
1.工程的创建及编译
Eclipse配置完成后我们来创建一个工程,首先是启动Eclipse,Workspace可以根据自己的需要选择,接下进行工程创建,File->New->C Project,在Project Name中填写工程名称,可以根据自己的项目需求填写,这里我写为leds,在下方的Project type选择框中选择Makefile project->Empty Project,在Toolchains选择框中选择Other toolchain,然后点击Finish即可完成Tiny6410工程的创建,接下来我们编写代码,当然是leds灯的控制代码,因为Leds灯代码的例子多,容易懂,运行结果还可以在板子上直接看到,相当于学习编程时的Hello world。
新建文件start.S(File->New->File from template),编写如下代码:
- .externMain
- .global_start
- _start:
- ldrr0,=0x70000000
- orrr0,r0,#0x13
- mcrp15,0,r0,c15,c2,4
- ldrr0,=0x7E004000
- movr1,#0
- strr1,[r0]
- ldrsp,=8*1024
- blMain
- halt:
- bhalt
新建文件main.c(File->New->Source File),编写如下代码:
- voiddelay(inttimes){
- volatileinti;
- for(i=0;i!=times;++i){
- ;
- }
- }
- voidMain(){
- volatileunsignedlong*gpkcon0=(volatileunsignedlong*)0x7F008804;
- volatileunsignedlong*gpkdat=(volatileunsignedlong*)0x7F008808;
- inti=0;
- *gpkcon0=(1<16)|(1<20)|(1<24)|(1<28);
- while(1){
- *gpkdat=~(i<4);
- if(++i==16)
- i=0;
- delay(10000);
- }
- }
新建文件Makefile(File->New->File from template),编写如下代码:
- all:leds.bin
- leds.bin:start.omain.o
- arm-elf-ld-Ttext0-oleds.elfstart.omain.o
- arm-elf-objcopy-Obinaryleds.elfleds.bin
- arm-elf-objdump-Dleds.elf>leds.dis
- start.o:start.S
- arm-elf-gcc-g-ostart.ostart.S-c
- main.o:main.c
- arm-elf-gcc-g-omain.omain.c-c
- clean:
- rm*.oleds.elfleds.binleds.dis
然后就可以编译该工程了,在Project Explorer中选中该工程(这里是leds)右键并在菜单中选择Build Project即可编译该工程,如果需要清除编译产生的代码选择Clean Project即可,到这里已经完成了Tiny6410工程的编辑和编译工作。
2.Eclipse通过OpenJTAG在线调试Tiny6410
使用Eclipse在线调试Tiny6410实际上是使用gdb在线调试Tiny6410,Eclipse的调试模块是对GDB的封装。GDB在线调试实际上是GDB的远程调试,也就是说用GDB远程链接GDB Server进行远程调试,GDB远程调试的详细信息这里不多讲,可以自己网上搜索一下。远程调试时本机GDB从ELF文件中获取调试信息,这就是配置调试信息时设置的C/C++ Application是编译过程中生成的ELF文件而不会最终烧写到ARM上运行的BIN文件的原因。
GDB可以在本机的ELF文件上获取调试信息,但是单是这样还不够,还需要将对应的BIN文件烧写到目标机的内存中,这样进行通过GDB调试目标机时Eclipse将GDB下达调试指令转换成OpenOCD的指令,由OpenOCD通过OpenJTAG来操作硬件,这样,就是实现了GDB在本机下达调试指令,目标机相应的做出反应,也就是常说的单步调试。
由于GDB远程调试Tiny6410时需要将BIN文件下载到内存,所以
(1)如果代码在片内SRAM(Steppingstone)中运行
此时代码的连接地址为0且代码的体积小于Steppingstone的大小,对于Tiny6410来说代码的体积需要小于8KB,这种情况下无需目标机初始化,可以直接调试程序。
(2)如果代码在SDRAM、DDR或者其他存储设备中运行
此时代码的连接地址为0x50000000~0x5FFFFFFF之间,体积也有可能大于Steppingstone的容量,这时GDB调试前需要下载一个程序到Tiny6410来初始化其DDR,这样OpenOCD才能通过OpenJTAG来将目标程序烧写到DDR上。
因此,应该针对以上两种情况做不同处理,对于第一种情况,GDB初始化文件可以这样写:
- targetremote127.0.0.1:3333
- monitorhalt
- #这两条命令是关MMU
- monitorarmmcr1501000
- monitorstep0
- 对于第二种情况可以这样写:
- targetremote127.0.0.1:3333
- monitorhalt
- #这两条命令是关MMU
- monitorarmmcr1501000
- monitorstep0
- echoConfiguringsystem...
- #下载init.bin到片内内存,目的是初始化DDR
- monitorload_imageD:/Working/arm/init/init.bin0x0c000000
- #运行
- monitorresume0x0c000000
- #停止
- monitorhalt
- #等待停止
- monitorwait_halt
其中“D:/Working/arm/init/init.bin”要根据您的具体情况进行改写。
第二种跟第一种的不同在于第二种情况需要将init.bin文件烧写到Steppingtone来初始化Tiny6410的
Eclipse在线调试ARM11Tiny6410OpenJTA 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)