zoukankan      html  css  js  c++  java
  • 基于UDS的BootLoader

    bootloader程序架构略有简化的bootloader图

    这张图和恒润教程中的BootLoader流程大体是一致的。

    疑问点

    Q:图中的烧写顺序是34-36-34-36-34-36-37,但另一些材料中的顺序是34-36-36-36-37。

    A:这个问题这样理解,34-36-36-36-37的前提是你要下载的数据是连续的数据,每个36所使用的地址信息,都是34中包含的地址信息再加上一定的偏移量。如果需要下载不连续的数据,就需要重新进行34服务或31(擦除)-34服务。

    1 为什么要搞Bootloader?为什么要基于UDS搞Bootloader

    假如你的控制器有外壳,却没有设计bootloader的话,每次更新ECU的程序,你都需要把外壳拆开,用烧写器来更新程序。有了bootloader,你就可以通过CAN线来更新程序了。更方便些的话,甚至可以通过OTA进行远程升级。

    那为什么使用UDS呢?主要是为了规范bootloader的全过程。比如烧写小明牌ECU时,我们肯定希望其他牌子的ECU处于一个静默的状态,都歇一歇,这就需要一个大家共同执行的标准来进行规范,什么时候停发数据,什么时候不能再储存DTC了等等。

    又比如在调试时,大家肯定希望你的控制器经由CAN烧写的过程是大家都能看得懂的,是满足于某种规范的。由此,UDS在设计时考虑了bootloader的需求,专门为bootloader设计了几个服务,供大家使用。主机厂在发需求时自然就要求大家要在UDS规范的基础上完成bootloader功能了。

    2 Bootloader应支持的UDS服务

    显然bootloader不需要支持19/14等故障类服务。

    在boot程序中,10/27/11/3E这样的基础诊断服务需要支持,22/2E读写DID的服务需要支持,31/34/36/37这4个bootloader主打服务需要支持,共10个。

    在app段程序中,85和28服务需要支持,保证暂停CAN正常通信,暂停记录DTC,让被升级设备专心升级。

    10种boot段服务+2种app段服务

    3 Bootloader——三段式

    (1)预编程阶段

    1. 3E TP报文。

    2. 10服务切换到03扩展模式。

    3. 85服务和28服务,关DTC和非诊断报文。使整个CAN网络处于安静的状态。这是对整车网络进行操作的,一般都是以功能寻址的方式来发送。注意先用85服务关闭DTC,再使用28服务关报文。

    (2)主编程阶段

    1. 10服务切换到编程模式,这里要注意,正确的方式是App段程序回复0x78 NRC,接下来跳转到boot段程序,最后由Boot段程序来回复10 02的肯定响应。错误的方式是由App段回复10 02的肯定响应,再进行跳转。

    2. 读取一个DID,tester要判断一下返回值。返回值里面可能包含密钥的一部分信息。

    3. 27服务,解锁,通过安全验证。

    注意10 02服务不应直接进行肯定响应,存在风险

    4. 写DID指纹,标记写软件人的身份,ECU回复写指纹成功。(根据OEM要求来执行)

    5. 31服务-擦除Flash。ECU肯定响应,擦除成功。

    6. 34服务,请求数据下载,ECU回复确认最大块大小。

    7. 36服务,开始传输数据。每个块传输完成后,ECU肯定响应。判断是否还有更多块需要下载。最多可以支持255个块。

    8. 37服务,请求退出传输。ECU肯定响应。

    9. 31服务-校验APP段程序,检查编程一致性/完整性。ECU肯定响应。校验成功。

    10. 若有更多块需要下载,重新执行31(擦除Flash区域)-34-36-37-31(校验)服务。若无,往下执行。

    11. 11服务,ECU复位。之后应直接跳转到新下载的APP段程序中。

    31(擦Flash)-34-3636-37-31(校验)

    (3)后编程状态

    1. 10服务切换到03扩展会话。

    2. 执行28服务和85服务,使能非诊断报文和DTC。这是对整车网络进行操作的,一般都是以功能寻址的方式来发送。注意先执行28,后执行85,避免DTC误报。

    3. 27服务,安全校验,准备写入数据。

    4. 2E服务,将编程信息写入到ECU中。

    5. 10服务,退回01默认会话。结束。

    4 BootLoader的启动顺序与转换流程

    以下流程仅作为参考,有很多不规范之处。欢迎大家留言探讨。

    1. ECU上电或复位后,先进入Boot段。从Flash/EEPROM中读取 App有效标志,运行boot标志 。

    2.判断 运行boot标志 ,若为1,则进入Boot段的编程会话(安全等级为上锁),之后写Flash/EEPROM(不安全操作), 运行boot标志 清零。若S3定时器超时则退回Boot段默认会话。

    3. 经过安全访问进入Level2解锁状态,开始执行App内存擦除,擦除后 App有效标志 清零(不安全操作)。

    4. 开始烧写。烧写成功后 运行boot标志 写0,App有效标志 写1。

    2*. 判断 运行boot标志 ,若为0,则进入Boot段的默认会话。

    3*. 50ms后判断 App有效标志 ,若为1,则 跳转到 App段默认会话。实现时使用汇编指令执行APP段程序;若为0,退回Boot段默认会话,且不再判断 App有效标志,不会再尝试进入App段。

    4*. App段程序若收到了编程会话请求, 运行boot标志写1 ,随即执行ECU复位,这样会重新进入boot段程序。

    注:从BOOT跳入APP前需要判断APP的数据完整性,例如进行CRC校验。

    5 问题点

    Q:假如烧进去了不良App段程序,无法返回boot段程序怎么办?

    A:参照电脑的开机方式,在ECU开机之后,预留很短的一段时间维持在boot状态,在这段时间内,若收到指定报文(比如,电脑是按住F8),那么就不跳转到App段了。

    Q:运行boot标志和App有效标志为了安全起见,应该保存到哪里?

    A:运行boot标志可以放置在RAM中,由Boot和App共用。

    Q:上文图中的CAN数据实例,为什么出现了两次CRC的校验?CRC校验是对哪些数据的校验?

    A:OEM不希望ECU中保存有可以擦写Flash的代码,所以BootLoader需要在烧录App之前,先把擦写Flash的代码通过UDS烧写到RAM中,烧完了之后进行一下31服务下的CRC校验。之后烧录ECU的App程序,App可能会因为地址不连续而分为很多段下载。下载完毕后需要进行总的CRC校验。不管哪次校验,CRC所校验的数据是代码的数据段,即36服务中传输的有效数据。

  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/still-smile/p/12047654.html
Copyright © 2011-2022 走看看