env的同步
extern env_t * env_ptr;
void env_relocate(void)
{
/**
1 : 为环境变量分配内存空间,
我们使用env_relocate()这个函数,就是要将位于flash上的环境变量加载到内存中
这里必须要再内存中申请空间 来存放。
该函数的下面会使用 env_relocate_spec()来完成这个功能。
空间的大小是 CONFIG_ENV_SIZE 0x40000 256K
环境变量的浅析 请看我以前的博文
http://blog.csdn.net/leesagacious/article/details/51999656
2 : 该内存的首地址被保存在了全局变量gd->env_addr中。所以,你可以在uboot的任何
一个地方获取到环境变量的首地址和环境变量的crc值
该函数的最后会有这样的赋值语句
gd->env_addr = (ulong)&(env_ptr->data);
*/
env_ptr = (env_t *)malloc(COFIG_ENV_SIZE);
+printf("addr env_ptr = %0x\n",&env_ptr);
+printf("addr env_ptr = %0x\n",&gd->env_addr);
+printf("crc = %d\n",env_ptr->crc);
/**
如果对flash上的环境变量校验错误 gd->env_valid = 0
如果成功,gd->env_valid = 1;
*/
+printf("env_valid : %d\n",gd->env_valid);
if(gd->env_valid == 0)
{
puts ("*** Warning - bad CRC, using default environment\n\n");
show_boot_progress (-60);
/**
使用默认的环境变量
*/
set_default_env();
}else{
/**
重点函数。
将flash上的环境变量(start: 0x80000->0xC0000)重新定位到RAM中。
定位到 我们上面分配的内存中去。
*/
env_relocate_spec();
/**
将环境变量的首地址赋值给全局变量gd->env_addr.
看清,是env_ptr->data 不包含crc、flag
*/
gd->env_addr = (ulong)&(env_ptr->data);
}
![这里写图片描述](https://img-blog.csdn.net/20160808205341477)
实验验证