Eclipse+JLink GDB Sever在mini2440开发板leds点灯程序调试过程

刚入手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 leds_elf
    arm-elf-objcopy -O binary -S leds_elf leds.bin
    arm-elf-objdump --m arm leds_elf > leds.dis
    
leds.o:leds.c
    arm-elf-gcc -Wall -Wstrict-prototypes --fomit-frame-pointer -ffreestanding --o leds.o leds.c

start.o:start.s
    arm-elf-gcc -Wall -Wstrict-prototypes --fomit-frame-pointer -ffreestanding --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状态 ,我的初始化设置如图
Eclipse+JLink GDB Sever在mini2440开发板leds点灯程序调试过程_第1张图片

初始化语句:

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
下载: 下载


你可能感兴趣的:(eclipse,timer,server,Flash,makefile,delay)