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;
自己先顶一下,&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]