笔记整理—uboot番外(3)环境变量的作用

        环境变量的最大一个作用就是,能够在不修改代码的情况下去影响应用的运行情况。

        环境变量的优先级问题:有环境变量的情况下优先使用环境变量,没有环境变量则使用代码中的值(全局变量一类的变量)。

        例如,machid在bdinfo中,而不再print_env中(环境变量)。但若是set machid 0x30001332就可以在环境变量中生成一个值,当校验时会对这个值进行采用。

        删除一个环境变量的方法:如刚刚设置了set machid 0x30001332,则使用set machid就能够删除掉这个环境变量,启动时依然使用bdinfo中的参数。(记住环境变量设置后save一下)

        默认的第一次加载uboot时,其env分区为空,在第一次运行时会去加载代码中的默认值(uboot/common/env_common.c中default_environment)。

        在default_environment中,每个环境变量以‘\0’进行分割。在第一次工作完成后,当save env时,DDR中的env会被更新到SD卡的环境变量分区中,在下次relocate时被加载到DDR中使用。

        链接时将default_environment放数据段的位置,重定位时放DDR的对应位置。

        SD卡中的环境变量会进行CRC校验查看是否可用以此验证值并进行更新。

printenv功能也就是print指令    //打印环境变量

        对于do_printenv()函数而言,argc=1时 打印的是所有的环境变量,当argc>=2时,则会打印相关的环境变量。

        环境变量在内存中的存储方式:以字符串方式进行存储,变量与变量之间以‘\0’为分隔。

笔记整理—uboot番外(3)环境变量的作用_第1张图片

        代码表现为:

if(1==argc){
    for(nex=i;env_get_char(nex)!='\0';++nex)
        {
         for(k=i;k

 setenv功能也就是set指令是用于设置环境变量的对应do_setenv()函数。当argc<2时指令错误,argc>=2时为do_setenv(flag,argc,argv);

char* env_data=env_get_addr(0);//得到首元素首地址
name=argv[1];

for(env=env_data;*env!='\0';env=nex+1)
{
    for(nex=env;*nex!='\0';++nex)
        {
            if((oldval=envmatch(uchar*)name,env-env_data)>=0)
                break;
        }
}

        envmatch比较env-env_data=取名字,找到后通过break弹出,以env与nex记录位置。

        删除env与nex中间的内容,以‘\0’填充:1.遍历DDR相关区域是否存在当前变量。2.擦除当前找到区域内容。3.复写新内容到相关地址。

        一些重要的环境变量可能与全局变量冲突,也就是当gd与env冲突,出现这种情况应该去更新gd方面的内容。

        saveenv保存环境变量,对应do_saveenv()函数。相关内容在env_auto中。读取寄存器INF_REC(OMPin内对应的寄存器)得知启动介质,在其中使用saveenv()实现保存数据。对于x210而言,启动介质信息存放在0xE010F000+0c,放了#mmc_sd(3)(这个在start.S里),所以判断其介质为3-movinand,所以会调用movi_write_env()进行保存。

        virt_tophy对虚拟地址进行物理地址转换,通过raw_area_control进行改写(inand/sd卡的原始分区表)。

        getenv获取环境变量的值,getenv_r为其可重入版本。

         *get_env(char *name)与上面说到的双层for有相同的逻辑,依靠envmatch进行比对,遍历default_environment进行查找。

        getenv_r(char* name,char *buf,unsigned len):getenv()的方法是返回地址(不是很安全),而getenv_r()是复制一份内容到buf'中,不去动用DDR的变量(相对安全),_r的版本可进行环境变量处理。

你可能感兴趣的:(X210嵌入式学习整理,笔记,linux,嵌入式硬件,c语言)