关键词:PEEDI JTAG,调试uClinux核,目标设置,中断点;
介绍:
这是一篇关于用PEEDI JTAG仿真器调试uClinux核和应用程序带GNU gdb/insight的应用介绍。
现在最流行的32位的高速ARM是基于允许Linux进入嵌入式装置的微控装置。这就是需要调试核以及应用变得重要的原因。尽管Linux是一个真正多进程的操作系统,它利用一个存储管理单元(MMU)来给每个过程一个单独的存储空间。但是低端的ARM核(ARM7)不具有存储管理单元,因此Linux的常规性性没有被应用。这里讲述的是uClinux,一种定向于微存储管理单元的CPU的Linux系统。尽管没有存储管理单元被应用,没有实际的存储空间是可利用的。这就意味着所有的过程都共享同样的存储空间,因而每个处理过程,每次都是下载到不同基地址,而这在被应用的时候都不知道。
为什么通过JTAG调试?
通过JTAG界面进行调试不需要监测器,像程序在目标上运行,因此是这是免打扰的,而且不占用目标资源。
平台和工具:
为了达到这篇应用介绍的目的,我会运用到:
uClinux 核v2.4
GNU工具链——gcc v2.95,gdb/insight v6.5.50
目标CPU——Atmel AT91C140
JTAG仿真器——PEEDI
备注:不要在v6.3前使用GNU gdb/Insight,这会破坏工作支持。
设置PEEDI
除了所有在目标配置文件中共同的设置之外,有另一个参数需要被设置——在uClinux核中init_task_union结构的基地址。这个结构包含所有当前在目标文件内运行的程序的列表。因此PEEDI可以显示它们。这个地址在运行uClinux核被得知,因为每次这个核被装载时都用同样的地址。它可能会从用nm gcc工具中获得,比如:
这里linux是uClinux elf格式的程序。现在我们可以在目标配置文件中设置地址了:
目标设置
三幅不同的程序已经在目标中程式化
——uboot——这是引导载入器
——linux核
——ROM文件系统程序
在简单的程序执行中,配置文件中的每段程序被描述成不同的FLASH部分,这种PEEDI闪存设置命令方式可被用作它们之间的转换。
在我们选择好所用的核之后我们可以执行程序了,然后选择和执行另外两段程序:
我们已经完成目标的执行,现在我们可以设置其它起始部分,这不需要初始化目标,因为这是引导载入器完成的,只有设置Embeddedlce存储器在软件断点模式下断开:
调试核
在调试核时你需要用调试信息编辑它:
1、 运行make config 或者make menuconfig
2、 确保Custtomize kernel Setting
3、 确保Customize Vendor/User Settings
4、 在核设置时,开启Full Symbolic/Source debugging support
5、 在用户设置时,开启build debugable libraries 和build debugable applications.
6、 保持整洁,保持数据执行保护。
备注:如果你只想调试uClinux应用程序而不包括核,那么不需要在调试信息时编译核。
我们用以下.gdbinit文件来更简便的调试:
在核已经建立之后你可以开始载入gdb/insight。
在.gdbinit文件之后,gdb会自动地连接PEEDI,然后我们可以载入程序。
开始uClinux核只需键入:
这时你已经进入了核,而且已经备份了。现在你可以断开调试,增加断点来调试你的编程。
调试应用
调试uClinux应用时,你需要首先准备这些应用:在应用的开始加入一个软件断点模式,这将会让程序在它开启时停在那儿。
再次编译应用,让ROMFS并编译它使得符合目标。
从闪存或者RAM中引导uClinux核。
你可以从你的系列控制台或者远程登录开始应用。
目标会在运行到(”.long 0xDFFFDFFF)行时停止。
gdb命令”info threads”给你.text,.data和.bss系列开始的信息,这对载入符号信息时是必要的。
Spar是我们关注的。现在我们知道程序的地址,我们需要而且我们可以载入需要被执行的带有正确的信息地址的文件:
(peedi)add-symbol-file spar.gdb 0xF64040-s.data 0xF4A004-s.bss 0xF53104
add symbol table from file”spar.gdb”at
.text_addr=0x64040
.data_addr=0xf4a004
.bss_addr=0xf53104
(y or n)y
Reading symbols from /home/spar/spar.gdb…done
从这点起你可以正常的在你需要的和调试的应用程序中设置断点。
记住目标执行时在其中的目标思路转换,因此如果你强制的停下它时,保证它会在执行调试时停止运行。由于这个原因,推荐在调试时在期望停止的点处设置断点来停止运行目标程序。
附录这是本文中用到的完整的PEEDI的目标配置文件。
;-------------------------------------------------------------------------- ; ; peedi.cfg ; --------- ; ; PEEDI target configuration file for AT91C140 microcontroller ; ; ; Ronetix ; ; Supported devices : Atmel AT91C140 ; ; Revision : 1.0 ; ; Date : Mai 28, 2006 ; ;--------------------------------------------------------------------------
;-------------------------------------------------------------------------- ; The following section contains licenses that are required for PEEDI ; to operate. ; ; These licenses must be filled before using this file. ; ; Example: ; [LICENSE] ; KEY = UPDATE_24MAY2007, 1111-1111-1111-1 ; KEY = ARM7, 2222-2222-2222-2 ; ; The minimum required licenses are provided when PEEDI is purchased ; and are printed on the bottom side of PEEDI. ;
[LICENSE] KEY = UPDATE_13SEP2006, 1111-1111-1111-1 KEY = ARM7_ARM9, 2222-2222-2222-2 KEY = GDB_REMOTE, 3333-3333-3333-3
[DEBUGGER] PROTOCOL = gdb_remote ; gdb remote REMOTE_PORT = 2000 ; TCP/IP port GDB_READ_INGNORE_TIME = 3000 ; time in ms
[TARGET] PLATFORM = ARM
[PLATFORM_ARM] JTAG_CHAIN = 4 ; list of IR lengths of all TAP in the JTAG chain JTAG_CLOCK = 10, 16000 ; JTAG Clock in [kHz] - 10kHz init; 16MHz normal work TRST_TYPE = PUSHPULL ; type of TRST output: OPENDRAIN or PUSHPULL RESET_TIME = 5 ; length of RESET pulse in ms CORE_STARTUP_MODE=RESET ; if RESET than no code is executed after reset CORE = ARM7TDMI ; TAP 0 is an ARM7TDMI CORE_BREAK_PATTERN = 0xDFFFDFFF ; software breakpoint pattern CORE_BREAKMODE = soft ; breakpoint mode: ; soft - software breakpiont ; hard - use hardware breakpoints instead of software
CORE_INIT=INIT_RUN ; use this section to debug kernel/allpication ; CORE_INIT=INIT_FLASH_PROGRAM ; use this init section to initialize the chip select CORE_FLASH0=FLASH_UBOOT CORE_FLASH1=FLASH_KERNEL CORE_FLASH2=FLASH_ROMFS
CORE_ENDIAN=little CORE_WORKSPACE_ADDR=0xFC000000 ; PEEDI: start address of workspace for flash programmer CORE0_WORKSPACE_LEN=0x2600 ; length of workspace in bytes
CORE_OS = ucLinux24, 0x10c000 ; init_task_union is at addr 0x10c000
[INIT_RUN] break add 0xFFFFFFFF go ;wait 6000 ;halt
[INIT_FLASH_PROGRAM] memory write 0xff004000 0x4000207d memory write 0xff004004 0x404020bd memory write 0xff004008 0x80000001 memory write 0xff00400C 0x80000001 memory write 0xff000000 0x000000 ; CPU_CLOCK=240MHz/6
[FLASH_UBOOT] CHIP=AT49BV6416 ACCESS_METHOD=AGENT CHECK_ID=YES CHIP_WIDTH=16 CHIP_COUNT=1 BASE_ADDR=0x40000000 FILE_NAME="tftp://192.168.3.1/uboot.bin" FILE_ADDR=0x40000000 FILE_FORMAT=BIN AUTO_ERASE=YES
[FLASH_KERNEL] CHIP=AT49BV6416 ACCESS_METHOD=AGENT CHECK_ID=YES CHIP_WIDTH=16 CHIP_COUNT=1 BASE_ADDR=0x40000000 FILE_NAME="tftp://192.168.3.1/linux.bin" FILE_ADDR=0x40010000 FILE_FORMAT=BIN AUTO_ERASE=YES
[FLASH_ROMFS] CHIP=AT49BV6416 ACCESS_METHOD=AGENT CHECK_ID=YES CHIP_WIDTH=16 CHIP_COUNT=1 BASE_ADDR=0x40000000 FILE_NAME="tftp://192.168.3.1/romdisk.bin" FILE_ADDR=0x401F0000 FILE_FORMAT=BIN AUTO_ERASE=YES
更多资料,请联系我们:
广州虹科电子 http://www.hkaco.com
吴工 020-38743030 wj@hkaco.com QQ:534807413 |
文章评论(0条评论)
登录后参与讨论