打印

转:arm-linux-gdb单步调试GNU汇编

[复制链接]
1851|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
金鱼木鱼|  楼主 | 2011-6-23 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一直想用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,因为没有加延时,速度太快,看不出变化。

相关帖子

沙发
xsgy123| | 2011-6-24 19:46 | 只看该作者
对汇编不是太熟悉

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://bbs.srvee.com/forum-104-1.html

346

主题

1551

帖子

2

粉丝