U-BOOT环境变量实现

本文详细介绍了U-Boot中的环境变量(env)管理机制,包括相关文件、数据结构、初始化流程及保存方法等内容。深入探讨了环境变量在不同存储介质上的实现方式,如NAND Flash,并解析了其在RAM中的重定位过程。
1.相关文件
common/env_common.c
供u-boot调用的通用函数接口,它们隐藏了env的不同实现方式,比如dataflash,epprom, flash等
 
common/env_dataflash.c
env 存储在dataflash中的实现
 
common/env_epprom.c
env 存储在epprom中的实现
 
common/env_flash.c
env 存储在flash中的实现
 
common/env_nand.c
env 存储在nand中的实现
 
common/env_nvedit.c
实现u-boot对环境变量的操作命令
 
environment.c
环境变量以及一些宏定义
 
env如果存储在Flash中还需要Flash的支持。
2.数据结构
env 在 u-boot中通常有两种存在方式,在永久性存储介质中( Flash NVRAM等 )在SDRAM,可以配置不使用 env的永久存储方式,但这不常用。u-boot 在启动的时候会将存储在永久性存储介质中的 env 重新定位到 RAM中,这样可以快速访问,同时可以通过saveenv 将 RAM 中的 env 保存到永久性存储介质中。
 
在include/environment.h中定义了表示env的数据结构
 
typedef struct environment_s
{
      unsigned long crc;  
#ifdef CFG_REDUNDAND_ENVIRONMENT
      unsigned char flags; 
#endif
      unsigned char data[ENV_SIZE];
} env_t;
关于以上结构的说明:
crc是u-boot在保存env的时候加上去的校验头,在第一次启动时一般 crc校验会出错,这很正常,因为这时 Flash中的数据无效。
data字段保存实际的环境变量。u-boot 的 env 按name=value”\0”的方式存储,在所有env的最后以”\0\0”表示整个 env的结束。新的name=value对总是被添加到 env数据块的末尾,当删除一个name=value对时,后面的环境变量将前移,对一个已经存在的环境变量的修改实际上先删除再插入。
env 可以保存在 u-boot 的TEXT 段中,这样 env 就可以同 u-boot 一同加载入RAM中,这种方法没有测试过。
      上文提到u-boot会将 env 从 flash 等存储设备重定位到 RAM 中,在 env 的不同实现版本( env_xxx.c)中定义了 env_ptr, 它指向 env 在RAM中的位置。u-boot在重定位 env后对环境变量的操作都是针对env_ptr。
      env_t 中除了数据之外还包含校验头,u-boot 把env_t 的数据指针有保存在了另外一个地方,这就是 gd_t结构( 不同平台有不同的 gd_t 结构 ),这里以ARM为例仅列出和 env 相关的部分
typedef struct global_data
{
      
      unsigned long env_off;       
      unsigned longenv_addr;       
      unsigned longenv_valid       
      
} gd_t;
<include/asm-arm/Global_data.h>
gd_t.env_addr 即指向env_ptr->data。
 
 
 
 
 
3.ENV的初始化
start_armboot : ( lib_arm/board.c)
*env_init : env_xxx.c( xxx = nand | flash |epprom … )
env_relocate : env_common.c
*env_relocate_spec : env_xxx.c( xxx=nand |flash | eporom… )
3.1env_init
实现 env 的第一次初始化,对于nand env(非embedded方式):
Env_nand.c : env_init
gd->env_addr =(ulong)&default_environment[0];//先使gd->env_addr指向默认的环境变量
gd->env_valid = 1;// env有效位置1
3.2 env_relocate
#ifdefine ENV_IS_EMBEDDED
…(略)
#else
env_ptr = (env_t *)malloc(CFG_ENV_SIZE);
#endif
if( gd->env_valid == 0) // 在Env_annd.c : env_init 中已经将 gd->env_valid置1
{
      
}
else
      env_relocate_spec ();// 调用具体的 env_relocate_spec函数
