【车载开发系列】UDS中Bootloader实现原理

news2024/11/24 5:54:51

【车载开发系列】UDS中Bootloader实现原理

【车载开发系列】UDS中Bootloader实现原理

  • 【车载开发系列】UDS中Bootloader实现原理
    • 一. Bootloader存放位置
    • 二. BootLoader的安全机制
      • 1)安全访问
      • 2)刷新预条件
      • 3)完整性校验
      • 4)一致性检查
      • 5)有效性检查
      • 6)刷新文件格式
    • 三. bootloader与应用程序的关系
    • 四. bootloader到应用程序的跳转方法
    • 五. BootLoader跳转时机
    • 六. ECU BootLoader内存
    • 七. 汽车ECU的bootloader主要作用

一. Bootloader存放位置

通常在ECU在刷入bootloader后,bootloader是无法再次更新的,除非拆件。但是现在这越来越多的主机厂要求Bootloader也要支持刷写。Bootloader存储于被保护的flash区域,即使发生潜在错误时,控制器的应用软件始终可以刷新。

二. BootLoader的安全机制

为什么BootLoader需要安全机制?是因为有以下几种情况的发生。
a. 来自非法源的下载动作;
b. 当前刷新条件不满足;
c.下载错误的应用软件或应用数据到ECU;
d.软件之间不兼容;
而BootLoader中的安全机制有以下几种情况:

1)安全访问

ECU通过诊断0x27服务,SEED&KEY机制进行安全访问服务限制,保证ECU免遭未授权的编程动作影响。

2)刷新预条件

ECU确保刷新时处于安全状态,条件不满足(如高压上电、低压异常或车速高于预想值)时,刷新服务请求将被拒绝。

3)完整性校验

ECU对即将下载到flash的程序或数据进行完整性检查,当一个逻辑模块下载后,使用CRC32算法验证当前逻辑块的所有数据字节是否被正确传输和写入。
通过“检查编程完整性”例程控制激活ECU完整性校验。当ECU接收到此服务请求时,Bootloader将计算下载数据字节的CRC32值,并将计算结果与诊断仪请求报文中发送的校验值进行比较。
例程控制——31h 01h F0h 01h:此例程用来检查逻辑块的完整性。

4)一致性检查

不兼容的软件不能配合使用,如果配合使用可能会使功能异常或产生致命性错误。为此,ECU通过验证软件兼容性来检查刷新程序的一致性,包括应用软件与Bootloader软件、应用数据与应用软件检验等。
例程控制——31h 01h FFh 01h:一旦完成所有的应用软件或数据块/模块的下载,诊断仪将开始这个例程来触发ECU检查重刷新的一致性。

5)有效性检查

ECU内部有一个标志位,用于标识应用软件是否有效。如果刷新完整性检查和一致性检查都正确时,ECU才会设置应用软件的标志位为有效。只有标志位为有效时,应用软件才可以运行。

6)刷新文件格式

刷新文件格式为必须为下面三种中的一种:bin、s19、hex。
不同的MCU软件开发IDE编译链接生成的编程文件格式可能不同,但S19、HEX和BIN文件之间是可以相互转化的,所以只需要在bootloader中开一种编程文件的解析程序就可以了,其他的可以使用相应的转换工具(convert tool)在上位机上进行转换。
对编程文件的解析,目的在于获得应用程序的程序代码和数据及其在NVM中的存储地址。
(S19/HEX/BIN)都具有相应的校验和机制,所以可以采取直接传送程序编程文件行的方式;

三. bootloader与应用程序的关系

bootLoader和应用程序分别是两个完整的MCU软件工程,各自都由自己的启动代码、main()函数、链接文件、外设驱动程序和中断向量表组成。
在这里插入图片描述
因此bootloader和应用程序的链接文件对NVM的地址空间分配必须分开独立,不能重叠(overlap),但是对于RAM空间的使用,可以共有,没有必须要相互独立的要求。但是从应用程序跳到BootLoader或者反向跳转时,RAM里面的内容都将被初始化。

四. bootloader到应用程序的跳转方法

