×
单片机 > 单片机程序设计 > 详情

cortex-a8 uboot系列:第十四章 uboot环境变量

发布时间:2021-04-22 发布时间:
|

一、Uboot的环境变量基础

1.环境变量的作用

让我们可以不用修改uboot的源代码,而是通过修改环境变量来影响uboot运行时的一些数据和特性。如修改bootdelay环境变量就可以更改系统开机自动启动时倒数的秒数。


2.环境变量的优先级

Uboot代码中有一个值,环境变量中也有一个值。Uboot程序实际运行时规则是:如果环境变量为空则使用代码中的值;如果环境变量不为空则优先使用环境变量对应的值。


3.环境变量在uboot中工作方式

默认环境变量,在common/env_common.c中default_environment中。default_environment是一个字符数组,大小为CFG_ENV_SIZE(16K),里面内容就是很多个环境变量连续分布组成的,每个环境变量最末端以’ ’分隔。


Gcc编译器会自动将多个字符串连接成一个字符串。也就是"bootargs="CONFIG_BOOTARGS" ",gcc会将之变成” bootargs= console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3 ”

SD卡中环境变量分区,在uboot的raw分区中。SD卡中其实就是给了个分区,专门用来存储而已。存储时其实是把DDR中的环境变量整体的写入到SD卡中分区里。当saveenv时其实整个所有的环境变量都被保存了一遍,而不是只保存更改的。

DDR中环境变量,在default_environment中,实质是字符数组。在uboot中其实是一个全局变量,链接时在数据段,重定位时default_environment就被重定位到DDR中一个内存地址处。这个地址处这个全局字符数组就是uboot运行时的DDR中的环境变量了。

4.总结:

刚烧录的系统环境变量是空白的,uboot第一次运行时加载的是uboot代码中自带的一份环境变量,叫默认环境变量。在saveenv时DDR中的环境变量会被更新到SD卡中的环境变量中,就可以被保存下来,下次开机会在环境变量relocate时会被SD卡中的环境变量会被加载到DDR中。


default_environment中的内容虽然被uboot源代码初始化为一定的值,但是在uboot启动的第二阶段,env_relocate时代码会去判断SD卡中的env分区的CRC是否通过。如果CRC通过说明SD卡中有正确的环境变量存储,则relocate函数会将SD卡中读取环境变量来覆盖default_environment字符数组,从而每次开机可以保持上一次更改过的环境变量。


二、环境变量相关命令

1.printenv

Uboot中输入printenv后,其实是执行函数do_printenv,common/cmd_nvedit.c中。

先判断输入的参数,如果为1个,说明是打印所有的环境变量。就循环打印所有的环境变量出来。


用双重for循环,来依次处理所有环境变量的打印。第一层for循环,就是处理各个环境变量。所以有多少个环境变量就会循环多少次。第二层for循环,就处理单个环境变量的打印。

因此default_environment数组是很长的一个字符数组,中间以 作为环境变量的间隔。


第一层循环,用来循环各个环境变量。第二个循环,用来处理每个环境变量。当for (nxt=i; env_get_char(nxt) != '


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向