1.WINDOWS下的ARM编程的集成环境有两种。一种使用ARM CC编程的。其汇编语言采用ARM公司规定的标准。使用其的集成环境有ADS/RealView/Keil C 等,一般与其集成的硬件调试器有 简易的并口JTAG调试,或基于USB的JLINK调试器。在硬件调试和集成环境起中介的调试软件有 H-jtag/Jlink-RDI.
另外一大体系结构是采用 arm-elf-gcc 来编译程序。其汇编直接采用gnu汇编。使用的集成环境有Eclipse.与其集成的硬件调试器有openJtag.在集成环境与硬件调试器与中介作用的是openOCD这样调试软件。
后者的一大优点,在LINUX/WINDOWS多个平台都能用使用,而且汇编与LINUX内核,u-boot 一样的格式。还是很有优点的。
关于Eclipse 的安装参见我的文章()
这里重点在于openOCD/openJtag的安装,以及与Eclipse 的集成。
openJtag 安装
openJtag 是一个基于USB的硬件调试器,因此安装时,主要安装驱动。
openOCD安装
openOCD是一个开源的调试软件。使用它首先安装
openOCD本身(openocd-r717-20080619.exe)
arm-elf-gcc/arm-elf-gdb /newlib(02.yagarto-bu-2.18_gcc-4.2.2-c-c++_nl-1.16.0_gi-6.8.50_20080408.exe)
make 工具(03.yagarto-tools-20070303-setup.exe)
OpenOCD的配置
这里以用得最多的S3C2440来作处理.将装门配置的openjtag.cfg.拷入openOCD的安装目录
interface目录下,改名为openocd.cfg
将其拷入target目录下,改名为samsung_2440.cfg.
在cmd窗口下,在某一个目录运行openocd-ftd2xx 即运行openocd,它会在当前目录查找openocd.cfg .通常配置如下.
gdb_port 3333 interface ft2232 jtag_speed 0 ft2232_vid_pid 0x1457 0x5118 ft2232_layout "jtagkey_prototype_v1" reset_config trst_and_srst jtag_device 4 0x1 0xf 0xe daemon_startup attach target arm920t little reset_run 0 arm920t arm7_9 fast_memory_access enable working_area 0 0x200000 0x4000 backup #flash bank cfi 0 0x100000 2 2 0 #debug_level 3 nand device s3c2440 0 run_and_halt_time 0 5000 ft2232_device_desc "USB<=>JTAG&RS232 A" |
运行后,它将提示
D:\workspace\openjtag>openocd-ftd2xx Open On-Chip Debugger (2008-06-19 19:00) svn: 717 URL: http://svn./svnroot/repos/openocd/trunk Info: options.c:50 configuration_output_handler(): jtag_speed: 0, 0 Info: options.c:50 configuration_output_handler(): Open On-Chip Debugger (200 8-06-19 19:00) svn: 717 Info: options.c:50 configuration_output_handler(): fast memory access is enab led Info: jtag.c:1389 jtag_examine_chain(): JTAG device found: 0x0032409d (Manufa cturer: 0x04e, Part: 0x0324, Version: 0x0) |
如果是这个提示,表示openjtag正常工作,并与PC机联接成功
这时可以在另一个cmd窗口运行 telnet 127.0.0.1 4444 ,它将通过本机回环网络与硬件建立联系
正常工作,应该提示
这样进你可以发送openocd的各种命令来操作硬件.
常见命令有
poll :常见状态 runing ,表示系统已经上电运行程序.
halted,系统程序处于中断状态.在Openocd进行调试时,需要进入这个状态,这样防止内存的程序与openocd冲突.
halt : 进入halted 状态.
基本测试试验:leds
下面是用Nand Flash 启动时,用来查看一些测试及结果,S3C24X0 有一个4K内部内存(注意不是SDRAM),这个三星为解决Nand Flash 无法直接启动.而专门设计的.如果程序不大于4K,可以直接放入到这个段内存里.
在Nand Flash 的模式下.这个内存被映射到0x0上,在Nor Flash 启动,0x0是Nor Flash 的空间,这段地址被映射到0x40000000.下面就是用Nand Flash 启动测试一些命令
Open On-Chip Debugger > poll target state: running > mdw 0x0 target not halted Failure examining memory > halt target state: halted target halted in ARM state due to debug request, current mode: Undefined cpsr: 0xa00000db pc: 0x00000260 MMU: disabled, D-Cache: disabled, I-Cache: disabled > mdw 0x0 0x00000000: ea00000b > mww 0x0 0x12345678 > mdw 0x0 0x00000000: 12345678 > armv4_5 reg r0: 000000d4 r0: 000000d4 r0: 000000d4 r0: 000000d4 r0: 000000d4 r0: 000000d4 r1: 33f000d4 r1: 33f000d4 r1: 33f000d4 r1: 33f000d4 r1: 33f000d4 r1: 33f000d4 r2: 00000330 r2: 00000330 r2: 00000330 r2: 00000330 r2: 00000330 r2: 00000330 r3: 000000d3 r3: 000000d3 r3: 000000d3 r3: 000000d3 r3: 000000d3 r3: 000000d3 r4: e0411000 r4: e0411000 r4: e0411000 r4: e0411000 r4: e0411000 r4: e0411000 r5: 4e00000c r5: 4e00000c r5: 4e00000c r5: 4e00000c r5: 4e00000c r5: 4e00000c r6: 4e000020 r6: 4e000020 r6: 4e000020 r6: 4e000020 r6: 4e000020 r6: 4e000020 r7: 33f01200 r7: 33f01200 r7: 33f01200 r7: 33f01200 r7: 33f01200 r7: 33f01200 r8: 00020000 r8_fiq: 6df3be5a r8: 00020000 r8: 00020000 r8: 00020000 r8: 00020000 r9: f6feafff r9_fiq: 3bf0cfff r9: f6feafff r9: f6feafff r9: f6feafff r9: f6feafff r10: 000000c8 r10_fiq: bbb536ff r10: 000000c8 r10: 000000c8 r10: 000000c8 r10: 000000c8 r11: 00000000 r11_fiq: dfffdf29 r11: 00000000 r11: 00000000 r11: 00000000 r11: 00000000 r12: ea00000b r12_fiq: e6ff736b r12: ea00000b r12: ea00000b r12: ea00000b r12: ea00000b r13_usr: ff4decfb r13_fiq: 77e71bff r13_irq: febfffff r13_svc: 33deffe4 r13 _abt: 497fb6fd r13_und: 33defffc lr_usr: e7fff7df lr_fiq: f7dffb9e lr_irq: ffdff7ef lr_svc: 000005d4 lr _abt: dff0eedf lr_und: 000005d4 pc: 00000260 pc: 00000260 pc: 00000260 pc: 00000260 pc: 00000260 pc: 00000260 cpsr: a00000db spsr_fiq: 80000010 spsr_irq: 00000032 spsr_svc: f00000ff spsr _abt: 00000013 spsr_und: 800000d3 > |
测试leds小程序
直接在项目目录执行编译make 进行编译
D:\workspace\openjtag\leds>make arm-elf-gcc -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding -c -o crt0.o crt0.S arm-elf-gcc -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding -c -o leds.o leds.c arm-elf-ld -Tleds.lds crt0.o leds.o -o leds_elf arm-elf-objcopy -O binary -S leds_elf leds.bin arm-elf-objdump -D -m arm leds_elf > leds.dis |
下载程序,在openocd下执行load_image和resume命令.可以下载小程序
> load_image leds\leds_elf 172 byte written at address 0x00000000 downloaded 172 byte in 0.000000s > resume 0x0 > halt target state: halted target halted in ARM state due to debug request, current mode: Undefined cpsr: 0x200000db pc: 0x00000038 MMU: disabled, D-Cache: disabled, I-Cache: disabled |
load_image 把编译后的文件elf 文件,根据文件头的信息,放入0x0地址,resume 0x0,从0x0地址执行程序,这时板上的leds会以走马灯的形式执行运行,halt 将程序暂停。
如果是bin文件(即没有ELF头)则要指定装载地址,用如下命令
load_image leds\leds.bin 0x0
注意本程序执行前提是CPU处于halted状态,并且MMU和D-Cache被禁止(这样程序才能直接操作物理地址),手动关掉MMU和D-Cache的方法,可以通过设置ARM的状态寄存器来完成。在ARM9系列采用如下命令 arm920t cp15 2 0
openocd调试命令
一个调试器必须要有常用的调试功能,才能调出复杂程序。如设断点,单步运行,查看变量值等。openocd 有常用的调试功能。调试时,需要被调试程序要有调试信息,即编译时需要-g参数。
- halt:暂停程序执行
- resume 恢复程序运行
- arm7_9 sw_bkpts enable ARM7/9软件断点生效
- bp 查看断点
- bp <断点地址> <指令宽度> 在断点地址设置断点
- rbp <断点地址> 删除某个地址的断点
- step 按机器指令单步执行。
用机器地址来操作断点,是比较麻烦的事情,一般开发需要是源码级的断点,即在源码里设断点。并能单步调试。这时就需要命令行的arm-elf-gdb,更加界面友好的Eclipse 来操作。
opencd 下载u-boot。
当CPU上电时,只有4K的内部内存供程序使用。但是如果要运行更大一点复杂程序。则需要外部的更大的SDRAM来支持了。外部的SDRAM要正常工作,必须要软件来设置相关寄存器。必须要先运行一小段程序先来初始化(包括SDRAM的初始化)。这个程序都是放在0x0地址上,大部分嵌入式CPU,会把这个地址映射到Nor Flash 上。这样CPU可以从Nor Flash 空间直接运行初始化程序。但这样有时比较麻烦,因为意味着你要首先把程序烧录到Nor Flash上,当程序有调整时,又要重复这样操作,费时也增加Flash 的损耗。
因此在S3C24X0还有一种选择,可以利用CPU自动初始化的4K空间。这样这个小程序直接下载这个段空间初始化SDRAM后,更大程序就可以运行了。
openjtag 提供了一个现成的init.bin,里面包含SDRAM初始化代码。当Nor Flash 启动模式时,内部内存被映射成 0x40000000,这样用下列命令来初始化
halt load_image init\init.bin 0x40000000 resume |
如果是Nand Flash 启动模式
halt load_image init\init.bin 0x0 resume |
这样按照S3C24X0的内存规则,0x30000000后64M的空间将是SDRAM空间。大程序将会下载这个地址来运行。
我们以u-boot来看看怎么样运行,(关于u-boot的信息,参见我的文章)
注意下载地址(0x33f80000),是u-boot链接时指定的地址。这里是加载到第二个SDRAM,把第一块SDRAM的空间留给测试程序.所以加载是要使用
halt load_image u-boot\u-boot.bin 0x33f80000 resume |
这时从串口,应该看到串口有输出。并且中进入u-boot shell当中。这样可以在u-boot运行更加复杂的Shell程序。
熟悉U-boot操作的开发者知道,这样可以利用u-boot初始的化的网络驱动接口和USB接口,可以通过网络TFTP下载,或USB下载。这样大大加快开发速度。
Eclipse 下与openjtag配合
|