智能汽车域控制器FOTA升级方案探讨

1.概述

本文探讨的OTA升级仅针对运行linux系统的域控制器,升级方式为FOTA,探究升级文件从OTA服务器下载到域控中以后,如何将升级文件安装到存储系统。

为安全起见,支持FOTA升级的存储区域必须支持AB分区设计,每个分区中储存能独立运行的程序,确保即使系统升级失败,也能通过回滚机制切换到原来的分区,保证系统的连续稳定运行。

说几个概念:

  1. 静默升级

系统正常运行时就可以执行OTA功能, 具备静默升级的功能后, 系统可以在运行时随时接收来自云端升级包并升级并在下次启动时切换。

  1. 无缝切换

当升级完成后,系统复位重启可以直接进入新系统,无需再启动阶段在进行安装等待。

  1. 回滚支持

升级安装过程被打断、新系统有问题无法运行、需要切换到旧系统时,都需要支持能够回滚到原来的系统。

  1. 安全启动

在 OTA 之后, 系统需要支持安全引导, 以确保在启动期间加载正确的升级包, 如果没有安全的引导过程, 系统可能使用未经授权或损坏的风险代码。

2.应用领域

主机厂推出OTA功能,可以有如下的应用:

  1. 功能扩展

主机厂通过OTA升级为车辆添加新功能,不断提升车辆的智能化水平,同时对现有功能进行优化,提升车辆的性能和用户体验,例如,优化电池和电机控制算法以提高续航里程,优化自动驾驶系统的算法不断提升驾驶能力。

  1. 故障修复

主机厂可随时修复由于软件异常导致的车辆故障,避免批量召回造成的重大损失,并且主机厂可以通过预测性诊断技术,预测潜在故障并提前推送修复程序。

  1. 个性化定制

用户可以根据自己的需求和喜好对车辆进行个性化设置,如调整座椅加热、空调温度、驾驶模式,通过OTA升级更换车辆的主题和界面样式,使车辆符合用户的个性化需求。

3.技术细节

要整体上理解OTA,就得先从存储介质开始,才能理解整个系统。

3.1 GPT分区表

GPT是一种数据结构,用于结构化磁盘、eMMC、Flash等存储介质,为用户提供看待存储介质和使用存储介质的方式和视角。

LBA是看待存储介质颗粒度的属性,一般为512字节。

GPT 是一种现代分区表类型,用于替代 MBR,解决MBR最大可寻址存储空间为2 TiB的问题,在需要管理大容量硬盘时适用,GPT 不受分区数量和大小的限制。

分区表头数据结构

点击图片可查看完整电子表格

分区表项数据结构

点击图片可查看完整电子表格

分区表读取

在linux系统,可以使用dd命令直接读取磁盘等存储介质的原始数据,使用如下命令,读取eMMC中前10个LBA中的数据,可以看出实际写入分区表的数值。

Bash
sudo dd if=/dev/mmcblock0 of=gpt.bin bs=512 count=10

然后用二进制工具查看读出来的原始数据如下:

写入分区表

linux下,使用如下命令为磁盘等介质进行分区:

Bash
sudo gdisk /dev/mmcblock0

嵌入式系统中,对Flash和eMMC等存储介质的使用,没有linux等OS的协助,一般是直接访问存储介质的,所以能看到最纯粹的磁盘数据,根据项目需要,可以自定义使用存储介质的区块,GPT分区表也不用一定要放在磁盘的最开始的区块,根据项目需要设计好存储介质的数据结构,然后完全由启动阶段的Bootloader来处理介质内的数据。

3.2  OTA时的分区操作

槽是一个逻辑概念,是一组同类型分区的集合,如所有A分区的集合,称为A槽。

启动槽是当前系统运行的槽,目标槽是用于升级的槽。

OTA时,始终升级的是对端的非激活分区,升级的安装过程可分解为如下步骤:

  1. 升级前,读取目标存储设备, 解析分区表数据结构,判断当前系统处于哪个槽;
  1. 对启动槽写入Successful 属性,用于表明当前槽启动成功, 用于将来的回滚;
  1. 对目标槽清空 bootable 属性, 防止升级过程中断电, 先标明目标槽没有启动能力;
  1. 用 OTA 获取的数据包对目标槽进行 OTA 升级, 擦写其对应的 GPT 分区;
  1. 如果升级成功, 设置目标槽的 Actives 属性、 Bootable 属性,并且配置 Retry_Count 属性为 3或者5, 清除目标槽的 Successful 属性, 清除当前槽的 Actives 属性。
  1. 重启系统, 系统下次启动时从包含 Actvie 属性的目标槽启动。

Flash一般用MCU来刷写,eMMC一般用MPU来刷写,由bootloader来决定启动哪个槽。

