天嵌 ARM开发社区

 找回密码
 注册
查看: 4537|回复: 1

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

[复制链接]
6403083 发表于 2013-1-19 09:22:40 | 显示全部楼层 |阅读模式
在执行env_relocate_spec()
会依次调用nand_read(&nand_info[0], 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[read];
                else
                        data_poi = this->data_buf;
。。。。。。忽略部分代码
}
问题:data_poi = &buf[read]中的&buf[read]指向什么地方?首先buf[read]应该与实参数(u_char*)env_ptr对应,请问大虾们&buf[read]指向结构体struct environment_s
还是指向结构的成员data[ENV_SIZE]; 如果是指向data[ENV_SIZE];为什么不用env_ptr-〉data[read]的表示方法。对data_poi = &buf[read]这种表示方法很困惑!

在nand_read(&nand_info[0], 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[ENV_SIZE]; /* Environment data                */
} env_t;

 楼主| 6403083 发表于 2013-1-19 20:47:48 | 显示全部楼层
自己先顶一下,&buf[read]应该就是指向env_t结构体,
只是不明白为什么要将结构体的指针env_ptr,变成用数组&buf[read]的表示方法。
恩,好像明白过来了,不知理解的对不对,
首先env_t *env_ptr = 0;指向env_t结构类型,并赋初值。
再env_ptr = (env_t *)malloc (CFG_ENV_SIZE);分配内存空间,并指向env_t结构类型
下面是我理解的重点了,
在调用nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr)时,已经将env_ptr的指针类型从env_t结构类型强制更改为u_char* 类型,虽然指针的类型发生了变化但指向的地址却没有改变,然后使用&buf[read]数组的表示方法是因为后面的读页操作的需要,一个字节一个字节的去读,比如
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[i] = readb(this->IO_ADDR_R);
}
分析完了,不知对不对?欢迎排砖!!!











回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2025-6-17 16:51 , Processed in 2.042165 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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