uboot - 环境变量的同步

env的同步
extern env_t * env_ptr;
/*
    这个函数主要做了一下事情 : 
                        1 : 分配好环境变量需要的内存空间
                        2 : 读取flash上的环境变量到内存空间中
*/
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);
}

这里写图片描述

实验验证
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值