微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Eclipse在线调试ARM11——Tiny6410+OpenJTAG

Eclipse在线调试ARM11——Tiny6410+OpenJTAG

时间:11-28 来源:互联网 点击:
Eclipse、CDT、OpenJTAG驱动、工具链以及OpenOCD的安装这里就不多说了,请根据OpenJTAG附带光盘中的说明进行安装,这里是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),编写如下代码:

  1. .externMain
  2. .global_start
  3. _start:
  4. ldrr0,=0x70000000
  5. orrr0,r0,#0x13
  6. mcrp15,0,r0,c15,c2,4
  7. ldrr0,=0x7E004000
  8. movr1,#0
  9. strr1,[r0]
  10. ldrsp,=8*1024
  11. blMain
  12. halt:
  13. bhalt


新建文件main.c(File->New->Source File),编写如下代码:

  1. voiddelay(inttimes){
  2. volatileinti;
  3. for(i=0;i!=times;++i){
  4. ;
  5. }
  6. }
  7. voidMain(){
  8. volatileunsignedlong*gpkcon0=(volatileunsignedlong*)0x7F008804;
  9. volatileunsignedlong*gpkdat=(volatileunsignedlong*)0x7F008808;
  10. inti=0;
  11. *gpkcon0=(1<16)|(1<20)|(1<24)|(1<28);
  12. while(1){
  13. *gpkdat=~(i<4);
  14. if(++i==16)
  15. i=0;
  16. delay(10000);
  17. }
  18. }

新建文件Makefile(File->New->File from template),编写如下代码:

  1. all:leds.bin
  2. leds.bin:start.omain.o
  3. arm-elf-ld-Ttext0-oleds.elfstart.omain.o
  4. arm-elf-objcopy-Obinaryleds.elfleds.bin
  5. arm-elf-objdump-Dleds.elf>leds.dis
  6. start.o:start.S
  7. arm-elf-gcc-g-ostart.ostart.S-c
  8. main.o:main.c
  9. arm-elf-gcc-g-omain.omain.c-c
  10. clean:
  11. 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初始化文件可以这样写:

  1. targetremote127.0.0.1:3333
  2. monitorhalt
  3. #这两条命令是关MMU
  4. monitorarmmcr1501000
  5. monitorstep0
  6. 对于第二种情况可以这样写:
  7. targetremote127.0.0.1:3333
  8. monitorhalt
  9. #这两条命令是关MMU
  10. monitorarmmcr1501000
  11. monitorstep0
  12. echoConfiguringsystem...
  13. #下载init.bin到片内内存,目的是初始化DDR
  14. monitorload_imageD:/Working/arm/init/init.bin0x0c000000
  15. #运行
  16. monitorresume0x0c000000
  17. #停止
  18. monitorhalt
  19. #等待停止
  20. monitorwait_halt


其中“D:/Working/arm/init/init.bin”要根据您的具体情况进行改写。

第二种跟第一种的不同在于第二种情况需要将init.bin文件烧写到Steppingtone来初始化Tiny6410的

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

网站地图

Top