刚入手Jlink V8, 发现Eclispe调试Jlink的文章少之又少,经过我的实践,把一点心得分享给大家.
本文为原创,如有转帖,请注明出处!
准备工作:
1. Jlink+mini2440开发板,驱动程序安装完毕,接通电源,启动Jlink GDB Server
2. YAGARTO toolchain安装, 这个toolchain是基于GNU ARM的与Keil的ARM toolchain有一些区别,具体喜好看你选择哪个IDE了.下载地址http://yagarto.de/
3. Eclipse CDT安装.http://www.eclipse.org/downloads/
4. 配置Eclipse Zylin插件与YAGARTO toolchain结合(这个网上有专门文章,不再复述)
项目文件
(start.s,leds.c,makefile,link.lds)
1. start.s源文件
程序中标识符_start是GNU ARM默认入口. 还有关键的一点别忘了设置堆栈
ldr sp, = 1024* 4 @ 设置堆栈
/* * start. s * * Created on: 2010- 5- 8 * Author: Administrator * / @= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = @Led1- 4 对应于开发板上的 GPB5- 8管脚 @蜂鸣器 对应于开发板上的 GPB0管脚 @= = = = = = = = = = = = = = = = = @ I/O PORT for LED LED对应端口寄存器地址宏定义 @= = = = = = = = = = = = = = = = = . equ GPBCON , 0x56000010 @Port B control . equ GPBDAT , 0x56000014 @Port B data . equ GPBUP , 0x56000018 @Pull- up control B @= = = = = = = = = = = = = = = = = @ INTERRUPT 中断寄存器地址宏定义 @= = = = = = = = = = = = = = = = = . equ INTMSK , 0x4a000008 @Interrupt mask control . equ INTSUBMSK , 0x4a00001c @Interrupt sub mask @= = = = = = = = = = = = = = = = = @ WATCH DOG TIMER 看门狗寄存器地址宏定义 @= = = = = = = = = = = = = = = = = . equ WTCON , 0x53000000 @Watch- dog timer mode . global _start . extern main . text _start: @禁止看门狗@ disable watch dog ldr r0, = WTCON ldr r1, = 0x0 str r1, [ r0] @禁止所有中断@disable all interrupt ldr r0, = INTMSK ldr r1, = 0xffffffff str r1, [ r0] @禁止所有子中断@disable all sub interrupt ldr r0, = INTSUBMSK ldr r1, = 0x7fff str r1, [ r0] @将port B全部配置为输出@Configures the pins of port B as output ldr r0, = GPBCON ldr r1, = 0x155555 str r1, [ r0] @将port B管脚上拉@Enable Pull- up for port B ldr r0, = GPBUP ldr r1, = 0xffff str r1, [ r0] ldr sp, = 1024* 4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K 1: bl main @@call main( ) b 1b @@loop forever. . end
2. leds.c源文件
延时程序delay里的数值为粗略值,具体可以视板子频率而设定
# define rGPBCON ( * ( volatile unsigned * ) 0x56000010) //Port B control # define rGPBDAT ( * ( volatile unsigned * ) 0x56000014) //Port B data # define rGPBUP ( * ( volatile unsigned * ) 0x56000018) //Pull-up control B void delay( int dly) { unsigned long i; for ( ; dly > 0; dly- - ) { for ( i= 0; i< 100000; i+ + ) { } } } int main( void ) { int data; rGPBCON = 0x015400; rGPBUP = 0x7ff; while ( 1) { data = 0xeff; rGPBDAT = data; delay( 1) ; rGPBDAT = 0xf7f; delay( 1) ; rGPBDAT = 0xfbf; delay( 1) ; rGPBDAT = 0xfdf; delay( 1) ; } return 0; }
Makefile文件
objs : = leds. o start. o all: $( objs) arm- elf- ld - Tlink. lds start. 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 leds. o: leds. c arm- elf- gcc - Wall - Wstrict- prototypes - g - fomit- frame- pointer - ffreestanding - c - o leds. o leds. c start. o: start. s arm- elf- gcc - Wall - Wstrict- prototypes - g - fomit- frame- pointer - ffreestanding - c - o start. o start. s clean: rm - f leds. bin leds_elf leds. dis * . o
link.lds文件
载入位置为2440的内存地址SDRAM 0x30000000, 也可以修改为 0x0, 由于leds目标文件比较小,这样可以直接下载到SRAM运行(需要将开发板拨到NAND模式启动)
ENTRY( _start) SECTIONS { . = 0x3000000; . text : { * ( . text) } . rodata ALIGN ( 4) : {* ( . rodata) } . data ALIGN ( 4) : { * ( . data) } . bss ALIGN ( 4) : { * ( . bss) * ( COMMON) } }
调试过程
现在进入最关键的调试过程了, Eclipse Debug设置中Zylin Embedded debug页面GDB初始化语句的设置
可能是Jlink GDB Server的bug, 好多gdb命令都支持的不好,
初始化语句中添加了continue命令后无法进入debug状态
,我的初始化设置如图
初始化语句:
target remote localhost: 2331 load break _start
这种情况下需要在start.s或leds.c文件main函数中设置软断点,等GDB load完后,Eclipse切换到Debug视图下点击Resume按钮或者F8键启动调试. 如图:
结尾的话
在调试过程中发现单步调试Step Into(F5)碰到for循环延时时很容易跑飞,比较妥善的做法是提前设置好端点按F8运行到断点处再单步调试. 就写到这里了,希望读完这篇文章后对你的ARM调试之旅有所帮助.
文件: Eclipse_Leds.rar 大小: 10KB 下载: 下载