ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

AUTOSAR E2E保护机制详解:从Profile选型到DaVinci配置实战

AUTOSAR E2E保护机制详解:从Profile选型到DaVinci配置实战 1. 为什么汽车里的通信需要一把“密码锁”第一次接触AUTOSAR E2EEnd-to-End保护机制的人多半会有个疑问CAN总线本来就有CRC校验以太网也有帧校验为什么还要在应用层再叠一层保护这不是脱裤子放屁吗我当初也是这么想的直到有一次在台架上复现了一个通信故障——网关路由转发时因为缓冲区溢出把两帧报文的数据段拼接错了CRC居然没报错因为CRC只覆盖单帧内容拼接后的帧CRC是重新算过的。结果就是一个刹车扭矩请求被错误地映射成了驱动扭矩请求。这个场景让我彻底理解了E2E存在的意义。E2E保护的核心目标不是防黑客而是防“系统性失效”。它要解决的是数据在ECU内部软件栈、总线传输、网关路由、接收端软件栈这一整条链路上可能出现的数据损坏、重复、丢失、乱序、延迟这五类问题。CRC只管传输介质上的比特翻转管不了软件层面的逻辑错误。E2E就是在应用层给数据加一把“密码锁”让接收方能够验证这帧数据是不是发送方真正发出来的、是不是最新的、有没有被篡改或重复。在AUTOSAR体系里E2E保护由E2E LibraryE2E_Lib和E2E TransformerE2E_Transformer配合实现。E2E Library提供算法E2E Transformer负责在RTE层自动调用这些算法对Signal Group进行保护和解保护。这套机制在ISO 26262的功能安全语境下是达到ASIL D等级通信的必备手段。这篇文章适合谁看如果你是刚接触AUTOSAR的嵌入式软件工程师正在被DaVinci Configurator里那一堆E2E参数搞得头大或者你是系统架构师需要决定哪些信号组需要E2E保护、选哪种Profile又或者你是测试工程师想理解E2E故障注入该怎么设计——那这篇内容应该能帮你省下不少翻规范的时间。2. E2E保护的整体设计思路与Profile选型2.1 E2E在AUTOSAR通信栈中的位置要理解E2E先得搞清楚它在整个通信栈里站在哪一层。AUTOSAR的通信栈从下往上大致是CAN Driver → CAN Interface → CAN Transport Protocol → PDU Router → COM → RTE → SWC。E2E Transformer是挂在RTE和COM之间的一个转换层它不改变PDU的布局而是在原有数据的基础上往PDU的头部或尾部插入E2E Header包含CRC、Counter、Data ID等信息。发送方向SWC通过RTE发送Signal Group → E2E Transformer调用E2E_Lib的Protect函数 → 计算CRC、递增Counter、填入Data ID → 修改后的PDU交给COM → 最终发到总线上。接收方向总线上的PDU到达COM → COM交给E2E Transformer → E2E Transformer调用E2E_Lib的Check函数 → 验证CRC、检查Counter连续性、比对Data ID → 验证通过则把原始数据交给SWC验证失败则丢弃或上报。这个架构的关键在于E2E保护对SWC是透明的。SWC只管收发数据不需要知道E2E Header的存在。E2E Transformer在RTE生成代码时自动插入保护逻辑这也是为什么DaVinci Configurator里配置完E2E后必须重新生成RTE代码的原因。2.2 Profile选型不是越复杂越好AUTOSAR定义了多种E2E Profile从Profile 1到Profile 7还有Profile 4和5的变体每种Profile的CRC算法、Counter位数、Header长度、Data ID模式都不一样。选型的时候不能拍脑袋得根据实际需求来。ProfileCRC算法Counter位数Header长度适用场景Profile 1CRC-8 (0x1D)4 bit1字节小数据量、低实时性要求Profile 2CRC-8 (0x2F)4 bit1字节与Profile 1类似CRC多项式不同Profile 4CRC-328 bit3字节大数据量、高安全性要求Profile 5CRC-168 bit2字节中等数据量、平衡安全与开销Profile 6CRC-168 bit2字节支持多路复用信号Profile 7CRC-6432 bit8字节极高安全性要求、以太网场景Profile 11CRC-88 bit2字节兼容旧版E2E逐步淘汰Profile 22CRC-88 bit2字节兼容旧版E2E逐步淘汰选型的核心考量因素有三个数据长度、安全等级要求、总线负载容忍度。Profile 1和2的Header只有1字节开销最小但Counter只有4 bit意味着最多只能区分16个连续帧。如果通信周期是10ms16帧就是160ms超过这个窗口就无法检测重复帧了。所以Profile 1/2适合那些对实时性要求不高、但总线负载紧张的场景比如车身控制模块的灯光状态广播。Profile 4的CRC-32强度最高但Header占3字节对于8字节的CAN报文来说有效数据只剩5字节开销太大。Profile 4通常用在以太网通信或者CAN FD的大数据帧场景。Profile 5是我个人最推荐的“甜点”选择。CRC-16的检错能力足够应对大多数场景2字节Header在8字节CAN报文里占25%可以接受。Counter是8 bit能区分256个连续帧覆盖的窗口足够大。Profile 5还支持Data ID的两种模式Both模式发送方和接收方都校验Data ID和Alt模式只校验Counter和CRC灵活性好。Profile 7的CRC-64和32 bit Counter是为以太网SOME/IP通信设计的CAN场景基本用不上。注意Profile 6和Profile 5的区别在于Profile 6支持多路复用信号Multiplexed Signal如果你的Signal Group里有Mux信号必须选Profile 6。这个坑我在一个项目里踩过当时选了Profile 5结果Mux切换时E2E校验一直失败查了两天才发现是Profile选错了。2.3 Data ID的分配策略Data ID是E2E保护里的一个关键参数它相当于这组信号的“身份证号”。发送方把Data ID填进Header接收方比对收到的Data ID是否和自己配置的一致。如果不一致说明这帧数据可能来自错误的发送方或者PDU被错误路由了。Data ID的分配有两种模式Both模式发送方和接收方都配置相同的Data ID接收方会校验。这种模式安全性更高但要求发送方和接收方的配置严格一致。如果发送方改了Data ID而接收方没改通信直接断掉。Alt模式发送方不填Data ID或者填0接收方也不校验Data ID只校验CRC和Counter。这种模式配置简单但安全性略低适合那些PDU路由路径固定、不会出现错误路由的场景。我的经验是跨ECU的通信一律用Both模式ECU内部的SWC间通信可以用Alt模式。跨ECU通信时PDU可能经过网关路由存在被错误路由的风险Data ID校验是必要的。ECU内部通信路径固定Alt模式足够。Data ID的取值也有讲究。AUTOSAR规范建议Data ID不要用0x0000和0xFFFF这两个值容易和未初始化内存混淆。我通常会用信号的CAN ID作为Data ID的基础值再加上一个偏移量确保唯一性。3. E2E核心细节解析与DaVinci配置实操3.1 E2E Library的集成方式在DaVinci Configurator里配置E2E第一步是确认E2E Library已经集成到工程里。E2E Library通常以静态库.a或.lib的形式提供需要手动添加到链接器配置里。有些版本的DaVinci Configurator会自动集成但大多数情况下需要手动操作。具体步骤打开DaVinci Configurator → 进入Project Settings → Linker → Additional Libraries → 添加E2E_Lib的路径。如果是Vector的MICROSAR系列E2E Library通常在MICROSAR/E2E/目录下文件名类似E2E_Lib.a。添加完库之后需要在E2E模块的配置里指定使用的Profile。每个Profile对应一个独立的配置容器比如E2EProfile5、E2EProfile4等。你用了哪些Profile就只配置哪些容器没用的不用管。实操心得E2E Library的版本必须和DaVinci Configurator的版本匹配。我有一次用了旧版的E2E Lib配新版的Configurator编译能过但运行时报CRC校验一直失败查了半天发现是CRC查表算法的实现变了。版本不匹配这个问题很隐蔽建议在项目初期就锁定版本。3.2 E2E Transformer的配置E2E Transformer的配置是核心环节。在DaVinci Configurator的ECUC配置树里找到E2E模块下面会有E2ETransformer和E2EProfileX两类容器。E2ETransformer配置每个需要E2E保护的Signal Group对应一个E2ETransformer容器。容器里需要配置E2EProfile选择使用的Profile比如E2E_PROFILE_5。DataIdData ID的值Both模式下发送方和接收方要一致。DataIdModeBoth或Alt。CounterOffsetCounter在PDU中的字节偏移。CRCOffsetCRC在PDU中的字节偏移。DataIdOffsetData ID在PDU中的字节偏移Profile 5的Data ID是隐含在CRC计算里的不需要单独占字节。这里有个容易搞混的地方CounterOffset和CRCOffset是相对于PDU起始位置的字节偏移不是相对于Signal Group的偏移。E2E Header通常放在PDU的头部所以CounterOffset一般是0CRCOffset是1Profile 5的Header是2字节1字节Counter 1字节CRC。E2EProfile5配置这个容器里配置Profile 5的全局参数主要是WindowSize接收窗口大小和MaxDeltaCounter最大Counter跳变值。WindowSize决定了接收方在判定通信失败前能容忍多少个连续的错误帧通常设为3到5。MaxDeltaCounter用于检测Counter跳变如果收到的Counter和期望值差距超过这个阈值就判定为通信故障。3.3 RTE生成与代码集成E2E配置完成后必须重新生成RTE代码。在DaVinci Configurator里点击“Generate RTE”按钮工具会自动在RTE代码里插入E2E Transformer的调用。生成的代码里发送方向的E2E保护逻辑通常在Rte_Write_SignalGroup()函数里接收方向的解保护逻辑在Rte_Read_SignalGroup()或Rte_Receive_SignalGroup()函数里。你可以打开生成的Rte.c文件搜索E2E_Protect和E2E_Check关键字确认调用已经插入。如果发现RTE代码里没有E2E调用通常是两个原因一是E2ETransformer容器没有关联到对应的Signal Group二是Signal Group没有正确配置为“E2E保护”类型。在Signal Group的配置里有一个E2EProtection属性必须设为true。避坑指南RTE生成后不要手动修改Rte.c里的E2E调用代码。下次重新生成RTE时手动修改会被覆盖。如果需要调整E2E行为应该改E2E Transformer的配置而不是改生成的代码。3.4 参数计算CRC和Counter的具体实现Profile 5的CRC-16算法使用的是CRC-16/CCITT-FALSE多项式0x1021初始值0xFFFF不反转输入输出。这个算法在E2E Library里已经实现好了你不需要自己写但理解它的计算过程有助于排查问题。CRC的计算范围包括Data ID如果DataIdMode是Both、Counter、以及Signal Group的所有数据字节。注意CRC不覆盖PDU里的其他字节比如其他Signal Group的数据。这也是为什么E2E Transformer需要知道Signal Group的精确布局——它只对属于这个Signal Group的字节计算CRC。Counter的递增逻辑每次发送时Counter加1到达最大值后回绕到0。Profile 5的Counter是8 bit所以回绕周期是256。接收方维护一个期望Counter值收到帧后计算(ReceivedCounter - ExpectedCounter) mod 256如果结果在MaxDeltaCounter范围内则认为Counter正常更新期望值否则判定为通信故障。这里有个细节Counter的初始值不是0而是1。AUTOSAR规范规定Counter从1开始0保留给“未初始化”状态。如果你在测试时发现第一帧总是校验失败检查一下发送方的Counter初始值是不是设成了0。4. 完整实操流程从零配置一个E2E保护的Signal Group4.1 前提条件与工程准备假设你已经有一个可以正常编译和运行的AUTOSAR工程CAN通信已经调通COM和PDU Router配置完毕。现在需要给一个已有的Signal Group加上E2E保护。这个Signal Group的场景是一个电机控制器通过CAN向整车控制器发送电机转速和扭矩信息CAN ID是0x123数据长度8字节周期10ms。转速占2字节偏移0-1扭矩占2字节偏移2-3其余4字节保留。4.2 第一步创建E2E Profile 5配置容器在DaVinci Configurator的ECUC配置树里展开E2E模块右键E2EProfile5→Add E2EProfile5。新建的容器命名为E2EProfile5_MotorCtrl。在容器里配置参数WindowSize设为3。这意味着接收方连续3帧校验失败后才上报通信故障避免偶发干扰导致误报。MaxDeltaCounter设为1。正常情况下Counter每次加1允许跳变1是为了容忍偶尔的丢帧。CRCFailureThreshold设为3。连续3次CRC失败后触发故障回调。4.3 第二步创建E2E Transformer容器右键E2ETransformer→Add E2ETransformer命名为E2ETransformer_MotorCtrl。配置参数E2EProfile选择E2E_PROFILE_5。DataId设为0x123和CAN ID一致方便追溯。DataIdMode选择BOTH。CounterOffset设为0。CRCOffset设为1。DataIdOffsetProfile 5不需要单独的Data ID字节这个参数留空或设为0xFFFF。4.4 第三步关联Signal Group找到这个Signal Group的配置容器通常在Com模块下的ComSignalGroup里打开它的属性页。找到E2EProtection属性设为true。然后在E2ETransformerRef属性里选择刚才创建的E2ETransformer_MotorCtrl。这一步是关键Signal Group必须同时配置E2EProtection和E2ETransformerRef缺一不可。只设E2EProtection不设E2ETransformerRefRTE生成时不会插入E2E调用只设E2ETransformerRef不设E2EProtectionE2E Transformer不会生效。4.5 第四步调整PDU布局E2E Header需要占用PDU的字节。Profile 5的Header是2字节Counter CRC所以原本8字节的PDU现在只有6字节可用于有效数据。但我们的Signal Group只用了4字节转速2字节扭矩2字节所以还有2字节余量不需要调整PDU长度。如果Signal Group的数据超过了PDU长度减去Header长度就需要扩展PDU长度。比如CAN FD场景下PDU长度可以从8字节扩展到16字节或64字节。具体操作在PduR模块里找到对应的PDU修改PduLength参数。然后在Com模块里调整Signal Group的布局把E2E Header占用的字节让出来。通常的做法是把Signal Group的起始偏移从0改为2让Header占据前2字节。4.6 第五步生成RTE并验证点击“Generate RTE”等待生成完成。打开生成的Rte.c搜索E2E_Protect应该能看到类似这样的代码/* E2E Protection for Signal Group MotorCtrl */ E2E_P05ProtectStateType E2E_P05ProtectState_MotorCtrl; E2E_P05ProtectConfigType E2E_P05ProtectConfig_MotorCtrl { .DataId 0x123, .DataIdMode E2E_P05_DATAID_BOTH, .CounterOffset 0, .CRCOffset 1, .DataLength 6 };在发送函数里会看到E2E_P05Protect(E2E_P05ProtectConfig_MotorCtrl, E2E_P05ProtectState_MotorCtrl, PduData[0]);接收方向的E2E_P05Check调用类似。确认这些代码存在后编译工程下载到目标板。4.7 第六步用CANoe验证E2E保护用CANoe或类似的总线分析工具抓包观察0x123报文。你会看到前2字节是E2E Header第1字节是Counter从1开始递增第2字节是CRC。Counter每帧加1到255后回绕到0。在CANoe里可以写一个简单的CAPL脚本验证CRCon message 0x123 { byte counter this.byte(0); byte crc this.byte(1); byte data[6]; for (int i 0; i 6; i) { data[i] this.byte(i 2); } // 调用E2E Library的CRC计算函数验证 // 实际项目中通常用CANoe的E2E插件自动验证 }如果CRC校验通过说明E2E保护配置正确。如果失败检查Data ID、CounterOffset、CRCOffset是否和配置一致。5. 常见问题与排查技巧实录5.1 E2E校验一直失败但CRC计算看起来没问题这是最常见的问题通常有以下几个原因原因一Data ID不匹配。发送方和接收方的Data ID配置不一致或者DataIdMode选错了一方是Both另一方是Alt。排查方法用CANoe抓包手动计算CRC对比发送方填的CRC值。如果手动算出来的CRC和发送方填的不一样说明发送方的Data ID或DataIdMode配置有问题。原因二Counter初始值不对。AUTOSAR规定Counter从1开始如果发送方从0开始接收方期望的是1第一帧就会失败。排查方法抓包看第一帧的Counter值应该是1。原因三Signal Group布局和E2E配置不匹配。E2E Transformer需要知道Signal Group在PDU里的精确位置。如果Signal Group的起始偏移是2但E2E配置里DataLength设成了8CRC计算范围就错了。排查方法检查Signal Group的ComBitPosition和E2E Transformer的DataLength是否一致。原因四字节序问题。CAN通信通常是大端序Motorola但有些ECU配置成小端序Intel。如果发送方和接收方的字节序不一致CRC计算会出错。排查方法确认Signal Group的ComSignalEndianness配置。5.2 Counter跳变导致通信中断Counter跳变通常发生在ECU重启或通信中断恢复后。比如ECU A重启Counter从1重新开始但ECU B期望的Counter是100差距99超过了MaxDeltaCounter设为1ECU B判定通信故障。解决方法有两种一是增大MaxDeltaCounter但这会降低安全性二是实现Counter同步机制ECU A重启后先发送几帧“同步帧”让ECU B重置期望Counter。AUTOSAR规范里没有定义同步机制需要自己实现。我的做法是在ECU启动后的前10帧里接收方不校验Counter只校验CRC。10帧之后开始正常校验。这个逻辑可以通过E2E Library的E2E_P05Check返回值来实现——如果返回E2E_P05STATUS_SYNC说明还在同步阶段不报故障。5.3 E2E保护导致总线负载升高E2E Header占用了PDU字节如果PDU长度不变有效数据就减少了。对于CAN 2.08字节Profile 5的2字节Header占25%Profile 4的3字节Header占37.5%。如果总线负载本来就高加上E2E后可能超过80%的警戒线。解决方案一是换用CAN FDPDU长度扩展到64字节Header占比降到3%左右二是优化Signal Group布局把不重要的信号移出E2E保护范围三是降低通信周期但这对实时性有影响。我个人的经验是对于CAN 2.0场景优先用Profile 5而不是Profile 4。Profile 5的CRC-16强度对于大多数车身和动力总成应用已经足够2字节Header比3字节更友好。5.4 常见问题速查表现象可能原因排查方法解决方案第一帧就校验失败Counter初始值不是1抓包看Counter值修改发送方Counter初始值为1偶发校验失败总线干扰导致CRC错误统计失败率增大WindowSize容忍偶发错误通信中断后无法恢复Counter跳变超过MaxDeltaCounter抓包看Counter跳变幅度实现Counter同步机制或增大MaxDeltaCounterRTE代码里没有E2E调用Signal Group未关联E2ETransformer检查E2EProtection和E2ETransformerRef补全配置重新生成RTECRC计算范围错误DataLength配置不对对比Signal Group布局和E2E配置修改DataLength为Signal Group的实际字节数编译报错找不到E2E函数E2E Library未链接检查链接器配置添加E2E Lib到链接器5.5 独家避坑技巧技巧一用CANoe的E2E插件自动验证。Vector的CANoe有E2E插件可以自动解析E2E Header并验证CRC和Counter。配置方法在CANoe的Simulation Setup里添加E2E节点导入E2E配置通常是从DaVinci导出的.arxml文件插件会自动校验。这比手动写CAPL脚本效率高得多。技巧二在E2E失败回调里加日志。E2E Library提供了失败回调函数E2E_P05Check返回非OK时触发可以在回调里记录失败原因CRC错误、Counter错误、Data ID错误。这些日志在排查现场问题时非常有用。技巧三用Data ID的Alt模式做过渡。如果项目从无E2E升级到有E2E发送方和接收方的升级时间可能不同步。可以先用Alt模式不校验Data ID等双方都升级完再切到Both模式。这样避免升级过程中的通信中断。技巧四注意E2E Header和SecOC的冲突。如果同时用了SecOCSecure Onboard CommunicationSecOC也会在PDU里加Header通常是8字节的认证器。E2E Header和SecOC Header的偏移不能重叠。通常SecOC Header放在PDU末尾E2E Header放在PDU头部两者不冲突。但如果PDU长度不够就需要扩展PDU或调整布局。技巧五E2E配置变更后必须重新生成RTE。E2E Transformer的配置是在RTE生成时静态展开的改了E2E配置不重新生成RTE代码里的E2E参数还是旧的。这个坑我踩过不止一次每次都是编译通过但运行行为不对查半天才发现是忘了重新生成RTE。6. E2E与NvM、网络管理的协同6.1 E2E保护的数据在NvM里的存储E2E保护的数据通常也需要存储到NvMNon-Volatile Memory里比如电机的故障码、整车的配置参数。但E2E HeaderCounter和CRC不应该存到NvM里因为Counter是通信相关的重启后应该重置CRC是每帧计算的存储没有意义。正确的做法是在NvM存储前先剥离E2E Header只存有效数据。读取时从NvM读出有效数据再重新加上E2E Header发送。这个剥离和添加的过程需要在SWC里手动实现AUTOSAR没有自动机制。具体实现在SWC的Runnable里调用Rte_Read读取E2E保护的数据时RTE已经自动剥离了HeaderSWC拿到的是有效数据。SWC把有效数据写入NvM。上电时SWC从NvM读出有效数据调用Rte_Write发送RTE会自动加上E2E Header。注意NvM的Block ID和E2E的Data ID不要混淆。NvM Block ID是NvM模块的内部标识E2E Data ID是通信标识两者没有直接关系。6.2 E2E与AUTOSAR网络管理的交互AUTOSAR网络管理NM负责控制ECU的睡眠和唤醒。E2E保护和NM的交互点在于当NM让ECU进入睡眠时E2E的Counter状态需要保存吗答案是不需要。E2E的Counter是通信相关的ECU睡眠后通信中断唤醒后Counter重新从1开始。接收方在检测到通信恢复后会进入同步阶段不校验Counter。所以E2E的Counter状态不需要保存到NvM。但有一个例外如果ECU支持“部分网络”Partial Networking某些Signal Group在睡眠期间仍然保持通信这些Signal Group的E2E Counter需要保持连续性。这种情况下Counter状态需要保存在RAM里不是NvM唤醒后继续递增。6.3 E2E在28服务通信控制下的行为AUTOSAR的28服务Communication Control用于禁用或启用通信。当28服务禁用某个PDU的发送时E2E的Counter应该停止递增还是继续递增AUTOSAR规范的建议是28服务禁用通信时E2E的Counter停止递增。因为通信被禁用后接收方收不到帧Counter递增没有意义。当28服务重新启用通信时Counter从停止时的值继续递增接收方通过同步机制重新同步。实现方式在28服务的回调函数里调用E2E Library的E2E_P05ProtectState重置函数把Counter状态重置为初始值。或者在28服务禁用期间不调用E2E_P05Protect函数Counter自然不递增。这个细节在配置DaVinci时容易被忽略。如果28服务禁用通信后Counter还在递增接收方重新启用通信时会发现Counter跳变触发通信故障。排查这个问题需要抓包看28服务禁用前后的Counter变化。7. 测试与验证如何确认E2E保护真的生效了7.1 故障注入测试E2E保护的价值在于它能检测故障所以测试的核心是故障注入。常见的故障注入场景场景一篡改数据字节。用CANoe发送一帧数据被修改的报文接收方应该检测到CRC错误丢弃该帧并上报通信故障。场景二重复发送同一帧。用CANoe连续发送两帧完全相同的报文Counter相同接收方应该检测到Counter重复丢弃第二帧。场景三跳过Counter。用CANoe发送Counter跳变的报文比如从1跳到5接收方应该检测到Counter跳变超过MaxDeltaCounter上报通信故障。场景四延迟发送。用CANoe延迟发送报文接收方应该检测到通信超时如果配置了超时监控上报通信故障。场景五错误Data ID。用CANoe发送Data ID不匹配的报文接收方应该检测到Data ID错误丢弃该帧。每个场景都需要验证接收方是否正确检测到故障、是否丢弃了故障帧、是否上报了故障码、故障恢复后通信是否自动恢复。7.2 用CANoe的E2E插件做自动化测试CANoe的E2E插件支持自动化测试。你可以写一个测试用例自动发送各种故障帧然后检查接收方的故障码。测试用例可以用CAPL或XML编写集成到CANoe的Test Module里。一个典型的测试用例结构testcase E2E_CRC_Failure() { // 发送一帧CRC错误的报文 message 0x123 msg; msg.byte(0) 1; // Counter msg.byte(1) 0xFF; // 错误的CRC msg.byte(2) 0x12; msg.byte(3) 0x34; // ... 填充数据 output(msg); // 等待接收方上报故障 testWaitForSignalUpdate(E2E_CRC_Failure_Flag, 1, 1000); // 验证故障码 testVerifySignal(E2E_CRC_Failure_Flag, 1); }这种自动化测试可以在每次代码变更后快速回归确保E2E保护没有被破坏。7.3 实测中的性能影响E2E保护会增加CPU负载因为每帧收发都要计算CRC。CRC-16的计算量不大对于10ms周期的报文CPU负载增加通常在1%以内。但如果ECU上有很多E2E保护的Signal Group累积负载可能达到5%-10%。实测数据在一个有20个E2E保护Signal Group的ECU上CPU负载从45%增加到52%增加了7个百分点。这个增量在可接受范围内但如果ECU的CPU负载本来就接近80%就需要考虑优化。优化方法一是用硬件CRC加速器如果MCU支持二是减少E2E保护的Signal Group数量只保护安全相关的信号三是增大通信周期减少每秒的CRC计算次数。我个人在实际项目中的体会是E2E保护的开销主要不在CRC计算而在RTE的调用开销。每次Rte_Write都要经过E2E Transformer这个函数调用链比直接写COM要长。如果对性能极度敏感可以考虑在SWC里直接调用E2E Library绕过E2E Transformer但这样会失去AUTOSAR的标准化优势需要权衡。最后再分享一个小技巧在DaVinci Configurator里配置E2E时可以先把所有参数导出成.arxml文件用文本编辑器批量修改再导入回去。对于有几十个Signal Group需要配置E2E的项目这比在GUI里一个个点效率高得多。导出时注意选择“Export E2E Configuration”只导出E2E相关的部分避免覆盖其他配置。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表