电子电器架构刷写方案——General Flash Bootloader

电子电器架构刷写方案——General Flash Bootloader

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。

注:文章1万字左右,深度思考者入!!!

老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:

屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节能减排。
无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事.而不是让内心的烦躁、焦虑、毁掉你本就不多的热情和定力。

文章大体有如下内容:

1、简介

2、刷写系统概述

3、Flash Bootloader刷写流程

4、Flash Bootloader架构介绍

5、关于刷写的思考

正文如下:

一、Bootloader简介

首先基于现在整车电子电气架构中ECU类型,大体分为两类:

MCU(常规MCU)具备硬实时,应用Classic AUTOSAR软件架构;

MPU,具备操作系统,应用上多使用Adaptive AUTOSAR软件架构或者自研;

那相应对于Bootloader介绍也分为:

1、MCU Bootloader是微控制器(MCU)中的引导程序,它的设计旨在解决程序升级问题,尤其是在产品稳定投产、程序烧录后,MCU被外壳等材料覆盖,无法通过烧录口进行升级的情况下。Bootloader可以通过一定方式触发运行,比如按键触发或UDS协议指令(在汽车行业中)触发。一旦Bootloader运行,它可以通过串口接收新的代码并写入Flash,从而在不使用烧录器的情况下实现程序升级。

2、Bootloader,中文名称为系统启动加载器,是计算机系统从开机上电到操作系统启动过程中所需要的一个引导程序。在嵌入式Linux系统中,Bootloader也扮演着重要的角色。它是一段在操作系统内核运行之前运行的程序,主要负责初始化硬件设备、建立内存空间映射图,将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。

Bootloader的具体作用如下:

-> 1、提供初始的硬件设备的初始代码,以及检测和初始化单板;

-> 2、引导操作系统,包括定位、解压和加载操作系统到内存空间,然后将其控制权交给操作系统;

-> 3、当操作系统获取控制权后,嵌入式系统中的Bootloader就不复存在了。

此外,U-Boot是一款流行的功能强大的开源Bootloader项目。它支持多种嵌入式操作系统内核,如Linux、NetBSD、VxWorks等,也支持多种处理器系列,如PowerPC、ARM、x86、MIPS。U-Boot有较高的可靠性和稳定性,以及高度的灵活的功能设置,适合U-Boot调试、操作系统的不同引导要求、产品发布等。它还包含丰富的设备驱动源码和较为丰富的开发调试文档与强大的网络技术支持。

首先关于ECU刷写的软件架构Flash Bootloader并没有在AUTOSAR规范中有明确定义。原因是每家刷写策略基于自身需求不一致,没有必要在AUTOSAR规范中特定定义函数接口等信息。

基于整车不同域,使用场景不一样,就会有不同的总线类型。因此在做ECU刷写时,也是通过不同的总线类型CAN,LNFlexRay or Ethernet)来完成软件的下载更新。

整车所有件基于相同的刷写流程,只是数据传输的总线载体不一样而已。

在研发阶段,可以随时进行应用程序(Application)的更新和下载可以随时为研发工程师随时进行下载调试更新等功能在车辆下线阶段,进行应用程序的刷写和灌注:在车辆售后阶段进行售后维护和升级

目前对于ECU更新方式:

1、刷写上位机通过OBD口,相当于传统的Flash更新方式进行更新;

2、另外是通过OTA,基于OTAMaster 对车内节点进行更新;

image

上述刷写方式不需要通过更换硬件ECU来完成软件的更新,对于软件bug或者功能升级,在硬件不需要更新的情况下,可以直接通过更新Application功能实现功能升级对于量产的ECU产品,可以不通过传统的调试接口UTAGDAP2)来完成Fash 的刷写这个时候调试口已经关闭,通过OBD口升级提供一种更好的方案对于车内的ECU来讲,通过一套协议(UDS)即可完成全部ECU的刷写需求在一定程度上,保证了刷写过程中的安全性和合法性。

image

通过上位机加载待刷写的Flash Data/Driver,不用通过烧录口就可以进行software update,对用户而言更加友好。

二、系统概述

诊断仪通过OBD诊断口和网关ECU进行连接,实现诊断刷写和路由功能:每个ECU的内存布局都是基本类似,包含了三大部分 Flash Bootloader.Flash Driver 和Application.

