一直想用GDB单步调试GNU的汇编,无奈总也找不到这方面的资料。买了开发板以后,琢磨了一个晚上,终于能调试了,我想这对熟悉ARM芯片的寄存器和指令,尤其是启动代码是大有帮助的。 硬件平台:TQ2440
仿真器:OPENJTAG
系统平台:UBUNTU 10.04
工具链:ARM-LINUX-DDB.6.8版本的。自己编译的,可以参见以前的**。
1.所买的仿真器OPENJTAG上有教程,但是是针对C语言的,需要在其基础上进行一定的修改。
2.首先建立启动汇编文件;
start.S
1 @******************************************************************************
2 @ File:start.S
3 @ 功能:通过它转入C程序
4 @******************************************************************************
5
6 .text
7 .global _start
8 _start:
9 ldr r0, =0x53000000 @ WATCHDOG寄存器地址
10 mov r1, #0x0
11 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
12
13 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
14 @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
15 bl _main @ 跳转到main函数
16 halt_loop:
17 b halt_loop
3.建立LED.S测试文件
1 .text
2 .align 2
3 .global _main
4
5
6 _main:
7 ldr r0,=0x56000010
8 ldr r3,=0x56000014
9 mov r2,#0
10 mov r1,#1
11 orr r2,r1,lsl#10
12 str r2,[r0]
13 mov r4,#1
14 mov r4,r4,lsl#5
15 str r4,[r3]
16 bic r4,#32
17 str r4,[r3]
18
19 orr r2,r1,lsl#12
20 str r2,[r0]
21 mov r4,#2
22 mov r4,r4,lsl#5
23 str r4,[r3]
24 mov r5,r4
25 mvn r4,r5
26 str r4,[r3]
27 @orr r2,r1,lsl#14
28 @orr r2,r1,lsl#16
29
30 b _main
4.建立链接文件
led.lds 1 SECTIONS {
2 . = 0x00;
3 .text : { *(.text) }
4 .rodata ALIGN(4) : {*(.rodata)}
5 .data ALIGN(4) : { *(.data) }
6 .bss ALIGN(4) : { *(.bss) *(COMMON) }
7 }
5.建立MAKEFILE
1 CFLAGS := -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding
2 all:start.S led.S
3 arm-linux-gcc $(CFLAGS) -c -o start.o start.S
4 arm-linux-gcc $(CFLAGS) -c -o led.o led.S
5 arm-linux-ld -T led.lds start.o led.o -o led_elf
6 arm-linux-objcopy -O binary -S led_elf led.bin
7 arm-linux-objdump -D -m arm led_elf > led.dis
8 clean:
9 rm -f hello.dis hello.bin hello_elf *.o
6.建立连接到GDB的文件
gdb.init
1 target remote localhost:3333
2 monitor halt
3 monitor arm920t cp15 2 0
4 monitor step
5 load
6 break _start
7 continue
7.先make下,然后执行,执行此命令,必须在root用户下。
openocd -f /etc/openocd/interface/openjtag.cfg -f /etc/openocd/target/samsung_s3c2440.cfg
打开openocd
成功后的信息如下:
Open On-Chip Debugger 0.5.0-dev (2010-11-25-15:20)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.berlios.de/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
fast memory access is enabled
trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain
Info : clock speed 6000 kHz
Info : JTAG tap: s3c2440.cpu tap/device found: 0x0032409d (mfg: 0x04e, part: 0x0324, ver: 0x0)
Info : Embedded ICE version 2
Info : s3c2440.cpu: hardware has 2 breakpoint/watchpoint units
8.另开终端:
执行 arm-linux-gdb -x gdb.init led_elf.即可从启动代码第一句开始调试。调试中一步一步执行可以看到两个LED的变化,不要continue,因为没有加延时,速度太快,看不出变化。 |