4.实践应用

下面以实际案例,分析一下系统的存储分区是如何变化的,案例中包含一个异构SoC,内部分为MCU和MPU,Flash和eMMC分别存储MCU和MPU的系统文件,OTA由MPU中的OTA程序实现,系统启动由MCU的bootloader实现,MCU和MPU均可访问Flash和eMMC。

上文提到的Entry属性,包括Active 属性, Bootable 属性, Successful 属性, Retrycnt 属性 ,Active 属性用于标志槽的优先级,bootloader优先选择Active 属性=1的槽启动,Bootable 属性标志槽可否可启动,Successful 属性标志槽是否成功启动过,Retrycnt 属性标志槽可尝试启动的次数。

4.1 分区属性变化过程

首次烧写后

在域控产品出厂前,供应商会用烧录工具直接对Flash和eMMC进行烧写,包括对分区表和镜像文件的烧写,烧写后,分区Entry属性如下:

1.所有属性标志均为0;

2.Bootloader从A槽启动后,设置A槽的Active=1,RetryCount=3。

出厂烧写工具对分区表的属性写入

A槽

Active=0

Successful=0

RetryCnt=0

B槽

Active=0

Successful=0

RetryCnt=0

Bootloader首次对分区表的属性写入

A槽

Active=1

Successful=0

RetryCnt=3

从A槽启动

B槽

Active=0

Successful=0

RetryCnt=0

首次进入系统后

当系统首次烧录完成,进入系统后,系统应用程序会设置A槽的Success=1,此时,分区Entry属性如下:

A槽

Active=1

Successful=1

RetryCnt=3

从A槽启动

B槽

Active=0

Successful=x

RetryCnt=x

系统回滚

每次系统重新运行后,Bootloader需要根据槽的Entry属性运行回滚逻辑,具体如下:

1.可以直接从A槽启动

A槽

Active=1

Successful=1

RetryCnt=3

从A槽启动

B槽

Active=0

Successful=0

RetryCnt=0

2.尝试从A槽启动

当从A槽启动,但是系统没成功启动,此时A槽的Successful=0,Bootloader仍旧从A槽尝试启动,每次都会把RetryCnt减1,如果成功启动,系统应用置Successful=1,下次Bootloader运行时,检测到Successful=1后,重新将RetryCnt=3。

A槽

Active=1

Successful=0

RetryCnt=3

从A槽启动

B槽

Active=0

Successful=0

RetryCnt=0

3.回滚到B槽进行启动

如果A槽的RetryCnt减到0,但是仍旧Successful=0,那么判定A槽无法启动系统,将切换到B槽进行启动,此时Bootloader将设置分区的Entry属性为如下:

A槽

Active=0

Successful=0

RetryCnt=0

B槽

Active=1

Successful=0

RetryCnt=3

从B槽启动

4.2 Bootloader和应用对分区属性的设置

芯片启动后,首先进入Bootloader阶段,此阶段将读取存储系统的分区属性,根据属性值进行逻辑判断,并确定进入哪个分区,详见流程图。

5.总结

本文总结了OTA升级过程中,域控SoC是如何对其存储设备进行分区数据管理的,详细分析了GPT分区表的技术细节,以及分区表项的属性设置,以及芯片的Bootloader如何进行分区回滚的方案。

嵌入式开发的实操,已在github公开,需要学习研究的自取。
https://github.com/sydyg/Vehicle_Soft_Class.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/377186.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅学三次握手

数据要完成传输,必须要建立连接。由于建立TCP连接的过程需要来回3次,所以,将这个过程形象的叫做三次握手。 结合上面的图来看更清楚。 先说三次握手吧,连接是后续数据传输的基础。就像我们打电话一样,必须保证我和对方…

c++习题10-骑士得到的金币数

目录 一,题目 二,思路 三,代码 一,题目 二,思路 阅读题目之后可以列出如下的数字👇 观察上图有如下思路(主要是找到规律) 给个for循环包裹住需要处理的语句,循环…

k8s快速部署一个网站

1)使用Deployment控制器部署镜像: kubectl create deployment web-demo --imagelizhenliang/web-demo:v1 kubectl get deployment,pods[rootk8s-matser ~]# kubectl get pods NAME READY STATUS RESTARTS A…

The Web3 社区 Web3 产品经理课程

概述 / 深耕区块链行业 11 年,和很多产品经理都打过交道;遇到过优秀的产品经理,也遇到过比较拉垮的产品经理。多年工作中,曾在某些团队,承载技术兼产品经理的角色;也参与过很多 Web3 外包项目,包…

【研路导航】成功保研面试:避免迷惑发言,掌握关键表达技巧

