|
本帖最后由 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了若干遍,应该不会有错的,到底是什么原因呢? |
|