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, =0x7E004000
- mov r1, #0
- str r1, [r0]
- ldr sp, =8*1024
- bl Main
- halt:
- 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.bin
- leds.bin: start.o main.o
- arm-elf-ld -Ttext 0 -o leds.elf start.o main.o
- arm-elf-objcopy -O binary leds.elf leds.bin
- arm-elf-objdump -D leds.elf > leds.dis
- start.o : start.S
- arm-elf-gcc -g -o start.o start.S -c
- main.o : main.c
- arm-elf-gcc -g -o main.o main.c -c
- clean:
- 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:3333
- monitor halt
- # 这两条命令是关MMU
- monitor arm mcr 15 0 1 0 0 0
- monitor step 0
- 对于第二种情况可以这样写:
- target remote 127.0.0.1:3333
- monitor halt
- # 这两条命令是关MMU
- monitor arm mcr 15 0 1 0 0 0
- monitor step 0
- echo Configuring system...
- # 下载init.bin到片内内存,目的是初始化DDR
- monitor 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烧写程序。
上一篇:S3C6410学习——MemoryMap
下一篇:Linux内核的Nand驱动流程分析
推荐阅读最新更新时间:2024-03-16 14:29