更多保研,夏令营,预推免与信息时间节点资讯可以在文章末尾领取! 写在前面 在保研面试的过程中,准备充分是成功的关键。每年的夏令营都是竞争激烈的时刻,而如何在面试中展现出最佳的自我,不仅是一场考验&a…

java实战项目-学生管理系统(附带全套源代码及其登录注册功能的实现)--《进阶篇》

一、前言 新增了登录注册的功能,代码量可能会有点大,所有代码加起来差不多560行。这个项目对于小白来说肯定是一大难关了。文章中的每张图都是作者亲手绘制的,简单明了,如果大家认同作者,希望可以支持一下作者。全套源…

elasticsearch 查询超10000的解决方案

前言 默认情况下,Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页,以及查询批量数据更新的情况 问题:当请求form size >10000 时&#xff0c…

【从0到1进阶Redis】主从复制 — 主从机宕机测试

上一篇:【从0到1进阶Redis】主从复制 测试:主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息。 如果是使用命令行,来…

制作显卡版docker并配置TensorTR环境

感谢阅读 相关概念docker准备下载一个自己电脑cuda匹配的docker镜像拉取以及启动镜像安装cudaTensorRT部署教程 相关概念 TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个模型推理框架,支持C和Python推理。即我们利用Pytorch,Tensorflow或者其它框架…

电影购票小程序论文(设计)开题报告

一、课题的背景和意义 随着互联网技术的不断发展,人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题,而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用,它能够让用户随时随地…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接:https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

自适应大气简约健康实木地板生产企业网站模板源码 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代,企业的在线形象直接关联到其市场竞争力。对于专注于生产高品质、健康环保实木地板的企业而言,一个专业、大气且能完美展示产品特色的官方网站尤为重要。为了满足这一需求,我们精心打造了一款“自适应大气简约健康…

Chromium CI/CD 之Jenkins实用指南2024-如何创建新节点(三)

1. 前言 在前一篇《Jenkins实用指南2024-系统基本配置(二)》中,我们详细介绍了如何对Jenkins进行基本配置,包括系统设置、安全配置、插件管理以及创建第一个Job。通过这些配置,您的Jenkins环境已经具备了基本的功能和…

Qt基础 | Qt Creator的基本介绍与使用 | 在Visual Studio中创建Qt项目

文章目录 一、Qt Creator的基本介绍与使用1.新建一个项目2.项目的文件组成3.项目文件介绍3.1 项目管理文件3.2 界面文件3.3 主函数文件3.4 窗体相关的文件 4.项目的编译、调试与运行 二、在Visual Studio中创建Qt项目 Qt C开发环境的安装,请参考https://liujie.blog…

HTTP背后的故事:理解现代网络如何工作的关键(一)

一.HTTP是什么 概念 : 1.HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议。 2.HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 3.HTTP 往往是基于传输层的 TCP 协议实现的 . (HTTP1.0, HTTP1.1, HTTP2.0 均为 T…

使用 HttpServlet 接收网页的 post/get 请求

前期工作:部署好 idea 和 一个 web 项目 idea(2021),tomcat(9) ->创建一个空的项目 -> 新建一个空的模块 -> 右键单击模块 选择 Add..Fra.. Sup.. -> 勾选Web App...后点击OK -> 点击 file - Project Struc... -> 选择刚刚的模块 -> 点…

Centos 使用nfs配置共享目录使docker集群所有容器日志统一主机访问

Centos 使用nfs配置共享目录,使docker集群所有容器日志统一存放在主机一个共享目录下,供开发人员访问查看 准备两台或以上Centos服务器 192.168.0.1 nfs服务器 192.168.0.2 nfs客户端 以root用户登录192.168.0.1服务器,执行以下操作 注意先…

vue里完成一个简单的评论功能,博客必备

效果展示 步骤 1-表单收集输入信息 <div class"commentorInfo"><div style"position: relative"><i class"fa fa-user"style"position:absolute;top: 50%;transform: translateY(-50%)translateX(8px)"></i>…

大语言模型诞生过程剖析

过程图如下 &#x1f4da; 第一步&#xff1a;海量文本的无监督学习 得到基座大模型&#x1f389; &#x1f50d; 原料&#xff1a;首先&#xff0c;我们需要海量的文本数据&#xff0c;这些数据可以来自互联网上的各种语料库&#xff0c;包括书籍、新闻、科学论文、社交媒体帖…

Java 客户端操作 Redis 命令(端口号映射方法,命令演示,注意事项)

文章目录 开放端口号问题引入依赖验证连接通用命令使用set 和 get 命令的使用exists 和 del 命令的使用keys 命令的使用expire 和 ttl 命令type 命令的使用 String 类型命令使用mset 和 mget 命令getrange 和 setrange 命令append 命令incr 和 decr 命令 list 类型命令使用lpus…