image

Flash Bootloader实现总线通信基于ISO标准和OEM企标,实现诊断服务功能Application调用Flash Driver 接口来对Fash进行擦写操作一般情况下,代码仅在轮询模式下运行的中断仅在一些特殊需求下才会用到,一般代码精简短小,占用空间资源不大.

image

用于擦除和写入数据的Driver,通常是在RAM中执行调用的,是片内片外的驱动程序可对Hash 进行擦除和写入,可将数据写入Flash中。

-> 通过驱动调用擦除接口,可以对内存地址进行擦除,将地址上旧数据进行擦掉;

-> 在数据写入阶段可以调用驱动的写入接口,实现对新数据在擦除后的地址进行写入操作,不同的芯片厂家和硬件平台,flash driver 是有所不同的。

根据 Flash 芯片不同,不同点主要体现如下两点:

1、不同的擦写参数(Sectors/Pages): 擦除和写入的Sector 和page 大小不一样2、存储保护机制(ECC);

对于第一点(擦写参数(Sectors/Pages)是指在擦除或重写存储设备中的数据时所使用的单位。不同的存储设备可能有不同的擦写参数,这些参数可能会影响擦写性能和寿命。

在闪存设备中,擦写参数通常是以扇区(Sector)或页(Page)为单位进行操作的。扇区通常是一个存储单元,可以容纳一定数量的数据,而页是闪存设备中一个最小的可擦除单位。

对于不同的闪存设备,擦写参数可能会有所不同。例如,一些设备可能有 2KB的页大小,而另一些设备可能有 4KB 或 8KB 的页大小。此外,一些设备可能支持不同的擦写策略,例如一次擦写一个扇区或一次擦写多个扇区。

这些不同的擦写参数可能会影响闪存设备的性能和寿命。例如,如果一个设备的页大小较小,那么在执行写入操作时,可能会需要进行更多的读-改-写操作,这可能会导致性能下降。此外,如果一个设备的擦写策略过于频繁地擦除同一区域的数据,那么这个区域的寿命可能会比其他区域更短。因此,选择正确的擦写参数对于优化闪存设备的性能和寿命非常重要。这需要根据具体的应用需求和设备特性进行选择。

对于第二点:(存储保护机制(ECC)是一种用于Nand Flash 的差错检测和修正算法,它能够确保数据的可靠性。

在Nand Flash的每个页面上,包括额外的存储空间,即64个字节的空闲区(每512 字节的扇区有 16 字节)。这个空闲区能存储 ECC 代码及其它信息,例如磨损评级或逻辑到物理块映射。在编程操作期间,ECC单元根据扇区中存储的数据来计算误码校正代码。数据区的ECC代码然后被分别写入到各自的空闲区。当数据被读出时,ECC代码也被读出,运用反操作可以核查读出的数据是否正确

image

如果有数据错误,ECC 算法可以校正数据错误。能校正的错误的数量取决于所用算法的校正强度。软件通常负责磨损评级或逻辑到物理映射,并且如果处理器不包含ECC 硬件的话,软件还需要提供 ECC 码。

芯片内部对数flash driver存放位置:

-> 1、UTSAR转化为加密的二进制数组文件并对文件进行加密存储在FIashBootloader 中的指定Flash 区域,调用前先解密目的是防止flash误操作,误调用,比如用户程序(Application 调用flashdriver 接口,对某-块区域进行调用擦写),添加加密策略,就保证了只有 Bootloader 具备解密能力,才可以调用Flash driver;

-> 2、刷写Application之前通过诊断仪载入到 RAM中上述操作是先通过诊断仪将 flash driver 下载到指定的区域(RAM 区域),下载完成后Bootloader 才可以调用相应的接口实现对内存的擦除和写入。ECU 复位或者断电后 flashdriver就不再存在,避免安全问题。

image

三、Flash Bootloader刷写流程

本文仅描述通用性刷写流程,不同OEM或多或少有一定的差异如上图,当前假设只有FBL程序,没有Application(用户程序)。ECU上电后运行在Bootloader当中,Tester 通过相应的接口卡

举例常用的:

CAN总线用VN16 系列;

DoIP用VN56系列。

image

这样刷写上位机与待刷写 ECU 建立连接,通过UDS 协议刷写上位机与 ECU 进行相应的数据交互,主要读取一些所需要的诊断版本信息数据。接下来就是将用户程序数据通过刷写上位机传到ECU相应的地址处进行刷写。数据传输并写入完毕,Bootloader 会对数据进行校验,其中包含对单独每一个 block 以及整体的数据进行校验上述完毕后,对App有效标志位进行操作置位,后续复位。复位操作首先在FBL中查阅应用数据flag 位是否置位,判断有效后就会跳到用户程序中在Application中运行正常。后续有新的刷写请求,会继续运行至FBL中。对于刷写流程大体分为三步:

image

A:Pre programming

首先切换至编程会话模式,进行Programming Pre-condition状态检查(车速、挡位等);

关闭DTC功能

对常规通信报文进行设置,只接收诊断报文

目的是让ECU全负荷为刷写服务。

image

切换至编程会话模式写入一些DID和读取DID操作这些操作与OEM企业标准强相关。在定义刷写流程中明确每一步执行的内容和目的。信息安全要求过Service27,表示通过争取途径获取访问权限。

image

1、Request Service 34报文格式中会体现下载数据长度、是否压缩等信息;、

image

2、通过Service36/37完成数据的整体传输3、数据传输完成后,会执行 Service 31,对下载数据做完整性校验,数据丢失、错位等失真情况。

image

Flash Driver后会通过Service 31RID(猜出FF00)调用对内存擦除的接口实现对ECU内存的擦除操作。想要写入新的数据之前,必须对数据做擦除操作后才可以进行写入。

image

image

如上图,Vector 中国关于Fash Bootloader 产品手册的截图关于 Flash Bootloader 工程主要分为几大部分:

1、通信协议栈主要用于实现不同总线的通信需求,如图支持车载CAN 总线/LIN 总线/Flexray总线/车载以太网

2、OEM Download Manager主要是基于OEM企标要求做代码功能实现:A:OEM 定义的刷写流程(在 Bootloader 模式下)所使用到的诊断服务、子服务所支持的DID/RID/NRC信息都在这个模块做功能实现;

3、Fash bootloader 用户程序读取一些软件版本号、NVM存储应用,小模块上述流程也完全符合AUTOSAR开发流程。包含CAN、LIN早期协议栈是GENY做配置,现在是用Dawinciconfigurator定义pdur、CANdRIVER。当前 Bootloader 中也包含了一些非AUTOSAR定义的内容,这个时候需要由 Bootloader软件服务商自己OEM特定需求做定制化开发。也就是日常所说的购买成熟协议栈使用。

4、Bootmanager为芯片一级boot,是ECU 上电后第一个执行的代码,由该模块负责ECU该往那个代码模块跳比如进入 Bootloader还是Application(常见刷写成功后置位Flash位作为下次启动的判定标准)当需要对FlashBootloader做更新时,就需要由Bootloader Updater 来实现,其实这个逻辑也可以对照SBL/PBL,当有Super SBL时,也可以允许对PBL做擦除。

5、为了完成刷写功能,用于UI界面加载Flash Driver/Flash Data,也执行刷写template定义刷洗序列。

image

FBL和Application之间的跳转ECU上电后,代码运行会进入到FBL中,做相应的一些ECU初始化,初始化完成后会进入判断刷写标志位的一个步骤。若刷写标志位有效,进入到Boot 中,若标志位无效,进入App 中。FBL跳转至ApplicationFBL初始化

A:检查刷写标志位

B:检查Application的有效标志位

C:跳转至Application的入口

D:执行Application的启动代码

image

Application跳转至FBL

Application 运行中接收到诊断仪发出的诊断刷写请求

Application 将刷写请求标志位存入NVM 或者RAM中

Application 执行复位操作

FBL检查诊断刷写标志位

image

另外关于Stay In Boot功能:

在Application无法接收和处理诊断请求时,避免ECU无法进行刷写更新并不是所有的OEM都会用到,通常情况下,用于研发阶段,量产中可能也会用(影响启动时间)。该功能应用场景是在某一次更新当中把新的APP更新到ECU中。此时APPdata没有经过很充分的认证导致APP 软件中有 bug,比如有死循环 (While)。每一次ECU 上电,先进入boot,在进入app,死循环无法与诊断仪(刷写上位机)做诊断数据交互,发送请求也没有响应。

这个时候通过其他方式来规避这个风险,vFlash也支持,对ECU启动时间有影响。

image

当收到Stay in boot message进入Stay in boot状态,避免ECU编程板砖。

image

image

image

关于ECU安全启动

对于Flash Data会存在片内或片外,会有可能被不法分子做篡改的风险。

通过安全启动获知该ECU 是否App data 是否被篡改、是否无效等,保证车辆安全ECU一上电,通过HSM,HSM 可以理解位信息安全的加密引擎,对FBL做源码校验,通过特定算法和 key 计算出一个 MAC 值(消息认证码)。这个消息认证码与原本存在芯片中的消息认证码进行比较:

若一样,FBL valid。不一样:FBL被算改了!

同样策略也可以对APP做mac检验,开启ECU时计算一个MAC值对比ECU内部存储的就可以确认APP是否有效安全启动每一家芯片供应商都有自己的做法

HSM(硬件安全模块)对于实现AUTOSAR系统的加密保护起着重要作用。随着汽车电子控制单元(ECU)连通度的提高,安全和防范外部威胁的重要性日益增加。HSM具有适当的固件,即使在资源不足的情况下,也能保证系统的加密。此外,HSM还允许在单独的处理器上计算密码,以满足实时需求。因此,HSM在AUTOSAR系统中发挥着关键作用,确保了系统的安全性和实时性能。

image

为了传输数据增加速度,会在刷写过程中支持压缩数据传输。这点功能的本质是降低数据传输时间,在Server端会有还原步骤,整体刷写时间增加还是降低主要看还原时间。

image

数据传输步骤如下图:

image

原则上对于Flash Bootloader只能在供应商下线时候做烧录下载后便不再更新,但是极少特殊情况也是可以对Flash Bootloadr进行更新。

image

更新步骤如下:

image

搁笔分享完毕!

愿你我相信时间的力量

做一个长期主义者!

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

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

相关文章

python心理学实验程序_心理学实验程序编程(python)

任务一:实现简单的屏幕的颜色之间的切换 importpygamefrom pygame.locals import *pygame.init() win pygame.display.set_mode((800,600),DOUBLEBUF|HWSURFACE)for i in range(10): win.fill((0,255,0))if i%20: win.fill((255,0,0)) pygame.time.wait(500) pygame…

Hbase介绍

1、为什么出现hbase?hadoop 的NameNode适合大文件,不适合小文件。HDFS不适合大量小文件的存储,因namenode将文件系统的元数据存放在内存中,因此存储的文件数目受限于 namenode的内存大小。HDFS中每个文件、目录、数据块占用150Byt…

math 向上取整_自我说明:关于Math和File类的具体说明.

Math类:Math类,不允许有子类,它直接继承于object.Math类包含执行基本数字运算的方法.如基本指数,对数,平方根和三角函数.Math的基本方法:System.out.pintln(“1.绝对值:”Math.abs(16)”t”Math.abs(-16)”…

眼图 非差分线_LVDS低电压差分信号简介

LVDS低电压差分信号简介1. 名词解释1.1. 背景随着数据传输速率越来越高,现在计算机系统中的数据传输接口基本上都串行化了,像USB、PCIe、SATA、DP等等外部总线将并行总线挤压到只剩下内存总线这个最后的堡垒。当然,就算是并行传输总线最后的倔…

无内存在优盘可以启动计算机吗,没有U盘不要紧,内存卡做启动盘装Win7方法

现在最流行的win7系统安装方法大多以U盘来安装,那么如果你没有U盘呢?为了安装个Win7系统是不是要去买个U盘?当然不用,如果你还有空闲不用的手机内存卡,那么也是可以制作U盘启动盘来安装Win7系统的。准备工具&#xff1…

spyder python调试_使用spyder编译器单步调试python

1、将需要进行单步调试的函数在脚本中进行调用(十分重要的一步)。由于python是解释型语言,在进行单步调试的时候需要告诉系统你使用了这个函数,单步调试才会进入你所需要调式的函数。如下图所示,我们定义了createDataS…

label qt 自动换行_QT编写一个登录界面

前言继上篇:一起学Qt之基础篇---入门今天上手实操用QT编写一个登录界面~系统权限这个词大家肯定不陌生,你进入一个网站也是,如果不登录,就是以游客的身份进去的,要想看到某些信息肯定需要进行登录,更完善的…

我的世界服务器怎么修改书与笔,我的世界书与笔怎么做 我的世界书与笔怎么用...

第一步先收集甘蔗,然后合成纸,甘蔗在河边,池塘边,沼泽地一般都会生成,我们也可以拿回家种植,但是甘蔗必须种在水边,其他地方种植不了,其他地方玩家怎么右键甘蔗都是没有反应的。第二…

虚拟机 服务器 root,虚拟机切换到root账户

虚拟机切换到root账户 内容精选换一换一、安装虚拟机1、下载VMware workstation 14 ,安装时按照默认配置安装2、下载ubuntu-18.04.1-desktop-amd64.iso镜像文件3、打开 VMware workstation ,新建虚拟机4、配置虚拟机内存,磁盘,网络…

每一行末尾添加分号

文本内容如下: TMP_TBX_100_0_A1 TMP_TBX_100_0_A10 TMP_TBX_100_0_A12 TMP_TBX_100_0_A13 TMP_TBX_100_0_A14 TMP_TBX_100_0_A15 TMP_TBX_100_0_A15_2 TMP_TBX_100_0_A16 TMP_TBX_100_0_A17 TMP_TBX_100_0_A18 TMP_TBX_100_0_A19 TMP_TBX_100_0_A19_2 TMP_TBX_100…

壮观霉素抗性基因原理_基因组学深入挖掘·研究方案(下篇)

前情回顾上次小编为大家讲解了四种以基因组为基础的多组学联合研究方案(基因组与转录组,深入挖掘基因表达信息;基因组联合代谢组与转录组,锁定关键通路;基因组与群体进化,解析物种发展历程;基因…

Spark 常见问题小结

原文地址:http://www.aboutyun.com/thread-9946-1-1.html -------------------------------------- 问题导读 1、当前集群的可用资源不能满足应用程序的需求,怎么解决? 2、内存里堆的东西太多了,有什么好办法吗? …

Kafka.net使用编程入门(一)

最近研究分布式消息队列,分享下! 首先zookeeper 和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeeper3\conf\zoo.cfg 以下是kafka的配置 D:\Worksoftware\Apachekafka2.11\config\server.propert…

python包路径有几个_python的搜索路径与包(package)

python的搜索路径其实是一个列表,它是指导入模块时,python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功,否则导入失败: >>> importsys>>>sys.path [, C:\\Python33\…

配置文件管理服务器,06-配置文件管理

1配置文件管理设备运行于FIPS模式时,本特性部分配置相对于非FIPS模式有所变化,具体差异请见本文相关描述。有关FIPS模式的详细介绍请参见“安全配置指导”中的“FIPS”。1.1 配置文件简介配置文件是用来保存配置的文件。配置文件主要用于: …

虚拟机安装spark配置推荐

如果虚拟机配置的内存太少,spark运行计算的时候会报: WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster uito ensure that workers are registered and have sufficient memory 资源不足的问题,导…

Linux常用命令——chattr、lsattr

chattr 改变文件的扩展属性 语法格式:chattr 【option】【mode】【files】chattr [选项] [模式] [文件或目录]注意:chattr 命令及后面的选项和文件里,每个元素之间都要至少要有一个空格参数选项: 参数选项解释说明-a只能向文件中…

两个相邻盒子的边框怎么只显示一个_【前端小课堂】0044 盒子

这是一个面向零基础的前端教程,很简单,用零散时间就可以学习。 推荐早上读一下,晚上复习一下,如果可以奢侈一点,白天稍微练习一下下,总共花费 5~15 分钟。就酱!已经好几次提到块(block)元素了&a…

scala apply方法 笔记

原文出处:http://blog.csdn.net/pzw_0612/article/details/48576569 ----------------------------------------------------- Scala比Java更面向对象的一个方面是Scala没有静态成员。替代品是,Scala有单例对象:singleton object。 当单例对…

转:6.1海量数据处理

本文转自看云,原文地址请移步:https://www.kancloud.cn/kancloud/the-art-of-programming/41608 偶然闲游,偶遇某一站点,发现这里写的关于海量数据处理相关的思路还挺不错,所以在这里采摘收藏,如有侵权之处还请评论区或…