6403083 发表于 2013-1-19 09:22:40

env_relocate_spec() 环境变量实参数的指向问题。

在执行env_relocate_spec()
会依次调用nand_read(&nand_info, CFG_ENV_OFFSET, &total, (u_char*)env_ptr)

依次调用static int nand_read (struct mtd_info *mtd, loff_t from, size_t len, size_t * retlen, u_char * buf)
{
        return nand_read_ecc (mtd, from, len, retlen, buf, NULL, NULL);
}

依次调用static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
                          size_t * retlen, u_char * buf, u_char * oob_buf, struct nand_oobinfo *oobsel)
{ 。。。。。。忽略部分代码
if (aligned)
                        data_poi = &buf;
                else
                        data_poi = this->data_buf;
。。。。。。忽略部分代码
}
问题:data_poi = &buf中的&buf指向什么地方?首先buf应该与实参数(u_char*)env_ptr对应,请问大虾们&buf指向结构体struct environment_s
还是指向结构的成员data; 如果是指向data;为什么不用env_ptr-〉data的表示方法。对data_poi = &buf这种表示方法很困惑!

在nand_read(&nand_info, CFG_ENV_OFFSET, &total, (u_char*)env_ptr) 中的实参
(u_char*)env_ptr在其他文件中定义为指向结构体的指针env_t *env_ptr = 0;
env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
env_t 结构体的定义如下:
typedef        struct environment_s {
        unsigned long        crc;                /* CRC32 over data bytes        */
#ifdef CFG_REDUNDAND_ENVIRONMENT
        unsigned char        flags;                /* active/obsolete flags        */
#endif
        unsigned char        data; /* Environment data                */
} env_t;

6403083 发表于 2013-1-19 20:47:48

自己先顶一下,&buf应该就是指向env_t结构体,
只是不明白为什么要将结构体的指针env_ptr,变成用数组&buf的表示方法。
恩,好像明白过来了,不知理解的对不对,
首先env_t *env_ptr = 0;指向env_t结构类型,并赋初值。
再env_ptr = (env_t *)malloc (CFG_ENV_SIZE);分配内存空间,并指向env_t结构类型
下面是我理解的重点了,
在调用nand_read(&nand_info, CFG_ENV_OFFSET, &total, (u_char*)env_ptr)时,已经将env_ptr的指针类型从env_t结构类型强制更改为u_char* 类型,虽然指针的类型发生了变化但指向的地址却没有改变,然后使用&buf数组的表示方法是因为后面的读页操作的需要,一个字节一个字节的去读,比如
this->read_buf(mtd, data_poi, end); //读一个完整的页
上面这个函数会执行
static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
{
        int i;
        struct nand_chip *this = mtd->priv;

        for (i=0; i<len; i++)
                buf = readb(this->IO_ADDR_R);
}
分析完了,不知对不对?欢迎排砖!!!











页: [1]
查看完整版本: env_relocate_spec() 环境变量实参数的指向问题。