天嵌 ARM开发社区

 找回密码
 注册
查看: 2441|回复: 2

U-boot调试遇到的奇怪问题

[复制链接]
stardust_ivan 发表于 2012-2-16 15:33:40 | 显示全部楼层 |阅读模式
本帖最后由 stardust_ivan 于 2012-2-16 15:39 编辑

这几天闲着没事,于是就trace了下u-boot的源码(u-boot-1.1.6 for TQ2440),谁知看上瘾了。但是今天发现了一个问题,百思不得其解,希望在这里能有哪位大侠给出答案,不胜感谢!
在start_armboot()    // lib_arm/board.c
----->env_relocate ()      // common/env_common.c
---->env_relocate_spec () // common/env_nand.c
---->nand_read()           // include/nand.h 这里nand_read调用的应是info->read,而这个函数指针指向下面
---->nand_read()       //    drivers/nand/nand_base.c 在此函数中调用 nand_read_ecc()
---->nand_read_ecc()  // drivers/nand/nand_base.c 问题就出现在这个函数中,见下面描述:
在程序的开头,有这样的一条语句:
/* Do not allow reads past end of device */
if ((from + len) > mtd->size)
{
        DEBUG (MTD_DEBUG_LEVEL0, "nand_read_ecc: Attempt read beyond end of device\n");
       *retlen = 0;
       return -EINVAL;
}
从前面的代码处分析可得:if语句中from的值应该是0x40000,len的值应是0x20000,mtd->size的值应是0x10000000
但是我在这个函数中,用printf语句打印出这三个值时,发现from的值是0x40000,len的值为0,mtd->size的值为0x20000。如果是这样的情况,那么应执行if语句块内的内容,但是根据加入的printf信息,并没有执行if语句块内的内容。而是把if的判断结果当成了假。

用openjtag在eclipse下调试的值更奇怪,from的值大的吓人,远远大于0x40000,而len和mtd->size的值分别是:0x20000,0x10000000

我被这个结果弄糊涂了,到底是怎么回事?printf打印出来的值会有错吗?如果说openjtag仿真调试的结果有问题我可以相信,但是printf打印出来的值怎么会有问题呢?

是不是我函数的调用顺序搞错了?但是我check了若干遍,应该不会有错的,到底是什么原因呢?
 楼主| stardust_ivan 发表于 2012-2-16 16:41:02 | 显示全部楼层
怎么没有人回答呢?自己顶一下!:'(:'(:'(:'(:'(
亚瑟王 发表于 2012-2-27 11:36:09 | 显示全部楼层
亲,这部分代码我没有分析过,你的串口打印信息是在这个if语句的前一句打印的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-19 02:42 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表