Mini2440学习笔记


搭建环境:

Win7 + OpenOCD + OpenJTAG + mini2440

 

按照《Eclipse,OpenOCD,OpenJTAGv3嵌入式开发教程》下载见 。将软硬件安装好。然后执行openocd-ftd2xx。这个程序会作为一个守护进程运行,等待客户端(telnet或GDB)的连接,可以使用-h参数查看该程序的一些可选参数。例如,使用-f参数来指定配置文件openocd.cfg的位置,如果没有指定,它会在当前执行路径下寻找。

 

关于openocd.cfg文件:

这是一个openocd的配置文件,详细内容可以查看openOCD文档,这里做一个简要说明:

 

  1. telnet_port 4444   //设定telnet监听的端口   
  2.   
  3. gdb_port 3333       //设定gdb的监听端口   
  4.   
  5. interface ft2232    //JTAG调试器的设备名称,OpenJTAG使用的是ft2232   
  6.   
  7. jtag_speed 0     //JTAG接口的速度,0表示最大速度   
  8.   
  9. ft2232_vid_pid 0x1457 0x5118   //ft2232的硬件ID,可以在设备属性里看到   
  10.   
  11. ft2232_layout "jtagkey_prototype_v1"  
  12.   
  13. reset_config trst_and_srst      //设备复位信号   
  14.   
  15. jtag_device 4 0x1 0xf 0xe   //JTAG工具链的属性,指令寄存器的长度为4Byte,其他都是ARM7/9的标准配置   
  16.   
  17. daemon_startup attach  
  18.   
  19. target arm920t little reset_run 0 arm920t  //目标板的特性,内核是arm920t,小端模式。复位后重新运行   
  20.   
  21. arm7_9 fast_memory_access enable  
  22.   
  23. working_area 0 0x200000 0x4000 backup   //为调试器指定工作空间   
  24.   
  25. nand device s3c2440 0  
  26.   
  27. run_and_halt_time 0 5000  
  28.   
  29. ft2232_device_desc "USB<=>JTAG&RS232 A"  //ft2232的设备描述,默认是FIDI  

启动openOCD后就可以用telnet登录到openOCD,下载调试程序。

 

分析leds

openJTAG提供的这个例程需要下载到内部的4K-RAM中运行,此时mini2440要从Nandflash启动,因为,leds的链接地址是0x0,如果从Norflash启动,内部RAM的地址是0x40000000,详细情况可以查看S3C2440-datasheet中存储控制器的地址空间分布。

该例程有两个源代码文件,crt0.s是一个汇编文件:

  1. @***************************************************************  
  2.   
  3. @ File:crt0.S  
  4.   
  5. @ 功能:通过它转入C程序  
  6.   
  7. @****************************************************************        
  8.   
  9.   
  10. .text  
  11. .global _start  
  12. _start:  
  13.             ldr     r0, =0x53000000     @ WATCHDOG寄存器地址  
  14.             mov     r1, #0x0                       
  15.             str   r1, [r0]              @ 写入0,禁止WATCHDOG,否则CPU会不断重启  
  16.             ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K  
  17.                                         @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K  
  18.             bl      main                @ 调用C程序中的main函数  
  19.   
  20. halt_loop:  
  21.             b       halt_loop  

在GNU的汇编语法中,以一个点开头的都是汇编命令;

.text:

该命令以下的内容都位于可执行文件的代码段,类似的命令还有:.data(已初始化的数据段),.bss(未初始化的数据段);

.global _start:

指定_start全局可见;_start是GNU连接器用来指定第一个执行指令所必须的;

ldr r0,=0x53000000:

当改命令的第二个参数前有“=”时,这是一个地址读取伪指令,它将看门狗寄存器的地址写入了r0;

ldr sp,=1024*4:

sp是堆栈寄存器,ARM的寄存器是FD(Full Descending)类型,栈指针执行栈顶元素,堆栈向地址减小的方向增长。

 

执行make编译程序,Makefile的主要内容如下:

  1. arm-elf-gcc $(CFLAGS) -c -o crt0.o crt0.S  
  2.   
  3. arm-elf-gcc $(CFLAGS) -c -o leds.o leds.c  
  4.   
  5. arm-elf-ld -Tleds.lds  crt0.o leds.o -o leds_elf  
  6.   
  7. arm-elf-objcopy -O binary -S leds_elf leds.bin  
  8.   
  9. arm-elf-objdump -D -m arm  leds_elf > leds.dis  

首先将两个源代码文件编译为目标文件,-c参数表示只进行预处理、编译、汇编,不进行连接;

然后用连接器(arm-elf-ld)将目标文件连接为可执行的elf格式文件,连接方式依赖与leds.lds文件,

 

  1. SECTIONS {  
  2.   
  3. . = 0x00;     //设置当前运行地址为0x00   
  4.   
  5. .text          :   { *(.text) }    //将目标文件的代码段都集合在这里,开始地址为0x00   
  6.   
  7. .rodata ALIGN(4) : {*(.rodata)}   //只读数据段,ALIGH(4)表示地址以4Byte对齐   
  8.   
  9. .data ALIGN(4) : { *(.data) }  
  10.   
  11. .bss ALIGN(4)  : { *(.bss)  *(COMMON) }  
  12.   
  13. }   

arm-elf-objcopy的作用是将elf格式文件转换为二进制文件。

arm-elf-objdump的作用是对elf文件进行反汇编,得到的dis文件时一个文本格式的反汇编文件,其中一段内容如下:

  1. 00000000 <_start>:  
  2.   
  3.    0: e3a00453  mov r0, #1392508928 ; 0x53000000  
  4.   
  5.    4: e3a01000  mov r1, #0 ; 0x0  
  6.   
  7.    8: e5801000  str r1, [r0]  
  8.   
  9.    c: e3a0da01  mov sp, #4096 ; 0x1000  
  10.   
  11.   10: eb00000b  bl 44 <main>  

每条汇编码的格式为:

指令的地址:机器码:汇编代码

 

用gdb调试程序

首先启动arm-elf-gdb,在命令行下执行:

arm-elf-gdb

执行后可以看到gbd提示符(gdb)。

登录openocd:

(gdb)target remote localhost:3333

查看当前状态:

(gdb)monitor poll

暂停:

(gdb)monitor halt

关闭MMU和Catch:

(gdb)monitor arm920t cp15 2 0

(gdb)monitor step

使能软件中断:

(gdb)monitor arm7_9 sw_bkpts enable

下载文件

(gdb)file leds/leds_elf

载入内存:

(gdb)load

从0x0开始运行:

(gdb)monitor resume 0x0

 

参考:

GNU ARM汇编入门

Linux下的lds连接脚本基础

  • 1
  • 2
  • 3
  • 4
  • 下一页
【内容导航】
第1页:Start 第2页:GPIO
第3页:SDRAM (1) 第4页:SDRAM (2)

相关内容