gd->env_addr =(ulong)&(env_ptr->data);//最终完成将环境变量搬移到内存
这里涉及到两个和环境变量有关的宏
ENV_IS_EMBEDDED : env 是否存在于 u-boot TEXT段中
CFG_ENV_SIZE : env 块的大小
实际上还需要几个宏来控制u-boot 对环境变量的处理
CFG_ENV_IS_IN_NAND : env 块是否存在于Nand Flash中
CFG_ENV_OFFSET : env 块在 Flash中偏移地址
 
3.3*env_relocate_spec
这里仅分析 Nand Flash 的 env_relocate_spec实现
如果未设置CFG_ENV_OFFSET_REDUND,env_relocate_spec的实现如下 :
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
      ulong total;
      int ret;
 
      total = CFG_ENV_SIZE;
      ret = nand_read(&nand_info[0], CFG_ENV_OFFSET,&total, (u_char*)env_ptr);
    if (ret || total != CFG_ENV_SIZE)
             return use_default();
 
      if (crc32(0, env_ptr->data, ENV_SIZE) !=env_ptr->crc)
             return use_default();
#endif
}
上面的代码很清楚的表明了 env_relocate_spec 的意图,调用 nand_read将环境变量从 CFG_ENV_OFFSET 处读出,环境变量的大小为 CFG_ENV_SIZE 注意 CFG_ENV_OFFSET和CFG_ENV_SIZE 要和 Nand Flash 的块/页边界对齐。读出数据后再调用crc32对env_ptr->data 进行校验并与保存在 env_ptr->crc的校验码对比,看数据是否出错,从这里也可以看出在系统第一次启动时,Nand Flash里面没有存储任何环境变量,crc校验肯定回出错,当我们保存环境变量后,接下来再启动板子u-boot就不会再报crc32出错了。
4. ENV的保存
由上问的论述得知, env 将从永久性存储介质中搬到RAM里面,以后对env的操作,比如修改环境变量的值,删除环境变量的值都是对这个 env在RAM中的拷贝进行操作,由于RAM的特性,下次启动时所做的修改将全部消失,u-boot提供了将env 写回 永久性存储介质的命令支持: saveenv,不同版本的 env ( nand flash, flash … )实现方式不同,以Nand Flash的实现(未定义CFG_ENV_OFFSET_REDUND)为例
Env_nand.c : saveenv
int saveenv(void)
{
      ulong total;
      int ret = 0;
 
      puts ("Erasing Nand...");
      if (nand_erase(&nand_info[0], CFG_ENV_OFFSET,CFG_ENV_SIZE))
             return 1;
 
      puts ("Writing to Nand... ");
      total = CFG_ENV_SIZE;
      ret = nand_write(&nand_info[0], CFG_ENV_OFFSET,&total, (u_char*)env_ptr);
      if (ret || total != CFG_ENV_SIZE)
             return 1;
 
      puts ("done\n");
      return ret;
}
Nand Flash 的 saveenv 命令实现很简单,调用nand_erase和nand_write进行Nand Flash的 erase, write。nand_write/erase使用的是u-boot的nand驱动框架,我在做开发的过程中使用的是nand_legacy驱动,所以可以把nand_erase和nand_write改成nand_legacy_erase和nand_legacy_rw就可实现nand_legacy驱动的保存环境变量版本。
【SCI一区复现】基于配电网韧性提升的应急移动电源预配置和动态调度(下)—MPS动态调度(Matlab代码实现)内容概要:本文档围绕“基于配电网韧性提升的应急移动电源预配置和动态调度”主题,重点介绍MPS(Mobile Power Sources)动态调度的Matlab代码实现,是SCI一区论文复现的技术资料。内容涵盖在灾害或故障等极端场景下,如何通过优化算法对应急移动电源进行科学调度,以提升配电网在突发事件中的恢复能力与供电可靠性。文档强调采用先进的智能优化算法进行建模求解,并结合IEEE标准测试系统(如IEEE33节点)进行仿真验证,具有较强的学术前沿性和工程应用价值。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事电力系统优化、配电网韧性、应急电源调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于复现高水平期刊(SCI一区、IEEE顶刊)中关于配电网韧性与移动电源调度的研究成果;②支撑科研项目中的模型构建与算法开发,提升配电网在故障后的快速恢复能力;③为电力系统应急调度策略提供仿真工具与技术参考。; 阅读建议:建议结合前篇“MPS预配置”内容系统学习,重点关注动态调度模型的数学建模、目标函数设计与Matlab代码实现细节,建议配合YALMIP等优化工具包进行仿真实验,并参考文中提供的网盘资源获取完整代码与数据。
一款AI短视频生成工具,只需输入一句产品卖点或内容主题,软件便能自动生成脚本、配音、字幕和特效,并在30秒内渲染出成片。 支持批量自动剪辑,能够实现无人值守的循环生产。 一键生成产品营销与泛内容短视频,AI批量自动剪辑,高颜值跨平台桌面端工具。 AI视频生成工具是一个桌面端应用,旨在通过AI技术简化短视频的制作流程。用户可以通过简单的提示词文本+视频分镜素材,快速且自动的剪辑出高质量的产品营销和泛内容短视频。该项目集成了AI驱动的文案生成、语音合成、视频剪辑、字幕特效等功能,旨在为用户提供开箱即用的短视频制作体验。 核心功能 AI驱动:集成了最新的AI技术,提升视频制作效率和质量 文案生成:基于提示词生成高质量的短视频文案 自动剪辑:支持多种视频格式,自动化批量处理视频剪辑任务 语音合成:将生成的文案转换为自然流畅的语音 字幕特效:自动添加字幕和特效,提升视频质量 批量处理:支持批量任务,按预设自动持续合成视频 多语言支持:支持中文、英文等多种语言,满足不同用户需求 开箱即用:无需复杂配置,用户可以快速上手 持续更新:定期发布新版本,修复bug并添加新功能 安全可靠:完全本地本地化运行,确保用户数据安全 用户友好:简洁直观的用户界面,易于操作 多平台支持:支持Windows、macOS和Linux等多个操作系统
源码来自:https://pan.quark.cn/s/2bb27108fef8 **MetaTrader 5的智能交易系统(EA)**MetaTrader 5(MT5)是由MetaQuotes Software Corp公司研发的一款广受欢迎的外汇交易及金融市场分析软件。 该平台具备高级图表、技术分析工具、自动化交易(借助EA,即Expert Advisor)以及算法交易等多项功能,使交易参与者能够高效且智能化地开展市场活动。 **抛物线SAR(Parabolic SAR)技术指标**抛物线SAR(Stop and Reverse)是由技术分析专家Wells Wilder所设计的一种趋势追踪工具,其目的在于识别价格走势的变动并设定止损及止盈界限。 SAR值的计算依赖于当前价格与前一个周期的SAR数值,随着价格的上扬或下滑,SAR会以一定的加速系数逐渐靠近价格轨迹,一旦价格走势发生逆转,SAR也会迅速调整方向,从而发出交易提示。 **Parabolic SAR EA的操作原理**在MetaTrader 5环境中,Parabolic SAR EA借助内嵌的iSAR工具来执行交易决策。 iSAR工具通过计算得出的SAR位置,辅助EA判断入市与离市时机。 当市场价位触及SAR点时,EA将产生开仓指令,倘若价格持续朝同一方向变动,SAR将同步移动,形成动态止损与止盈参考点。 当价格反向突破SAR时,EA会结束当前仓位并可能建立反向仓位。 **智能交易系统(EA)的优越性**1. **自动化交易**:EA能够持续监控市场,依据既定策略自动完成买卖操作,减少人为情感对交易的影响。 2. **精确操作**:EA依照预设规则操作,无任何迟疑,从而提升交易成效。 3. **风险管控**:借助SA...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值