开发使用bootloader后,每次ECU复位之后都将首先运行bootloader,若无远程应用程序下载请求则直接跳转到应用程序复位函数地址,这里面有两个问题需要考虑:如何获得应用程序复位函数地址:方法有:1)通过链接文件固定应用程序的复位启动函数地址;2)从应用程序中断向量表的复位向量地址获取;一般推荐使用方法2,因为其灵活性好,每次应用程序变化后无需关心应用程序复位函数被编译到了NVM的具体地址,只需要将应用程序中断向量表中的复位向量取出运行即可。

五. BootLoader跳转时机

跳转时机有两个。其一bootloader更新完应用程序并校验其完整性OK之后,将用到的外设(比如CAN/LIN通信总线模块、定时器、GPIO等)寄存器恢复到复位后的默认状态,然后直接跳转。其二bootloader更新完应用程序并校验其完整性OK之后,等待看门狗定时器超时溢出复位,在bootloader最开始判断无远程应用程序下载请求而跳转。以上两个方法当中,我们推荐使用第二种方法。因为因为方法1相对于软件复位,其跳转至应用程序复位启动函数时MCU的硬件环境与直接运行应用程序可能存在差异,而方法2的看门狗复位则属于硬件复位,其会将绝大部分外设(模拟、时钟和外设)电路复位,更接近直接运行应用程序的情况。

六. ECU BootLoader内存

ECU的NVM一般包括MCU片内集成的用于存放数据的EEPROM或者Data-Flash;用于存储程序代码/数据的Code-Flash/Program-Flash;MPU扩展的片外NORFlash或者NAND-Flash;NVM驱动程序的作用包括对NVM的擦除(erase)、编程(program)和校验(verify)等基本操作;对NVM的加密(secure)/解密(unsecure)和加保护(protection)/解保护(unprotection)操作。
在这里插入图片描述

七. 汽车ECU的bootloader主要作用

ECU的BootLoader一共有三个主要的作用。1.与远程程序下载端建立可靠的总线通信以获取要更新应用程序;2.解析应用程序编程文件(S19/HEX/BIN)获得其在NVM中的地址和程序代码及数据;3.运行NvM驱动将应用程序的代码和数据编程到NVM中并校验;

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

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

相关文章

NextJS 引入 Ant-Design 样式闪烁问题

按照这里给的样例,抽出关键代码即可 步骤: 安装包: npm i ant-design/static-style-extract引入这俩文件 genAntdCss.tsx: 会帮我们生成 ./public/antd.min.css // src/scripts/genAntdCss.tsximport { extractStyle } from "ant-d…

从锁的类别角度讲,MySQL都有哪些锁

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

2024北京老博会,CBIAIE中国北京国际老年产业博览会

2024第11届中国(北京)国际老年产业博览会,将于4月10-12日盛大举行 2024第11届中国(北京)国际老年产业博览会(CBIAIE北京老博会) The 2024 eleventh China (Beijing) International Aged Indust…

【动手学深度学习-Pytorch版】长短期记忆网络LSTM

