Bootloader Use Manual
目 录
Bootloader是一种用于嵌入式系统和汽车电子控制单元(ECU)的引导加载程序,采用了ISO-14229标准定义的统一诊断服务(Unified Diagnostic Services)。该引导加载程序允许通过标准化的诊断接口进行固件更新和恢复操作,确保设备在运行时能够安全且可靠地加载新固件。
当设备的应用程序出现问题或需要更新时,Bootloader提供了一种安全且可靠的方法,通过诊断接口实现固件的动态加载和更新,而无需中断设备的正常运行或拆卸产品。
应用软件和应用数据可以同时编程或者相互独立编程,通常在ECU刷刷入bootloader后,bootloader是无法再次更新的,除非拆件,不过现在这越来越多的主机厂要求Bootloader也要支持刷写。Bootloader存储于被保护的flash区域,即使发生潜在错误时,控制器的应用软件始终可以刷新。
2.1诊断会话服务(0x10)
诊断会话控制服务是为了开启不同的诊断会话。不同的会话模式是用来区分诊断服务执行的权限,而该服务正是为了实现会话模式的切换。即该服务可以通过控制ECU在不同的会话模式之间切换从而为ECU使能一组特定的服务以及功能。
UDS协议定义了三种会话模式:默认会话、编程会话、扩展会话。不同会话模式间可以互相切换,但在一个ECU中应该始终只有一个诊断会话处于活动状态。 ECU在上电时应始终启动默认会话。如果没有启动其他会话则默认会话将在ECU通电期间一直运行。
默认会话:当服务器处于默认会话状态,客户端请求进入默认会话时,服务器将完全重新初始化默认会话。在激活会话期间,服务器应该重置所有激活、启动、更改的设置和控制,不包括写在非易失性存储器。
其他会话:当服务器从除默认会话以外的任何诊断会话转换到另一个诊断会话时除了默认会话之外的会话(包括当前活动的诊断会话),那么服务器应该(重新)初始化诊断会话。
不同会话模式支持的服务范围不同,默认会话会有很多服务不支持。比如默认会话下不支持27、28服务等。
2.1.1请求消息定义SID$10
请求会话控制报文
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 诊断会话控制请求服务ID | M | 10 |
#2 | 子功能 = [诊断会话类型] 参考 “支持参数列表SID$10” | M | XX |
2.1.2响应消息定义 SID$10
肯定响应报文
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 诊断会话控制响应服务 ID | M | 50 |
#2 | 子功能 = [ 诊断会话类型] 参考 “支持参数列表SID$10” | M | 02 |
#3 | 会话参数值 [字节1] = P2CAN_Server_max (高位) | M | 00 |
#4 | 会话参数值 [字节2] = P2CAN_Server_max (低位) | M | 32 |
#5 | 会话参数值 [字节3] = P2*CAN_Server_max (高位) | M | 01 |
#6 | 会话参数值 [字节4] = P2*CAN_Server_max (低位) | M | F4 |
会话参数值定义
参数 | 参数名称 | 字节数 | 范围 |
P2_Server_max | ECU接收到请求到开始发送响应的最长允许时间。 | 2 | 0~65535ms |
P2*Server_max | 服务器返回增强的否定响应代码(NRC 7816)时,服务器所支持的最大响应时间。 | 2 | 0~65535ms |
说明:P2_Server_max = 0x0032 = 50ms
P2*Server_max = 0x01F4 = 500ms
ECU接收到诊断仪请求响应最长时间为50ms,当ECU返回78NRC,那么响应时间可以延长为500ms响应,该值根据客户需求而定。
否定应答
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 否定应答服务ID | Ma | 7F |
#2 | 诊断会话控制服务 ID | M | 10 |
#3 | 响应代码 = 参考 “错误响应定义SID$10” | M | xx |
2.1.3错误响应定义SID$10
应用模式
优先级 | 值 | 描述 |
1 (高) | 12 | 子功能不支持 |
不支持请求消息中的子功能。 功能寻址: HUD不回复。 | ||
2 | 13 | 报文长度错误 |
不支持请求消息中的长度。(正确的消息长度为2字节)。 | ||
3 | 22 | 条件不满足 |
当诊断会话控制请求的执行条件不满足时发送该否定应答代码 参考 “执行条件SID$10“ | ||
6 (低) | 78 | 请求正确接收-响应挂起 |
应答时间超过P2server/P2*server。 |
编程模式
优先级 | 值 | 描述 |
1 (高) | 13 | 报文长度错误 |
不支持请求消息中的长度。(消息长度小于2字节)。 | ||
2 | 12 | 子功能不支持 |
不支持请求消息中的子功能。 | ||
3 | 13 | 报文长度错误 |
不支持请求消息中的长度。(正确的消息长度为2字节)。 | ||
4 (低) | 7E | 子功能不支持在当前会话 |
在当前会话不支持请求消息中的子功能。 |
2.1.4支持参数列表SID$10
子功能 诊断会话类型
十六进制 | 描述 |
01 | 默认会话default session |
02 | 编程会话programming session |
03 | 扩展会话extern session |
04 | 安全系统诊断会话extended Diagnostic session |
2.2ECU重启服务(0x11)
客户端使用ECU重启服务来请求服务端复位。
2.2.1请求消息定义SID$11
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | ECU复位请求服务ID | M | 11 |
#2 | 子功能 = [复位类型] 参考支持参数列表SID$11 | M | XX |
2.2.2响应消息定义SID$11
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | ECU复位响应ID | M | 51 |
#2 | 子功能 = [ 复位类型]参考支持参数列表SID$11 | M | 00-7F |
2.2.3错误响应定义SID$11
优先级 | 值 | 描述 |
1 (高) | 12 | 子功能不支持 |
不支持请求消息中的子功能。 功能寻址: ECU不回复。 | ||
2 | 13 | 报文长度错误 |
不支持请求消息中的长度。(正确的消息长度为2字节)。 | ||
3 | 22 | 条件不满足 |
当诊断会话控制请求的执行条件不满足时发送该否定应答代码 | ||
4 | 78 | 请求正确接收-响应挂起 |
应答时间超过P2server/P2*server。 | ||
5 | 33 | 安全访问拒绝 |
如果请求复位当前服务不在解锁状态 |
2.2.3支持参数列表SID$11
Bit6 to 0 | 描述 | 约定 | 助记 |
00 | ISO RESERVED | M | 51 |
01 | HardReset硬重置(Hard Reset)是一种模拟ECU断开电源后重新连接的过程,即执行类似于上电/启动序列的操作。 | M | HR |
03 | softReset软重置(Soft Reset)是一种使服务器立即重新启动应用程序的子功能 | SR |
2.3安全访问服务(0x27)
安全访问服务目的是提供一种方式来访问数据和诊断服务,这些数据和服务因安全因素受到限制,通常需要进行安全访问服务解锁才可以访问这些数据和服务包括:下载/上传例程或数据到ECU,或从ECU读取特定的内存位置数据。安全解锁概念使用一个种子和密钥(seed and key)关系。
安全解锁流程:
第一步,诊断仪发送安全访问-请求种子.ECU根据内部算法计算出一组种子发送给诊断仪。
第二步,诊断仪计算正确的密钥发送计算完成的密钥返回给ECU。
第三步,ECU会比较诊断仪发送的密钥是否与本身计算的值是否相同,并反馈给诊断仪。
2.3.1请求消息定义SID$27
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 安全访问请求服务ID | M | 27 |
#2 | 子功能 = [ 安全访问类型= 请求种子 ] | M | XX |
子功能定义
Bit 6 to 0 | 描述 | 约定 | 助记词 |
01 | 请求种子 使用车辆制造商定义的安全级别发送种子。 | M | RSD |
02 | 发送密钥使用车辆制造商定义的安全级别发送密钥。 | M | SK |
03,05,07to41 | 重新请求种子使用车辆制造商定义的不同安全级别发送种子。 | M | RSD |
04,06, 08 to 42 | 重新发送密钥使用车辆制造商定义的不同安全级别发送密钥。 | M | SK |
2.3.2响应消息定义SID$27
安全访问类型 = 发送种子
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 安全访问 请求服务ID | M | 27 |
#2 | 子功能 = [ 安全访问类型= 发送种子 ] | M | XX |
#3 #4 #5 #6 | 密钥[]= [ 字节#1 字节#2 字节#3 字节#4 ] | M M M M | XX XX XX XX |
安全访问类型 = 发送密钥
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 安全访问 请求服务ID | M | 67 |
#2 | 子功能 = [ 安全访问类型= 发送密钥 ] | M | XX |
#3 #4 #5 #6 | 密钥[]= [ 字节#1 字节#2 字节#3 字节#4 ] | M M M M | XX XX XX XX |
2.3.3错误响应定义SID$27
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 否定应答 服务ID | M | 7F |
#2 | 安全访问 请求服务ID | M | 27 |
#3 | 响应代码 = 参考 “支持参数列表” | M | xx |
2.3.4支持参数列表SID$27
优先级 | 十六进制数 | 描述 |
1 (High) | 7F | 服务不支持在当前会话 |
在当前会话下不支持该服务。 | ||
2 | 13 | 报文长度错误 |
长度 不支持。 (信号长度小于2。) | ||
3 | 12 | 子功能不支持 |
收到的子功能不支持 | ||
4 | 7E | 子功能不支持在当前会话 |
在当前会话不支持请求消息中的子功能。 | ||
5 | 13 | 报文长度错误 |
长度不支持。(正确长度等于2。) | ||
6 (Low) | 37 | 所需时间延迟未过期 |
发送是延迟计时器处于活动状态,请求被发送。 |
2.4路由控制服务(0x31)
路由控制服务通过定义好的步骤标识符获得相关结果。该服务具有很大的灵活性,典型的用法是擦除内存,检查内存校验。此服务用于复杂的类型控制。
2.4.1 请求消息定义SID$31
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 程序控制请求服务ID | M | 31 |
#2 | 子功能 = [ 程序控制类型 ] | M | XX |
#3 #4 | RID [] = [ 字节 #1 字节 #2 ] | M M | XX XX |
#4 + 1 #4 + m | 程序控制选择记录[ ] = [ 程序控制Option #1 : 程序控制Option #m ] | C : C | XX : XX |
子功能服务列表
数据字节 | 子功能 | 描述 | 约定 |
#1 | 01 | 启动程序 | M |
#2 | 02 | 停止程序 | M |
#3 | 03 | 请求程序运行结果 | M |
RID类型列表
数据字节 | RID名称 | 描述 | 约定 |
#1 | 0202 | 检查内存 | M |
#2 | 0203 | 检查预编程条件 | M |
#3 | 0102 | 检查编码状态 | M |
#4 | FF00 | 擦除内存 | M |
#5 | FF01 | 检查编程依赖 | M |
2.4.2 响应消息定义SID$31
肯定应答
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 程序控制 应答 服务ID | M | 71 |
#2 | 子功能 = [ 程序控制类型 ] 参考 “支持的参数列表 SID$31” | M | XX |
#3 #4 | RID [] = [ 字节#1 字节#2 ] | M M | XX XX |
#5 | RID[] = [ 控制状态 ] | M | XX |
2.4.3 错误响应定义SID$31
数据字节 | 参数名称 | 约定 | 十六进制数 |
#1 | 否定应答 服务ID | M | 7F |
#2 | 程序控制 请求服务ID | M | 31 |
#3 | 响应代码 = 参考 “错误响应定义 SID$31” | M | xx |
2.4.4 支持参数列表SID$31
优先级 | 十六进制数 | 描述 |
1 | 13 | 报文长度错误 |
长度不支持. (请求长度小于4字节。) | ||
2 | 31 | 请求超出范围 |
HUD 不支持该RID。 | ||
3 | 12 | 子功能不支持 |
子功能参数不支持。 | ||
4 | 22 | 报文长度错误 |
长度不支持。 (正确长度是4字节。) | ||
5 | 78 | 请求正确接收-响应挂起 |
应答时间超过P2server/P2*server。 | ||
6 | 33 | 安全访问拒绝 |
客户端发送有效安全例程标识的请求,并且当前ECU安全特性处于活动状态,则发送NRC | ||
8 | 24 | 请求序列错误 |
当开始路由子功能接收,发现当前任务正在执行此任务无法重新启动 |
2.5请求下载服务(0x34)
请求下载服务是用来客户端(通常是诊断工具或编程设备)向服务端(通常是ECU)发起数据传输请求。此服务启动一个从客户端到服务器的数据传输过程,用于更新或更换服务器上的固件或配置数据。
工作流程:客户端发送请求消息给ECU,消息格式识别信息和传输参数。ECU接收到请求后准备接收数据并执行必要的初始化操作。ECU发送一个正响应给客户端,表示可以开始传输数据。
2.5.1 请求消息定义SID$34
请求下载刷写驱动
数据字节 | 参数名称 | 十六进制值 |
1 | 请求下载 请求服务ID | 34 |
2 | 数据格式标识符参数 = [参考 “支持的参数列表 SID$34” ] | 00 |
3 | 地址和长度格式标识符参数 = [] | 44 |
4 5 6 7 | 地址 [] = [ 字节 #1 (MSB) 字节 #2 字节 #3 字节 #4 (LSB) 参考 “支持的参数列表 SID$34” ] | 00 00 00 00 |
8 9 10 11 | 长度 [] = [ 字节 #1 (MSB) 字节 #2 字节 #3 字节 #4 (LSB) | 00 00 04 E8 |
地址和长度格式标识符参数
十六进制值 | 描述 |
44 | 存储器尺寸参数的长度(位7-4): 0x04 存储器地址参数的长度(位3-0) : 0x04 |
数据格式标识符参数
十六进制值 | 描述 |
00 | 不压缩不加密 |
地址
十六进制值 | 描述 |
00000000 | 下载的起始地址为0x00000000 |
长度
十六进制值 | 描述 |
00004E8 | 长度为1256byte |
2.5.2 响应消息定义SID$34
肯定响应
数据字节 | 参数名称 | 十六进制值 |
1 | 请求下载 应答 服务ID | 74 |
2 | 长度合适标识符参数 | 20 |
3,4 | 最大发送长度[] = [ 字节 #1 (MSB) 字节 #2 ] | 0F FF |
长度合适标识符参数
十六进制值 | 描述 |
20 | 位7-4: 最大长度参数的长度是2字节. 位3-0: 定值0 |
10 | 位7-4: 最大长度参数的长度是1字节. 位3-0: 定值0 |
最大发送长度
十六进制值 | 描述 |
0FFF | 最大发送长度为4095byte |
0080 | 最大发送长度为128byte |
2.5.3 错误响应定义SID$34
否定应答
数据字节 | 参数名称 | 十六进制值 |
1 | 否定应答 服务ID | 7F |
2 | 请求下载 请求服务ID | 34 |
3 | 否定应答码= [ 参考 错误响应定义 SID$34 ] | xx |
2.5.4 支持参数列表SID$34
优先级 | Hex | 描述 |
1 (High) | 7F | 服务不支持在当前会话 |
在当前会话下不支持该服务。 | ||
2 | 33 | 安全访问错误 |
在未解锁状态。 | ||
3 | 13 | 报文长度错误 |
长度不支持. (长度小于11字节.) | ||
4 | 31 | 请求超出范围 |
数据格式标识符参数无效 地址和长度格式标识符参数无效. 地址或者长度值无效(参考 “支持的参数列表 SID$34”.) | ||
5 (Low) | 13 | 报文长度错误 |
长度不支持. (正确长度是11字节.) |
2.6传输数据服务(0x36)
传输数据服务运行客户端和ECU进行数据传输时使用,数据传输长度和地址由$34服务确认。消息格式:服务ID、块序列号、数据参数。传输数据请求消息包括一个块序列号,在每次传输请求过程,快序列号都应该递增,ECU会根据传输过程中的快序列号判断是否出现数据的丢失情况。
2.6.1 请求消息定义SID$36
请求传输
数据字节 | 参数名称 | 十六进制值 |
1 | 传输数据 请求服务ID | 36 |
2 | 参数块序号 = [] | xx |
3 : m | 传输请求参数记录[] = [ 传输请求参数 #1 : 传输请求参数 #m ] | xx : xx |
2.6.2 响应消息定义SID$36
肯定响应
数据字节 | 参数名称 | 十六进制值 |
1 | 传输数据 应答 服务ID | 76 |
2 | 参数块序号[] = [ ] | xx |
2.6.3 错误响应定义SID$36
否定应答
数据字节 | 参数名称 | 十六进制值 |
1 | 否定应答 服务ID | 7F |
2 | 传输数据 请求服务ID | 36 |
3 | 否定应答Code = [] | xx |
2.6.4 支持参数列表SID$36
优先级 | Hex | 描述 |
1 (High) | 7F | 服务不支持在当前会话 |
在当前会话下不支持该服务。 | ||
2 | 33 | 安全访问错误 |
在未解锁状态。 | ||
3 | 13 | 报文长度错误 |
长度不支持(没有发送数据). | ||
4 | 24 | 请求顺序错误 |
-请求下载服务(SID$34)未激活 -请求下载服务(SID$34)激活, 但是HUD已经接收到所有请求下载服务(SID$34)中规定的数据长度。 | ||
5 | 71 | 传输数据中止 |
下载模块的长度不符合请求下载服务请求报文中的参数存储器的尺寸的要求。 | ||
6 | 73 | 错误的参数块序号 |
检测到块讯号的顺序错误。 | ||
7 (Low) | 72 | 一般性编程失败 |
数据下载时擦除或编程永久存储设备中的存储区域电控单元检测到错误,应否定发送该应答代码。 |
2.7请求下载退出服务(0x37)
请求下载退出服务客户端告诉ECU退出数据传输。
2.7.1 请求消息定义SID$37
数据字节 | 参数名称 | 十六进制值 |
1 | 退出下载请求服务ID | 37 |
2.7.2 响应消息定义SID$37
肯定响应
数据字节 | 参数名称 | 十六进制值 |
1 | 退出下载应答服务ID | 77 |
2.7.3 错误响应定义SID$37
否定响应
数据字节 | 参数名称 | 十六进制值 |
1 | 否定应答服务ID | 7F |
2 | 退出下载请求服务ID | 37 |
3 | 否定应答Code = [ 参考 “错误响应定义SID$37” ] | xx |
2.7.4 支持参数列表SID$37
优先级 | Hex | 描述 |
1 (High) | 7F | 服务不支持在当前会话 |
在当前会话下不支持该服务。 | ||
2 | 33 | 安全访问错误 |
在未解锁状态。 | ||
3 | 13 | 报文长度错误 |
长度不支持. | ||
4 (Low) | 24 | 请求流程错误 |
请求下载服务未激活 数据传输未完成 |
- Bootloader的安全机制
为确保刷写的安全,ECU的bootloader程序需要设计安全机制,为了避免:1、来自非法源的下载动作;2、当前刷写条件不满足;3、下载错误的应用软件或应用数据到ECU;4、软件之间不兼容;5:错误的固件下载到硬件中等。
解决方案:
1、诊断会话控制(0x10):Bootloader作为编程模式进入的前提条件是需要先进入扩展会话在指定5S时间以内发送进入编程会话来能进入Bootloader。
2、安全访问:通过27服务通过汽车厂商定义好安全等级进行SEED AND KEY 进行安全访问服务限制,保证ECU被未授权的编程动作影响。
3、完整性校验:ECU对即将下载到flash的程序或数据进行完整性检查,当一个逻辑模块下载后,使用CRC32算法验证当前逻辑块的所有数据字节是否被正确传输和写入。
4、一致性检查:兼容的软件不能配合使用,如果配合使用可能会使功能异常或产生致命性错误。为此,ECU通过验证软件兼容性来检查刷新程序的一致性,包括应用软件与Bootloader软件、应用数据与应用软件检验等。
5、有效性检查:ECU内部有一个标志位,用于标识应用软件是否有效。如果刷新完整性检查和一致性检查都正确时,ECU才会设置应用软件的标志位为有效。只有标志位为有效时,应用软件才可以运行。
UDS Bootloader的主要作用是提供以下功能:
固件更新:通过安全且可控的方式,允许在设备运行时更新固件,以修复错误、增强功能或提高性能。
故障恢复:在设备固件损坏或丢失的情况下,允许通过诊断连接恢复设备至可运行状态。
安全性保障:采用加密、认证和数据完整性校验等安全措施,确保固件更新过程中数据的保密性和完整性。
性能优化:通过优化数据传输和处理流程,提高固件更新的效率和可靠性。
- UDS Bootloader的实现细节
5.1架构
5.1.1 系统概述
微控制器采用XXXXX芯片,整个系统主要由以下几个部分组成:2个AHB主设备、8个AHB从设备、14个APB1从设备、14个APB2从设备;产品内嵌32KB SRAM起始于0x20000000。Flash为64KB基地址为0x08000000。一个扇区为1024KB。通信接口为LIN通信,波特率采用19200bps。
5.2协议与通信
5.2.1数据帧类型
UDS诊断中的分帧传输采用类似ISO-TP的方式,将一个大的数据分成多个小的数据包进行传输。UDS诊断中的分帧传输分为首帧、单帧、连续帧、流控帧四种形式,一帧数据固定8个字节,不足8字节FF补齐。
每一帧的第一个字节定义了这一帧的帧类型。
单帧:04 31 01 02 02 FF FF FF
首帧:10 0B 71 01 02 03 00 00
流控帧:30 00 00 00 00 00 00 00
连续帧:21 00 00 00 00 00 00 00
0X 单帧(SF,Single Frame):首个字节为0(4bit)+ Data Length(4bit),控制信息占用1个字节。
举例:Data 04 31 01 02 02 FF FF FF,04表示接收方应知晓,这一个单帧只有4个有效字节。后续的字节是自动填充的无效字节。
1X XX 首帧(FF,First Frame):前两个字节为1(4bit)+ Data Length(12bit),控制信息共占用2个字节。
举例:Data 10 0B 71 01 02 03 00 00表示,接收方应知晓,这一个多帧组合共有11个字节。
3X 流控制帧(简称流控帧,FC,Flow Control):前三个字节为3(4bit)+流状态(FS,4bit)+块大小(BS,8bit)+最小间隔时间(STmin,8bit),控制信息共占用三个字节。
举例:Data 30 00 14 AA AA AA AA AA,多帧发送方应知晓,这是一个流控帧,允许你方继续发送,CF数量无限制,上一个连续帧的确认接收(ACK)到新的连续帧开始发出的最小间隔时间为20ms。
2X 连续帧(CF,Consecutive Frame):第一个字节为2+SN(最多16个SN,溢出后从0开始重新计数),控制信息占用1个字节。
我们通常记首帧为0x20,之后的第一个连续帧自然是0x21,之后一直到0x2F,下一个是0x20,循环。
5.2.2数据传输
内部数据传输基于网络层的主要任务是传递一帧或大于一帧的数据信息。
一帧的发送主要有单帧发送和多帧发送两种,在标准地址情况下,单帧SF按照N_PDU格式最多发送和接收7个字节数据+一个字节PCI,而发送长段报文信息时,拆分后的报文信息会通过多个N_PDU进行发送,接收到多个N_PDU信息后进行重组。这些N_PDU包括首帧和连续帧。报文信息接收者可通过流控机制按照自己的接收能力调整传输流量。在正常地址的情况下,首帧PDU包括6个字节+2个字节PCI,一个连续帧PDU最多包括7个字节。
5.3安全机制
5.3.1安全访问
安全算法是(SEED&KEY DLL)根据客户提供的DLL,用于在诊断测试仪内计算用于更改ECU的安全级别(Security level)。对于常见的安全访问服务用于更改安全级别,以解锁具有受限访问的其他服务。
5.3.2数据完整性
通过传输的数据利用CRC32计算校验和是一种基本的错误检测技术,通过对数据进行求和操作生成一个校验值。常见的校验和算法包括简单加法校验和和XOR校验和。CRC是一种更高级的错误检测方法,能够检测出更复杂的错误模式。常见的CRC算法包括CRC-16和CRC-32。
5.4错误处理
利用ECU硬件的内置错误检测功能看门狗定时器来监控硬件状态。
5.4.1错误响应
根据诊断仪发送的数据,ECU通过判断数据的长度类型进行验证,并查看本身的会话等级和安全等级能否执行对应的服务进行验证,对于不能处理的数据进行NRC反馈。
5.5内存管理
5.5.1存储布局
Flash 空间为64KB。Bootloader设计为15KB,app information 1K,app占用48KB。具体地址划分参考“XXXXXbootloader.xlsx”。
5.6实现细节
5.6.1系统初始化
在系统启动时,进行必要的硬件和软件初始化,以确保系统的正常运行。初始化系统时钟,根据
5..6.2 APP跳转
判断APP是否有效,从Flash中读取APP信息校验CRC信息是否相同,相同的情况下去判断Flash 编程、擦除、Flash结构体是否有效以及硬件版本号是否能对应上,判断前提条件是否相同在这些前提条件都成立的条件下跳转到APP区。
存储与闪存编程相关的状态信息。在UDS Bootloader的实现中,这些信息可以帮助追踪闪存操作的结果以及其他关键的系统状态。
5.6.3通信接口与数据存储
实现UDS协议的通信接口,包括Lin通信接口,采用循环队列的方式进行数据的存储。通过定义一块连续的数据空间来存储TP层的缓冲区以及Driver层的数据缓冲区,通过链表的形式和定义好的唯一ID可遍历每一块数据缓存区。
5.6.4UDS服务处理
定义数据类型包含服务唯一名称,支持的会话等级,支持请求模式,请求安全解锁等级和对应的服务功能这个类。在接收到UDS请求消息后,首先需要解析请求消息的服务ID,并根据服务ID调用相应的处理函数。
- UDS Bootloader的使用方法
本次实现刷写的诊断仪采用的是TSMaster。
选择传输层(ISO TP)选择诊断控制器选择诊断传输层可选择总线类型以及通道和定义好NAD号。
点击硬件,通道选择点击Lin可选择对应的硬件选择,和选择厂商。
诊断服务配置在基本诊断配置,可以看到每一个服务列表,可根据自定义实现服务的发送和服务的应答。
当需要更换烧录APP文件时需要修改组合服务中的$343637下载文件,选择downloadAPP服务,删除APP文件,并添加最新的APP.s19文件。加载成功后会显示出文件的起始长度和数据长度以及校验和,校验和可通过校验和去切换计算算法有CRC32以及CRC16等。
基本诊断服务配置完成之后点击自动诊断流程,该套流程可通过自定义的服务以及应答方式自动去发送和分析接收到的数据。
修改过后的APP需要修改service7 31 01 02 02 服务是校验下载的APP信息进行CRC32校验。点击启动之后可以进行刷写功能。