Eclipse在线调试ARM11——Tiny6410+OpenJTAG

来源:互联网 发布:服装et软件cad 编辑:程序博客网 时间:2024/05/22 14:13

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),编写如下代码:

.extern Main .global _start _start: ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 ldr r0, =0x7E004000mov r1, #0str r1, [r0]ldr sp, =8*1024bl Mainhalt:b halt

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

void delay(int times){volatile int i;for(i = 0; i != times; ++i){;}}void Main(){volatile unsigned long* gpkcon0 = (volatile unsigned long*)0x7F008804;volatile unsigned long* gpkdat = (volatile unsigned long*)0x7F008808;int i = 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.binleds.bin: start.o main.oarm-elf-ld -Ttext 0 -o leds.elf start.o main.oarm-elf-objcopy -O binary leds.elf leds.binarm-elf-objdump -D leds.elf > leds.disstart.o : start.Sarm-elf-gcc -g -o start.o start.S -cmain.o : main.carm-elf-gcc -g -o main.o main.c -cclean:rm *.o leds.elf leds.bin leds.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初始化文件可以这样写:

target remote 127.0.0.1:3333monitor halt# 这两条命令是关MMUmonitor arm mcr 15 0 1 0 0 0monitor step 0对于第二种情况可以这样写:target remote 127.0.0.1:3333monitor halt# 这两条命令是关MMUmonitor arm mcr 15 0 1 0 0 0monitor step 0echo Configuring system...\n# 下载init.bin到片内内存,目的是初始化DDRmonitor load_image D:/Working/arm/init/init.bin 0x0c000000# 运行monitor resume 0x0c000000# 停止monitor halt# 等待停止monitor wait_halt


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

第二种跟第一种的不同在于第二种情况需要将init.bin文件烧写到Steppingtone来初始化Tiny6410的DDR。init.bin及其工程可以在这里下载,适用于所有支持OpenJTAG的S3C6410开发板:


另外,配置好这些后还需要配置调试环境的Commands选项,对于第一种情况,可以如下填写:

对于第二种情况,则可以这样写:

第一个里面写有reset和halt的原因是锁相环不能重复初始化,如果程序中对锁相环进行了设置reset之后就会失效,这样每次调试都会执行reset,后一次的设置就不会受前一次的影响。对于第二中情况里面没有加reset是因为代码要写到DDR中进行调试,reset之后init.bin的初始化作用失效,调试时无法烧写代码到DDR,进而无法进行调试。所以第二种情况下被调试的代码应该判断自己的位置,可以模拟u-boot,检测到代码在DDR中运行时跳过lowlevel_init。

通过上面这些分析,我们应该了解了OpenJTAG的调试原理,现在总结一下,使用OpenJTAG在线调试Tiny6410时应该按照以下步骤进行:

(1)启动OpenOCD,连接OpenOCD到开发板,然后在telnet中执行halt,将目标机挂起。

注意:默认状态下,OpenOCD自带配置文件的JTAG时钟频率是6000,对于某些开发板来说这个工作频率太高,经过测试Tiny6410的JTAG时钟频率为1000时最佳。

(2)创建Eclipse,编码代码并编译。

注意:代码编译时应该启用-g选项,这样生成的ELF文件才会带有调试信息,如果不加-g则没有调试信息,无法调试。

(3)按照前面的贴图,配置Eclipse调试选项。Commands的break _start是指对_start下断点,当然可以改成其他函数。

(4)进行调试。

好了,到这里OpenJTAG调试Tiny6410的全部工作已经完成,这时你已经可以顺利的进行Tiny6410的单步调试了,起始这里讲述的调试原理适用于所有支持OpenJTAG的S3C6410开发板,所以如果调试其他开发板也可以按照以上分析进行操作,下面是单步调试的贴图,作为真相吧!


最后,提几个需要注意的问题:

(1)在编写Makefile时应该注意添加-g选项,否则elf文件中没有调试信息,无法进行调试

(2)在编写Makefile时不应使用-O优化选项,优化后的代码跟原代码失去了对应关系,调试时跳转错乱。

(3)调试uboot或者内核时需要根据具体的要求修正openjtag.cfg中的频率。

(4)OpenJTAG下载程序时应该使用OpenOCD而不应该使用oflash,如果是用oflash需要将dbgsel引脚拉高,强烈建议直接使用OpenOCD指令进行烧写。对于TQ2440或者MINI2440可以直接使用oflash烧写程序。

原创粉丝点击