LSTM参数说明以及网络架构图 PS:时间仓促,有空补充内容~ LSTM从零开始实现 """ 遗忘门:相当于一个橡皮擦,决定保留昨天的哪些信息 输入门:相当于一个铅笔,再次根据昨天的记忆和今天的输…

【数据结构】list.h 详细使用教程 -- 附带例子代码

目录 一、概述二、详细使用步骤✨2.1 定义结构体包含 struct list_head 成员✨2.2 初始化链表头结点:INIT_LIST_HEAD✨2.3 添加结点:list_add、list_add_tail✨2.4 遍历链表:list_for_each、list_for_each_safe、list_for_each_entry✨2.5 获…

java double类型 向上取整,向下取整,四舍五入

向上取整:Math.ceil(double a) 向下取整:Math.floor(double a) 四舍五入取整:Math.round(double a) 直接取整数:intValue() public static void main(String[] args) {Double number 5.3;Double number1 5.8;//向上取整Doubl…

UE5 虚幻引擎 如何使用构造脚本(Construction Script)? 构造脚本的奥秘!

目录 1 构造脚本(Construction Script)1.1 介绍1.2 案例1:利用样条组件程序化生成树木1.2 案例2:利用样条组件和样条网格体组件程序化生成道路 1 构造脚本(Construction Script) 1.1 介绍 问题&#xff1a…

leetcode top100(20) 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,2…

腾讯mini项目-【指标监控服务重构】2023-08-24

今日已办 Jeager 功能 监控分布式工作流程并排除故障识别性能瓶颈追踪根本原因分析服务依赖关系 部署 部署 Deployment — Jaeger documentation (jaegertracing.io) 支持 clickhouse jaegertracing/jaeger-clickhouse: Jaeger ClickHouse storage plugin implementation …

Java8实战-总结34

Java8实战-总结34 重构、测试和调试使用 Lambda 重构面向对象的设计模式观察者模式责任链模式 重构、测试和调试 使用 Lambda 重构面向对象的设计模式 观察者模式 观察者模式是一种比较常见的方案,某些事件发生时(比如状态转变)&#xff0…

Java之转换流的详细解析

2. 转换流 2.1 字符编码和字符集 字符编码 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将…

docker容器安装MongoDB数据库

一:MongoDB数据库 1.1 简介 MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最 像关系型数据库(MySQL)的非关系型数据库。 它支持的数据结构…

封装一个高级查询组件

封装一个高级查询组件 背景一,前端相关代码二,后端相关代码三,呈现效果总结 背景 业务有个按照自定义选择组合查询条件,保存下来每次查询的时候使用的需求。查了一下项目里的代码没有现成的组件可以用,于是封装了一个 …

腾讯mini项目-【指标监控服务重构】2023-08-29

今日已办 Collector 指标聚合 由于没有找到 Prometheus 官方提供的可以聚合指定时间区间内的聚合函数,所以自己对接Prometheus的api来聚合指定容器的cpu_avg、cpu_99th、mem_avg 实现成功后对接小组成员测试完提供的时间序列和相关容器,将数据记录在表格…

相机One Shot标定

1 原理说明 原理部分网上其他文章[1][2]也已经说的比较明白了,这里不再赘述。 2 总体流程 参考论文作者开源的Matlab代码[3]和github上的C代码[4]进行说明(不得不说还是Matlab代码更优雅) 论文方法总体分两部,第一部是在画面中找…

李宏毅hw-9:Explainable ML

——欲速则不达,我已经很幸运了,只要珍惜这份幸运就好了,不必患得患失,慢慢来。 ----查漏补缺: 1.关于这个os.listdir的使用 2.从‘num_文件名.jpg’中提取出数值: 3.slic图像分割标记函数的作用&#xf…

【音视频流媒体】4、摄像头:分辨率、光圈|快门|感光度、焦距

文章目录 一、摄像头分辨率二、光圈、快门、感光度2.1 光圈2.1.1 外观2.1.2 光圈在相机中如何表示的2.1.3 对拍照的影响2.1.4 如何选择合适的光圈2.1.5 光圈在相机中如何设置 2.2 快门2.2.1 外观2.2.2 快门在相机中的表示2.2.3 快门对于拍照有什么影响2.2.4 选择合适的快门2.2.…

【C#】.Net基础语法一

目录 一、程序集信息 【1.1】Properties中AssemblyInfo文件 二、.Net程序的两次编译过程 三、.Net中命名空间和类 【3.1】引入命名空间 【3.2】修改默认的命名空间 【3.3】命名空间的总结 四、.Net中数据类型 【4.1】数值型 【4.2】非数值型 五、.Net中变量 【5.1】…

Selenium WebUI 自动化测试框架

框架结构 框架结构 框架基于 PO 模型进行设计,将页面元素与操作进行拆分,减少页面改动时的维护成本;同时使用 xsd 自定义 xml 标签,通过解析 xml 来驱动 selenium 进行执行,减少了一定的语言学习成本。 主要功能 基于…

[架构之路-221]:鸿蒙系统和安卓系统的比较:微内核VS宏内核, 分布式VS单体式

目录 一、鸿蒙系统和安卓系统的系统架构 1.1 鸿蒙系统的分层架构 1.2 安卓系统的分层架构 1.3 鸿蒙系统和安卓系统是操作系统吗? 二、鸿蒙系统和安卓系统的系统架构比较 2.1 它们与Linux操作系统的关系 2.2 架构比较 三、操作系统基础 3.1 微内核架构 3.2…