Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1640095
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: 嵌入式

2009-12-03 18:01:30

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:
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 ,它将通过本机回环网络与硬件建立联系
正常工作,应该提示
 
Open On-Chip Debugger
>
这样进你可以发送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配合
 
阅读(6518) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

a2755329382010-10-22 14:58:09

今天上网搜索,无意中发现了蓝点IT! 黄老师好!

chinaunix网友2010-08-20 21:04:53

楼主这篇文章是Windows 下OpenJtag+OpenOCD+Eclipse 集成环境安装,可是始终没有看到如何在eclipse下配置,能否给讲解一下?谢谢