您的位置:首页 > 其它

bootloader---21.u-boot-2010.06-rc1移植之调试的思路

2016-08-30 11:12 246 查看
硬件: 

   开发板: TQ2440

   仿真器: openJtag

软件:

   系统: XP + vmware虚拟ubuntu_10.10

   编译: ubuntu_10.10下/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/

   调试环境: XP + eclipse + OpenOCD_GUI

   u-boot版本: u-boot-2010.06-rc1

一. 调试环境

用openjtag调试与烧到nand_flash中运行基本相同,就是有两点不一样: 一是跳过了memory初始化过程 二是跳过了从flash中读取数据到内存

1.1 用openjtag调试时,需要把arch/arm/cpu/arm920t/start.S中的

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

#if 0

    bl    cpu_init_crit

#endif

#endif

cpu_init_crit注掉。

1.2 同时在 board/samsung/smdk2410/config.mk 中将改TEXT_BASE为:
TEXT_BASE=0x33000000
这会导致arch/arm/cpu/arm920t/start.S跳过从nand_flash中读取uboot到memory的过程。
因为当前运行地址为0x33000000, 程序的链接地址TEXT_BASE=0x33000000
程序的加载地址与运行地址是相等的, 所以 
adr
r0, _start /* r0 <- current position of code   */
ldr
r1, _TEXT_BASE
/* test if we run from flash or RAM */
cmp
r0, r1 /* don't reloc during debug         */
beq
clear_bss
都是在memory中,就不执行从nand_flash中读取uboot了.

1.3 在config.mk中

153 DBGFLAGS= -g3 # -DDEBUG

154 OPTFLAGS= -O0 #-fomit-frame-pointer

说明:

1. -glevel:

Level 1输出最少量的信息,仅够在不打算调试的程序段内backtrace.包括函数和外

部变量的描述,但是 没有局部变量和行号信息.

Level 3包含更多的信息,如程序中出现的所有宏定义.当使用-g3选项的时候,某些

调试器支持 宏扩展.

2. 将-Os改为-O0:

不去掉-Os,如果在调试时,函数会乱跳,但还不是出错的乱跳,出现这种令人抓乱的情况时,就需要考虑是不是优化的太多了,把-Os改为-O0重新编译一下就ok了!

1.4 但是对于1.3中改DBGFLAGS= -g3,会引起u-boot.lds生成不正常
需要在Makefile中做一点小小的处理,将CPPFLAGS中的-g3替换成-g,生成新的CPPFLAGS

 273 TEMPCPPFLAG=$(subst g3,g, $(CPPFLAG))

 368 $(obj)u-boot.lds: $(LDSCRIPT)

 369 $(CPP) $(TEMPCPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@

1.5 重新编译之后,将虚拟机中的u-boot复制到windows下的目录里,就可以利用openjtag在eclipse里面进行单步调试了.(具体的设置方法请参见)

二.测试代码: 

网上有很多移植的教程,按照教程一步步来做肯定会移植好u-boot的,但是如果在移植过程中出现了错误如何定位呢?下面给出一些测试代码来验证功能是否正常.
1. 测试内存正常的代码

    /*write 0x12345678 to 0x30000000*/

    ldr r0, =0x30000000

    ldr r1, =0x12345678

    str r1, [r0]

    /*read from 0x30000000 && compare*/

    ldr r2, =0x30000000

    ldr r0, [r2]

    cmp r1, r0

    bne ledon

deadloop:

    b deadloop

ledon:

    ldr r0, =0x56000010

    ldr r1, =0x15400

    str r1, [r0]

    ldr r0, =0x56000014

    ldr r1, =0x160

    str r1, [r0]

deadloop2:

    b deadloop2

使用说明: u-boot移植过程中,一般要进行memory初始化,初始化好memory之后,拿上面这一段代码测试一下。如果led灯亮,说明有错误。

思路: 向内存的起始地址0x30000000写一个数0x12345678,然后读取出来,若相等,则说明memory初始化正常。

注意:arm好像没有直接读取内存到寄存器的指令,mov r3, #0 然后再用ldr  ldr r3, [r3]

2. 测试nand flash 读写正常

SMDK2410 # nand write 0x30000000 0x40000 0x10000

NAND write: device 0 offset 0x40000, size 0x10000

 65536 bytes written: OK

 SMDK2410 # nand read 0x30000000 0x40000 0x100

 NAND read: device 0 offset 0x40000, size 0x100

  256 bytes read: OK

 SMDK2410 # md.b 0x30000000 0x10

 30000000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................

需要用到u-boot的命令(nand read 与 nand write 和md)

nand write: 将数据从memory的0x30000000长度0x10000写入到nand的0x40000处
nand read:  将数据从nand的0x40000长度为0x10000写入到memory的0x30000000处
md.b     :  按字节显示memory的0x30000000长度为0x10的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: