目的
由于功能安全项目需要开发E2E模块(非采用AUTOSAR工具开发),本文记录E2E开发过程中一些问题和归纳,方便后来者可以借鉴。
标准文档
注:如果想深入的了解E2E设计,可以先阅读标准文档,建议按下面先后顺序依次阅读,反之可以跳过这一步骤,直接按本文介绍内容阅读后,直接开发,如果有不理解之处,再有选择性的阅读标准。
[[AUTOSAR_FO_RS_E2E]]
本文件规定了E2E协议的要求。E2E协议定义了抽象机制,以根据ISO 26262:2018(所有部分)的要求提供端到端通信保护。这些机制应允许通过非安全相关通信路径安全传输定义的所有完整性级别的安全相关数据。
[[AUTOSAR_CP_SWS_E2ETransformer]]
本规范规定了AUTOSAR基础软件模块E2E转换器的功能、API和配置。
[[AUTOSAR_FO_PRS_E2EProtocol]]
描述了有关E2E保护和可检测故障模式的一般限制。
[[AUTOSAR_CP_SWS_E2ELibrary]]
本文档包含PRS E2E协议的特定平台实现要求。这包括所使用的接口和数据类型。
使用E2E库的应用方案
为了提供解决灵活性和标准化问题的适当解决方案,AUTOSAR指定了一组灵活的E2E配置文件,用于实现E2E保护机制的适当组合。每个指定的E2E配置文件都有固定的行为,但它有一些功能参数的配置选项(例如,CRC相对于要保护的数据的位置)。
从以下位置调用E2E库:
- E2E Transformer(R4.2.1中引入的调用E2E的一种新的标准化方法)
- E2E Protection Wrapper (保护数据的非标准集成商软件,在RTE的上层)
- COM E2E Callout(保护 I-PDU 的非标准集成器代码)
无论在哪里执行E2E,E2E保护都适用于数据元素。在与总线上传输的位布局相同的位布局上,对数据元素的串行表示执行E2E保护。这意味着:
- 如果使用E2E Transformer,则串行化由E2E转换器以上的转换器执行(基于COM的转换器或Some/IP变压器)。
- 在使用E2E Protection Wrapper的情况下,包装器需要将数据元素序列化为相应信号组的序列化形式(换句话说,包装器创建I-PDU的一部分,该部分表示信号组,同时表示数据元素)。
- 如果使用COM调用,则串行化由通信堆栈(RTE、COM)完成,因此调用直接在I-PDU中的串行化信号组上操作。
数据元素(和相应的信号组)要么完全受E2E保护,要么不受保护。保护它的一部分是不可能的。
I-PDU可以携带若干数据元素(以及相应的信号组)。可以独立地对这些数据元素的子集进行E2E保护。
根据ASIL D要求,单独适当使用E2E库不足以实现安全的E2E通信。用户仅负责证明所选配置文件为所考虑的网络提供了足够的错误检测能力(例如,通过评估硬件故障率、误码率、网络中节点的数量、消息的重复率和网关的使用)。
E2E Protection Wrapper
警告:E2E Wrapper方法涉及不受AUTOSAR标准约束的技术,并被高级E2E Transformer方法(由AUTOSAR完全标准化)所取代。因此,新项目(没有遗留部件造成的遗留限制)应使用完全标准化的E2E Transformer方法。
E2E Protection Wrapper详细描述见[[AUTOSAR_CP_SWS_E2ELibrary#E2E Protection Wrapper]]。
序列图-读取和写入
写入
读取
E2E COM Callouts
该解决方案适用于RTE为ECU间通信提供的所有通信模型和倍数。调出调用E2E库,为给定I-PDU中的每个E2E保护信号组调用一次。
该解决方案可用于提供COM和RTE操作完整性的系统。
功能概述
对于每个I-PDU,都有一个单独的调出功能。每个I-PDU调出功能“知道”是否以及如何保护/检查I-PDU的每个信号组。
这意味着调用具有适当设置和状态参数的E2E库功能。E2E库现在可以“了解”信号组及其设置——整个信息作为函数参数传递给E2E库函数。
在接收方和发送方,如果调用返回TRUE,则COM将继续。如果COM E2E Callout返回FALSE,则COM停止处理给定的I-PDU(在此循环中)。当且仅当存在内部错误时,COM E2E Callout才会返回FALSE,例如程序流错误、E2E库中的数据损坏错误。
如果没有检测到运行时错误(例如错误的参数),则发送器调用始终为TRUE,否则为FALSE。如果未检测到运行时错误,并且检查结果为E2E_P02STATUS_OK或E2E_P02TATUS_OKSOMELOST,则接收器调出接收器返回TRUE。
下图总结了发送方的COM E2E Callout解决方案。SW-C完全不受影响,COM中唯一的附加活动是调用生成的callout(步骤6)。如果调出的返回值为TRUE,则由E2E库修改的IpduData随后由PDU路由器传输。如果为false,则COM在此循环中停止对此I-PDU的进一步处理。
下图总结了接收方COM E2E Callout解决方案。非常重要的一步是,E2E库通过检查状态位(E2E_PXXCheckStateType)覆盖信号组中的CRC字节。然后,这个重写的CRC字节由COM转换为信号,然后由RTE转换为数据元素。结果,SW-C在CRC数据元素中接收E2E校验位,而不是CRC值。
发送/呼叫
在发送方COM侧,当I-PDU已经从信号构建并且转换(例如Endianness)已经发生,并且I-PDU已经准备好时,COM调用调用callout函数。每个I-PDU都有一个单独的标注(如果已定义)。调用返回后,COM调用PDU路由器来传输数据(功能PduR_COM传输)。
生成调出功能是为了保护一个I-PDU的信号组,并使用正确的硬编码设置简单地调用E2E库(每个受E2E保护的信号组一次)。硬编码设置是根据上一节中描述的设置生成的。
当callout返回TRUE时,COM调用PduR_ComTransmit(),通过网络路由IPDU。
接收
在接收器COM侧,当I-PDU在PDU路由器上可用时,PDU路由器调用COM的函数COM_RxIndication()。COM然后调用生成的I-PDU调出(如果为给定的I-PDU配置)。专门为该I-PDU生成的调用调用具有特定参数的E2E库(每个受E2E保护的信号组一次)。E2E库执行检查并将检查结果存储在状态中。
一旦E2E库检查功能返回,调用就会将状态复制到CRC字节中,以便在需要时由接收器SW-C进行分析。
E2E Transformer
E2E Transformer详细描述见[[AUTOSAR_CP_SRS_Transformer]]。
E2E配置文件
E2E配置文件提供了一套一致的数据保护机制,旨在防止故障模型中考虑的故障。
每个E2E配置文件通过不同的算法提供了保护通信的替代方式。然而,E2E配置文件具有类似的接口和行为。
每个E2E配置文件都使用以下数据保护机制的子集:
- CRC,由CRC监督提供;
- 序列计数器在每次传输请求时递增,在接收器侧检查该值是否正确递增;
- 活动计数器在每次传输请求时递增,如果值发生变化,则在接收器侧检查该值,但未检查正确的递增;
- 通过端口发送的每个端口数据元素的特定ID或每个消息组的特定ID(全局到系统,其中系统可能包含几个ECU);
- 数据元素或消息组的每个源(例如客户端)的特定ID;
- 在方法的E2E通信保护的情况下,区分请求和响应的消息类型;
- 在方法的E2E通信保护情况下,区分正常响应和错误响应的消息结果;
- 超时检测:
a) 接收器通信超时
b) 发件人确认超时
根据所使用的通信和网络堆栈,这些机制的适当子集被定义为E2E通信配置文件。
上面的一些机制是在RTE、COM和/或通信堆栈中实现的。然而,为了减少或避免将安全要求分配给这些模块,不考虑这些模块:E2E监管在内部提供所有机制(仅使用CRC监管)。
E2E配置文件可用于ECU内部和内部通信。E2E配置文件是为特定的通信基础设施指定的,如CAN、CAN FD、FlexRay、LIN、以太网。
根据系统,用户从E2E监督提供的E2E配置文件中选择要使用的E2E概要文件。
[!NOTE] CRC在线计算:
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
E2E Profile 1
配置文件1是旧配置文件,仅出于兼容性原因才进行维护。新项目应使用配置11。
配置文件1应提供以下机制:计数器、超时监测、数据ID、CRC。
机制 | 描述 |
---|---|
Counter | 4位(明确发送),表示在每次发送请求时递增的从0到14的数字。活动计数器和序列计数器机制都由E2E配置文件1提供,评估相同的4位。 |
Timeout monitoring | 超时由E2E监督通过对计数器的评估,通过接收器处的非阻塞读取来确定。E2E监督通过E2E_P01CheckStatusType中的状态标志向调用方报告超时。 |
Data ID | 16位,唯一编号,包含在CRC计算中。 对于等于0、1或2的dataIdMode,不传输数据ID,而是将其包括在CRC计算中(隐式传输)。 对于等于3的dataIdMode: •不使用DataID的高字节的高半字节(它是0x0),因为DataID被限制为12位, •在计算数据上的CRC时,明确传输DataID的高字节的低半字节,并由CRC计算覆盖。 •低字节不传输,但它作为第一个值包含在CRC计算中(隐式传输,如dataIDMode等于0、1或2) |
CRC | CRC-8-SE J1850-0x1D(x8+x4+x3+x2+1),但具有不同的起始值和XOR值(起始值和异或值均为0x00)。 本CRC由CRC监督机构提供。从AUTOSAR R4.0开始,CRC监督的SAE8 CRC功能使用0xFF作为起始值和XOR值。为了补偿CRC监督的不同行为,E2E监督从R4.0开始应用额外的XOR 0xFF运算,以产生0x00作为开始值和XOR值。 注:此CRC多项式与FlexRay、CAN和LIN使用的CRC多项式不同。 |
E2E机制可以检测以下故障或故障的影响:
E2E机制 | 检测到通信故障 |
---|---|
Counter | 重复、丢失、插入、顺序错误、阻塞 |
定期传输,并使用E2E监督进行超时监测 | 丢失、延迟、阻塞 |
Data ID + CRC | 伪装和不正确的寻址、插入 |
CRC | 损坏、信息不对称 |
API规范
本章规定了E2E库的API。
E2E P01ConfigTypes
E2E_P01CheckStateType
头布局
E2E Profile 1由三个字段组成,Counter、DataID、CRC,最大数据保护长度为32 - 2 Bytes。[1]
Counter | Data ID | CRC |
---|---|---|
4 Bits | 16 Bits | 8 Bits |
[注1]:[[AUTOSAR_FO_PRS_E2EProtocol#数据、通信总线的最大长度]]。
Counter
在E2E配置文件1中,在发送方,对于数据元素的第一个传输请求,计数器应初始化为0,并且对于每个后续发送请求(来自发送方SW-C),计数器应递增1。当计数器达到值14(0xE)时,下一个发送请求(即应跳过值0xF)。
Data ID
唯一的数据ID用于验证每个传输的安全相关数据元素的身份。
在计算一字节CRC时,两字节数据ID应具有以下四种包含模式:
- E2E_P01_DATAID_BOTH:CRC中包括DataID两个字节,首先是低字节,然后是高字节,但不参与数据传输。
- E2E_P01_DATAID_ALT:CRC中包含两个字节,当计数器为偶数时,只有低字节参与CRC计算,但不参与数据传输;当计数器为奇数时,只有高字节参与CRC计算,但不参与数据传输。
- E2E_P01_DATAID_LOW:只包含低字节,不使用高字节。这等于数据ID仅为8位的情况。
- E2E_P01_DATAID_NIBBLE:DataID 高字节的高半字节不使用, 应置为 0x00, 此时相当于可用 DataID 的长度为 12Bits, 且此时 Data ID 高字节的低半字节不仅参与 Crc 计算,还与数据一起传输, 位置由 DataIDNibbleOffset 决定,DataID低字节参与CRC计算,但不参与数据传输。
CRC
AUTOSAR R4.0开始,CRC采用[[CRC#CRC8_SAE_J1850]]使用0xFF作为起始值和XOR值。R4.0之前,采用[[CRC#CRC8_SAE_J1850_ZERO]]使用0x00作为起始值和XOR值。
下图显示了E2E_P01_DATAID_BOTH的通信CRC,以下配置为:
- CRC是消息中的第0个字节(即以比特偏移量0开始)
- 活动计数器位于第一个字节的最低4位(即从位偏移8开始)
- E2E_P01DataIDMode=E2E_P01_DATAID_BOTH
- unusedBitPattern=0xFF
![[Pasted image 20240420160612.png]]
下图显示E2E_P01_DATAID_NIBBLE的通信CRC,以下配置为: - CRC是消息中的第0个字节(即以比特偏移量0开始)
- 活动计数器位于第一个字节的最低4位(即从位偏移8开始)
- 数据ID半字节位于第一字节的最高4位(即以位偏移12开始)
- E2E_P01DataIDMode=E2E_P01_DATAID_NIBBLE
- unusedBitPattern=0xFF
示例
以下示例假设的默认配置,采用[[CRC#CRC8_SAE_J1850_ZERO]]算法:
E2E_P01ConfigType field | 值 |
---|---|
CounterOffset | 8 |
CRCOffset | 0 |
DataID | 0x123 |
DataIDNibbleOffset | 12 |
DataIDMode | \ |
DataLength | 64 |
MaxDeltaCounterInit | 1 |
MaxNoNewOrRepeatedData | 15 |
SyncCounterInit | 0 |
DataIDMode set to E2E_P01_DATAID_BOTH
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0xCC | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00] = 0xCC
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x91 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00] = 0x91
DataIDMode set to E2E_P01_DATAID_ALT
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0xCE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x00 0x00 0x00 0x00 0x00 0x00 0x00] = 0xCE
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=1:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x02 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00] = 0x02
DataIDMode set to E2E_P01_DATAID_LOW
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0xCE | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x00 0x00 0x00 0x00 0x00 0x00 0x00] = 0xCE
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=1:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x93 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x01 0x00 0x00 0x00 0x00 0x00 0x00] = 0x93
DataIDMode set to E2E_P01_DATAID_NIBBLE
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x77 | 0x10 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x10 0x00 0x00 0x00 0x00 0x00 0x00] = 0x77
E2E_P01Protect()的结果数据,数据等于全零(0x00),Counter=1:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x2A | 0x11 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x11 0x00 0x00 0x00 0x00 0x00 0x00] = 0x2A
[!NOTE] 总结
Data ID放在最前面,采用小端序(跟传输介质有关,以AUTOSAR_FO_PRS_E2EProtocol > 字节序为准),依次是Counter、Data。
E2E Profile 2
配置文件2是传统配置文件,仅出于兼容性原因才进行维护。新项目应使用Profile 22。
配置文件2应提供以下机制:Couter、DataID、CRC。
机制 | 描述 |
---|---|
Counter | 4位(明确发送),表示在发送方的每个发送请求(Data[1]的位0:3)上从0到15的数字加1。计数器在每次调用E2E_P02Protect()函数时递增,即在SW-C的每次传输请求时递增。 |
Data ID | 8位(未明确发送)用于计算CRC的特定数据ID取决于计数器的值,并且是预定义的一组数据ID的元素(计数器的值作为选择用于保护的特定数据标识的索引)。对于每个Data元素,取决于计数器的每个值的数据ID列表都是唯一的。 |
Data ID + CRC | 伪装和不正确的寻址、插入 |
CRC | 0x2F(x8+x5+x3+x2+x+1)起始值:0xFF最终异或值:0xFF注意:此CRC多项式与FlexRay和CAN使用的CRC多项式不同。 |
Timeout monitoring | 超时由E2E监督通过对计数器的评估,通过接收器处的非阻塞读取来确定。E2E监督通过E2E_P02CheckStatusType中的状态标志向调用方报告超时。 |
配置文件2提供的机制能够检测除消息延迟之外的相关故障模式: | |
由于该配置文件是在Supervisory中实现的,Supervisory的E2E_P02Check()函数本身无法确保定期调用。因此,必须在调用者中实现针对未检测到的消息延迟(例如超时)的所需保护机制。 |
E2E机制可以检测以下故障或故障的影响:
E2E机制 | 检测通信故障 |
---|---|
Counter | 重复、丢失、插入、顺序错误、阻塞 |
Data ID + CRC | 伪装和不正确的寻址、插入 |
CRC | 信息被破坏、信息不对称 |
API规范
E2E_P02ConfigType
\
E2E_P02CheckStateType
头布局
E2E Profile 2由三个字段组成,Counter、DataID、CRC,最大数据保护长度为32 - 2 Bytes。[1]
[注1]:[[AUTOSAR_FO_PRS_E2EProtocol#数据、通信总线的最大长度]]。
Counter
在E2E配置文件2中,计数器应为数据[1]的低半字节(位0…位3)。
在E2E配置文件2中,计数器的值范围应为[0…15]。
当计数器达到其上限15(0xF)时,它将在0处重新启动。
Data ID
在E2E配置文件2中,用于计算特定CRC的特定数据ID的长度应为8位。
在E2E配置文件2中,应使用计数器的值作为索引,从预定义的DataIDList[16]中选择用于CRC计算的特定数据ID。
受CRC保护的每个数据都拥有一个专用的DataIDList,该DataIDList存放在发送方站点和所有接收方站点上。
预定义的DataIDList[16]是离线生成的。通常,有几个因素会影响DataIDList的内容,例如:
- 受保护数据的长度
- 受保护数据元素的数量
- 必须检测伪装故障内的循环数
- 发送器和接收器的数量
- CRC多项式的特性
由于8位多项式的长度有限,当评估接收到的CRC值时,可能无法在特定周期中检测到伪装故障。由于DataIDList中有足够的数据ID,可以在一个连续的通信周期中检测到伪装故障。
由于DataIDList的基本规则,应用程序的系统设计必须考虑到,在评估一定数量的通信周期之前,才会检测到伪装故障。
CRC
E2E配置文件2应使用SWS CRC监督的Crc_CalculateCCRC8H2F()函数计算Crc校验和。
E2E配置文件2应使用0xFF作为CRC计算的起始值CRC_StartValue8。
在E2E配置文件2中,CRC应为Data[0]。
CRC算法详细介绍请参照[[CRC#CRC8_8HF2]]。
示例
以下示例假设的默认配置,采用[[CRC#CRC8_8HF2]]算法:
E2E_P02ConfigType field | 值 |
---|---|
DataLength | 64 |
DataIDList | 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 |
MaxDeltaCounterInit | 1 |
MaxNoNewOrRepeatedData | 15 |
SyncCounterInit | 0 |
Offset | 0 |
E2E_P02Protect()的结果数据,数据等于全零(0x00),计数器从1开始(注意:第一次使用的计数器是1,尽管计数器字段初始化为0,因为计数器在使用前递增):
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x1b | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x02] = 0x1b
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x98 | 0x02 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x03] = 0x98
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x65 | 0x07 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x08] = 0x65
[!NOTE] 总结
Data ID放在Data后面,参与CRC计算。
E2E Profile 4
配置文件4应提供以下控制字段,在运行时与受保护数据一起传输:Length、Counter、CRC、Data ID。
Control field | 描述 |
---|---|
Length | 16位,以支持动态大小数据。 |
Counter | 16位 |
CRC | 32位,正态形式的多项式0xF4ACFB13,由CRC库提供。 注:此CRC多项式不同于FlexRay、CAN、LIN和TCPIP使用的CRC多项式。 |
Data ID | 32位 |
API规范
E2E_P04ConfigType
E2E_P04CheckStateType
头布局
E2E Profile 4由四个字段组成,包含Length、Counter、DataID、CRC,最大数据保护长度为4096 - 12 Bytes。[1]
在E2E配置文件4中,(要保护的数据的)用户数据布局不受E2E配置程序4的约束——只要求要保护的长度是1字节的倍数。
E2E配置文件4的标头具有一个固定布局,如下所示:
[注1]:[[AUTOSAR_FO_PRS_E2EProtocol#数据、通信总线的最大长度]]。
Length
16位数据长度,采用显式传输。
Counter
16位计数器,从0开始递增,增至0xFFFF时反转,采用显式传输。
Data ID
32位数据ID,采用隐式传输。
CRC
32位循环冗余校验码,多项式为0xF4ACFB13。
CRC算法详细介绍请参照[[CRC#CRC32_P4]]。
示例
以下示例假设的默认配置:
E2E_P04Protect()的结果,数据具有短数据长度(长度16字节,表示4个实际数据字节),offset=0,Counter=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x00 | 0x10 | 0x00 | 0x00 | 0x0a | 0x0b | 0x0c | 0x0d |
Field | Length | <- | Counter | <- | DataID | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0x86 | 0x2b | 0x05 | 0x56 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | <- | <- | <- | Data | <- | <- | <- |
[!NOTE] CRC
[0x00 0x10 0x00 0x00 0x0a 0x0b 0x0c 0x0d 0x00 0x00 0x00 0x00] = 0x862b0556
E2E_P04Protect()的结果数据,最小数据长度(4个数据字节),Offset=64,DataLength=24,Counter=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data | <- | <- | <- | <- | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0x00 | 0x18 | 0x00 | 0x00 | 0x0a | 0x0b | 0x0c | 0x0d |
Field | Length | <- | Counter | <- | DataID | <- | <- | <- |
Byte | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
Data | 0x69 | 0xd7 | 0x50 | 0x2e | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | <- | <- | <- | Data | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x18 0x00 0x00 0x0a 0x0b 0x0c 0x0d 0x00 0x00 0x00 0x00] = 0x69d7502e
[!NOTE] 总结
Data ID以大端序方式参与CRC计算,采用大端序传输(跟传输介质有关,以[[AUTOSAR_FO_PRS_E2EProtocol#字节序]]为准)。
E2E Profile 5
配置文件5应提供以下控制字段,在运行时与受保护数据一起传输:计数器、CRC、数据ID。
Control field | 描述 |
---|---|
Length | 16位,以支持动态大小数据。 |
Counter | 8位 (显式发送) |
CRC | 32位,正态形式的多项式0xF4ACFB13,由CRC库提供。 注:此CRC多项式不同于FlexRay、CAN、LIN和TCPIP使用的CRC多项式。 |
Data ID | 32位 |
API规范
E2E_P05ConfigType
E2E_P05ProtectStateType
E2E_P05CheckStateType
头布局
在E2E配置文件5中,(要保护的数据的)用户数据布局不受E2E配置书5的约束——只有一个要求,即要保护的长度是1字节的倍数。
E2E Profile 5的标头有一个固定布局,如下所示:
E2E Profile 5由3个字段组成,包含Counter、DataID、CRC,最大数据保护长度为4096 - 3 Bytes。[1] 。
[注1]:[[AUTOSAR_FO_PRS_E2EProtocol#数据、通信总线的最大长度]]。
Counter
在E2E配置文件5中,计数器被初始化、递增、重置并通过E2E配置进行检查。
在E2E配置文件5中,在发送方,对于数据元素的第一个传输请求,计数器应初始化为0,并且应针对每个后续发送请求递增1。当计数器达到最大值(0xFF)时,它将在下一个发送请求中以0重新启动。
注意:计数器值0xFF不是作为特殊无效值保留的,而是用作正常计数器值。
DataID
唯一的数据ID用于验证每个传输的安全相关数据元素的身份。
在E2E配置文件5中,应通过在CRC计算中的用户数据之后添加数据ID来隐式传输数据ID。
在E2E配置文件5中,数据ID在通信系统的网络中应该是全局唯一的(由多个ECU组成,每个ECU发送不同的数据)。
CRC
16位循环冗余校验码,多项式为0x1021。
CRC算法详细介绍请参照[[CRC#CRC16_CCITT_FALSE]]。
示例
以下示例假设的默认配置:
E2E_P05Protect()的结果数据,数据长度较短(长度为8字节,实际数据字节数为5),偏移量为0,计数器为0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x1c | 0xca | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | <- | Counter | Data | <- | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x00 0x00 0x00 0x34 0x12] = 0xCA1C
E2E_P05Protect()的结果数据,数据长度较短(长度为16字节,实际数据字节数为5),偏移量=64,计数器=1:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data | <- | <- | <- | <- | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0xFB | 0xD6 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | <- | Counter | Data | <- | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x34 0x12] = 0xD6FB
[!NOTE] 总结
Data ID放在Data后面,以小端方式参与CRC计算,CRC以小端方式传输(跟传输介质有关,以AUTOSAR_FO_PRS_E2EProtocol > 字节序为准)。
E2E Profile 6
配置文件6应提供以下控制字段,在运行时与受保护数据一起传输:长度、计数器、CRC、数据ID。
Control field | 描述 |
---|---|
Length | 16位,以支持动态大小数据。(显式发送) |
Counter | 8位 (显式发送) |
CRC | CRC库提供的16位标准形式的多项式0x1021(Autosar表示法)。(明确发送) |
Data ID | 16位,独特的系统范围。(隐式发送) |
API规范
E2E_P06ConfigType
E2E_P06ProtectStateType
E2E_P06CheckStateType
头布局
在E2E配置文件6中,(要保护的数据的)用户数据布局不受E2E配置程序6的约束—只要求要保护的长度是1字节的倍数。
E2E配置文件6的标头具有一个固定布局,如下所示:
上面显示的比特编号表示比特被传输的顺序。E2E报头字段(例如,E2E计数器)被编码为:
- Big Endian(最高有效字节优先),适用于隐式和显式头字段-由配置文件强制执行。
- LSB优先(字节内最低有效位优先)-由TCP/IP总线强制执行。
Counter
在E2E配置文件6中,计数器被初始化、递增、重置并通过E2E配置进行检查。计数器未被E2E监督的调用方操作或使用。
在E2E配置文件6中,在发送方,对于数据元素的第一个传输请求,计数器应初始化为0,并且应针对每个后续发送请求递增1。当计数器达到最大值(0xFF)时,它将在下一个发送请求中以0重新启动。
请注意,计数器值0xFF不是作为特殊无效值保留的,而是用作正常计数器值。
Data ID
唯一的数据ID用于验证每个传输的安全相关数据元素的身份。
在E2E配置文件6中,数据ID应通过在CRC计算中的用户数据之后添加数据ID来隐式传输。
在E2E配置文件6中,数据ID在通信系统的网络中应该是全局唯一的(由多个ECU组成,每个ECU发送不同的数据)。
Length
在Profile 6中,引入了长度字段以支持可变大小的长度-存储序列化数据的Data[]数组在每个周期中可能具有不同的长度。在配置文件6中,存在长度的显式传输。长度包括用户数据+E2E报头(CRC+计数器+Length)。
CRC
E2E Profile 6使用16比特CRC来确保足够的检测速率和足够的汉明距离。
E2E Profile 6应使用SWS Crc监督的Crc_CalculateCCRC16()函数来计算Crc(多项式:0x1021;Autosar表示法)。
在E2E配置文件6中,应在整个E2E报头(不包括CRC字节)上计算CRC,包括使用数据ID扩展的用户数据。
有关CRC算法的详细信息,请见[[CRC#CRC16_CCITT_FALSE]]。
示例
以下示例假设的默认配置(如果没有另行说明)不同::
![[Pasted image 20240425130148.png]]
E2E_P06Protect()的结果数据,数据长度较短(长度为8字节,实际数据字节数为3),偏移量为0,计数器为0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0xB1 | 0x55 | 0x00 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | <- | Length | <- | Counter | Data | <- | <- |
[!NOTE] CRC
[0x00 0x08 0x00 0x00 0x00 0x00 0x12 0x34] = 0xB155
E2E_P06Protect()的结果数据,数据长度较短(长度为16字节,实际数据字节数为3),偏移量=64(与SOME/IP标头用例相同),计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data | <- | <- | <- | <- | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0x4e | 0xb7 | 0x00 | 0x10 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | <- | Length | <- | Counter | Data | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x00 0x00 0x00 0x00 0x12 0x34] = 0x4eb7
E2E Profile 7
配置文件7应提供以下控制字段,在运行时与受保护数据一起传输:长度、计数器、CRC、数据ID。
Control field | 描述 |
---|---|
Length | 32位,支持动态大小数据 |
Counter | 32位 |
CRC | 64位,正态形式的多项式0x42F0E1EBA9EA3693,由CRC库提供。 注:此CRC多项式也称为“CRC64_XZ”。 |
Data ID | 32位,独特的系统范围。 |
CRC算法详细情况,请见[[CRC#CRC64_XZ]]。 |
API规范
E2E_P07ConfigType
E2E_P07ProtectStateType
E2E_P07CheckStateType
头布局
在E2E配置文件7中,(要保护的数据的)用户数据布局不受E2E配置程序7的约束——只要求要保护的长度是1字节的倍数。
E2E配置文件7的标头具有一个固定布局,如下所示:
上面显示的比特编号表示比特被传输的顺序。E2E报头字段(例如,E2E计数器)被编码为:
- Big Endian(最高有效字节优先)-由配置文件强制执行。
- LSB优先(字节内最低有效位优先)-由TCPIP总线施加。通过配置整个E2E报头的偏移量,可以将报头放置在受保护数据中的特定位置。
示例
以下示例假设的默认配置(如果没有另行说明)不同:
E2E_P07Protect()的结果数据,数据长度较短(长度为24字节,表示实际的4个数据字节),偏移量=0,计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x1F | 0xB2 | 0xE7 | 0x37 | 0xFC | 0xED | 0xBC | 0xD9 |
Field | CRC | <- | <- | <- | <- | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0x00 | 0x00 | 0x00 | 0x18 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Length | <- | <- | <- | Counter | <- | <- | <- |
Byte | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
Data | 0x0a | 0x0b | 0x0c | 0x0d | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data ID | <- | <- | <- | Data | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x18 0x00 0x00 0x00 0x00 0x0a 0x0b 0x0c 0x0d 0x00 0x00 0x00 0x00] = 0x1FB2E737FCEDBCD9
E2E_P07Protect()的结果数据,数据长度较短(长度32,表示4个实际数据字节),偏移量=64(与SOME/IP标头用例相同),计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data | <- | <- | <- | <- | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0x17 | 0xf7 | 0xc8 | 0x17 | 0x32 | 0x38 | 0x65 | 0xa8 |
Field | CRC | <- | <- | <- | <- | <- | <- | <- |
Byte | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
Data | 0x00 | 0x00 | 0x00 | 0x20 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Length | <- | <- | <- | Counter | <- | <- | <- |
Byte | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Data | 0x0a | 0x0b | 0x0c | 0x0d | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data ID | <- | <- | <- | Data | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x20 0x00 0x00 0x00 0x00 0x0a 0x0b 0x0c 0x0d 0x00 0x00 0x00 0x00] = 0x17F7C817323865A8
E2E Profile 8
配置文件8应提供以下控制字段,在运行时与受保护数据一起传输:长度、计数器、CRC、数据ID。
Control field | 描述 |
---|---|
Length | 32位,支持动态大小数据 |
Counter | 32位 |
CRC | 32位,正态形式的多项式0xF4ACFB13。 注:此CRC多项式不同于FlexRay、CAN、LIN和TCPIP使用的CRC多项式。 |
Data ID | 32位,独特的系统范围。 |
CRC算法详细情况,请见[[CRC#CRC32_P4]]。
API规范
E2E_P08ConfigType
E2E_P08ProtectStateType
E2E_P08CheckStateType
头布局
在E2E配置文件8中,(要保护的数据的)用户数据布局不受E2E配置程序8的约束——只要求要保护的长度是1字节的倍数。
E2E Profile 8的标头具有一个固定布局,如下所示:
E2E报头字段(例如,E2E计数器)被编码为:
- Big Endian(最高有效字节优先)-由配置文件强制执行。
- LSB优先(字节内最低有效位优先)-由TCPIP总线施加。通过配置整个E2E报头的偏移量,可以将报头放置在受保护数据中的特定位置。
示例
以下示例假设的默认配置(如果没有另行说明)不同:
E2E_P08Protection()的结果数据具有短数据长度(长度为20字节,表示4个实际数据字节),偏移量=0,计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x41 | 0x49 | 0x4e | 0x52 | 0x00 | 0x00 | 0x00 | 0x14 |
Field | CRC | <- | <- | <- | Length | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x0a | 0x0b | 0x0c | 0x0d |
Field | Counter | <- | <- | <- | DataID | <- | <- | <- |
Byte | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
Data | 0x00 | 0x00 | 0x00 | 0x00 | ||||
Field | Data | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x14 0x00 0x00 0x00 0x00 0x0a 0x0b 0x0c 0x0d 0x00 0x00 0x00 0x00] = 0x41494E52
E2E_P08Protect()的结果数据,最小数据长度(4个数据字节),偏移量=64(与某些/IP标头用例相同),数据长度=28,计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data | <- | <- | <- | <- | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0xe8 | 0x91 | 0xe5 | 0xa8 | 0x00 | 0x00 | 0x00 | 0x1c |
Field | CRC | <- | <- | <- | Length | <- | <- | <- |
Byte | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x0a | 0x0b | 0x0c | 0x0d |
Field | Counter | <- | <- | <- | DataID | <- | <- | <- |
Byte | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Data | 0x00 | 0x00 | 0x00 | 0x00 | ||||
Field | Data | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x1c 0x00 0x00 0x00 0x00 0x0a 0x0b 0x0c 0x0d 0x00 0x00 0x00 0x00] = 0xE891E5A8
E2E Profile 11
配置文件11与配置文件1总线兼容,但在接收器侧提供类似于配置文件4到7的“新”配置文件行为。此外,以下传统DataIDMode现已过时并被省略:E2E_P11_DATAID_LOW、E2E_P11_DATAID_ALT。
配置文件11应提供以下控制字段,在运行时与受保护数据一起传输:计数器、CRC、数据ID。
Control field | 描述 |
---|---|
Counter | 4位。(显式发送) |
CRC | 8位,CRC-8-SEJ1850,由CRC库提供。(显式发送) |
Data ID | 16位或12位,唯一的系统范围。(隐式发送(16位)或部分显式发送(12位;显式发送4位,隐式发送8位) |
AUTOSAR R4.0开始,CRC采用[[CRC#CRC8_SAE_J1850]]使用0xFF作为起始值和XOR值。R4.0之前,采用[[CRC#CRC8_SAE_J1850_ZERO]]使用0x00作为起始值和XOR值。
API规范
E2E_P11ConfigType
E2E_P11ProtectStateType
E2E_P11CheckStateType
头布局
在E2E配置文件11中,(要保护的数据的)用户数据布局不受E2E配置程序11的约束——只有一个要求,即要保护的长度是1字节的倍数。
配置文件11与配置文件1的总线布局向后兼容。这意味着,虽然所有标题字段都是可配置的,但配置文件1的配置文件变体也适用。
上图显示了配置文件11变体11C,其中配置如下:E2E头字段(例如CRC)像CAN和FlexRay中一样进行编码,即:
- CRC偏移=0
- 通过FlexrayCAN总线,CounterOffset=8。
- DataIDNibbleOffset=12对于配置文件11变体11A,不使用DataIDNibble。相反,用户数据可以放在那里。
E2E配置文件变体11A的定义如下,如下图所示:
- CRC是信号组中的第0个字节(即以比特偏移0开始)
- 活动计数器位于第一个字节的最低4位(即从位偏移8开始)
- E2E_P11DataIDMode=E2E_P11_DATAID_BOTH
- 信号IPdu.unusedBitPattern=0xFF。
Counter
在E2E配置文件11中,计数器被初始化、递增、重置并通过E2E配置进行检查。
在E2E配置文件11中,在发送方,对于数据元素的第一个传输请求,计数器应初始化为0,并且对于每个后续的发送请求应增加1。当计数器达到最大值(0x0E)时,它将在下一个发送请求中以0重新启动。
注意,计数器值0x0F被保留为一个特殊的无效值,并且永远不会被E2E配置文件11使用。
DataID
唯一的数据ID用于验证每个传输的安全相关数据元素的身份。
应支持以下两种数据ID模式:
- E2E_P11_DATAID_BOTH:在CRC计算中使用16位数据ID的两个字节:首先是低字节,然后是高字节。
- E2E_P11_DATAID_NIBBLE:不使用DATAID的高字节的高半字节(它是0x0),因为DATAID被限制为12位,所以在计算数据上的CRC时,DATAID的高字节的低半字节被明确传输并被CRC计算覆盖。低字节不被发送,但是它被包括在CRC计算中作为起始值。
在E2E配置文件11中,数据ID在通信系统的网络中应是全局唯一的(由多个ECU组成,每个ECU发送不同的数据)。
Length
在配置文件11中,没有明确的长度传输。
CRC
E2E配置11使用8比特CRC来确保足够的检测速率和足够的汉明距离。
E2E配置文件11应使用SWS Crc监督的Crc_CalculateCCRC8功能来计算Crc(CRC-8-SEA J1850)。
在数据ID模式设置为E2E_P11_DATAID_BOTH的E2E Profile11中,应通过在CRC计算中的用户数据之前先添加数据ID低字节,然后添加数据ID高字节,隐式传输数据ID。
在数据ID模式设置为E2E_P11_DATAID_NIBBLE的E2E Profile11中,数据ID的高字节的下半字节应放置在位位置DataIDNibleOffset的传输数据中,并且CRC计算应通过首先计算数据ID的低字节,然后计算0字节,再计算用户数据来完成。
示例
以下示例假设的默认配置(如果没有另行说明)不同:
DataIDMode set to E2E_P11DATAID_BOTH
E2E_P11Protect()的结果数据,数据等于全零(0x00),计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0xcc | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00] = 0xcc
E2E_P11Protect()的结果数据,数据等于全零(0x00),计数器=1:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x91 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00] = 0x91
DataIDMode set to E2E_P11DATAID_NIBBLE
E2E_P11Protect()的结果数据,数据等于全零(0x00),计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x77 | 0x10 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x10 0x00 0x00 0x00 0x00 0x00 0x00] = 0x77
E2E_P11Protect()的结果数据,数据等于全零(0x00),计数器=1:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x2a | 0x11 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x23 0x11 0x00 0x00 0x00 0x00 0x00 0x00] = 0x2a
这是配置P11与SOME/IP序列化程序一起使用的典型用例,它将一个8字节的标头放在序列化的用户数据前面。CRC计算包括8字节报头,然后包括有效载荷数据,不包括CRC字节本身。“偏移64”是指CRCCOffset设置为64,CounterOffset设置成72,DataIDNibleOffset设置到76。E2E_P11Protect()的结果数据,数据等于全零(0x00),计数器=0:
Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Data | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | Data | <- | <- | <- | <- | <- | <- | <- |
Byte | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Data | 0x77 | 0x10 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
Field | CRC | DataID-Nibble | Counter | Data | <- | <- | <- | <- | <- |
[!NOTE] CRC
[0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x23 0x10 0x00 0x00 0x00 0x00 0x00 0x00] = 0x77
E2E状态机规范
E2E配置文件检查()-函数验证在一个周期内接收到的数据。此功能仅确定该周期中的数据是否正确。相反,状态机在接收窗口内从check()函数的几个结果中建立一个状态,然后通过中间件接口(例如RTE API)将其提供给消费应用程序。
E2E状态机适用于所有E2E配置文件。可以通过参数进行配置。E2E状态机的使用由disableEndToEndStateMachine参数启用/禁用。
配置参数“disableEndToEndStateMachine”决定是否使用状态机。如果此参数设置为TRUE,则不应使用状态机。
在这种情况下,应用程序只能接收最新的E2E检查结果,而不能接收任何状态信息。
状态机概述
本章概述了状态机的功能,并包含了状态机行为的简化表示。状态和跃迁被完整地包括在内,但为了更好地理解,跃迁条件被广义化了。
状态机通过以下状态信息提供关于通信信道状态的汇总结果-E2E_SM_DEINIT、E2E_SM_INIT、E2E_SM_NODATA、E2E_SM_VALID、E2E_ SM_INVALID。
状态转换取决于E2E配置文件检查()的当前ProfileStatus和以前检查的ProfileStatus值。
可以借助参数TransitToInvalidExtended来调整状态机。
通过TransitToInvalidExtended=false:状态机的行为应符合下图。没有从E2E_SM_NODATA到E2E_SM_INVALID的直接转换,也没有由于计数器相关故障(Autosar R19-11或以前的行为)而从E2E_SM_INIT到E2E_SM_INVALID的转换。
通过TransitToInvalidExtended=true:状态机的行为应符合下图。涵盖了从E2E_SM_NODATA到E2E_SM_INVALID的直接转换,涵盖了由于计数器相关故障而从E2E_SM_INIT到E2E_SM_INVALID的转换(状态机扩展)。
状态机规范
本章包含了状态机行为的详细描述。所有的转换条件都有详细的描述。
E2E 状态机应该由函数 E2E _ SMCheck ()和 E2E _ SMCheckInit ()实现。
根据配置参数 TransitToInvalidExtended,E2E 状态机将显示与函数 E2E _ SMCheck ()相关的行为。
-
在TransitToInvalidExtended=false的情况下:E2E_SMCheck()的行为应符合下图。
-
在TransitToInvalidExtended=true的情况下:E2E_SMCheck()的行为应符合下图。
-
当前状态(例如E2E_SM_VALID)存储在状态->SMState中。
-
在每次调用E2E_SMCheck时,都可以处理ProfileStatus(如逻辑步骤E2E_SMAddStatus()所示)。
-
之后,检查两个计数器:State->ErrorCount和State>OKCount(在所有不同的状态下连续使用)。根据它们的值,有一个到新状态的转换,存储在状态->SMState中。
状态之间转换的条件包括在上图中表示。然而,为了更好地理解,添加了以下对状态转换的文本解释。
任何转换都是基于E2E检查功能的结果和当前E2E状态机状态触发的。E2E检查功能的结果可以总结为以下内容之一:
- 有效数据-E2E检查给出值E2E_P_OK。
- 数据损坏-E2E检查给出值E2E_P_ERROR。
- 无新数据-E2E检查给出值E2E_P_NONEWDATA。
大多数转换与TransitToInvalidExtended的值集无关。仅对TransitToInvalidExtended的特定设置有效的转换在末尾标记为(如果TransitToInvalidExtended=1)或(如果TransITToInvalidExtensions=0)。
从E2E_SM_NODATA转换
从E2E_SM_NODATA到E2E_SM_INIT的转换被触发,只要从E2E的角度来看最新接收的数据是不是损坏的数据。
从E2E_SM_NODATA到E2E_SM_INVALID的转换在WindowSizeInit消息周期的间隔内无论何时都被触发,或者没有检测到新数据或损坏的数据,或者两者的混合。(如果TransitToInvalidExtended=1)
从E2E_SM_INIT转换
每当在WindowSizeInit消息周期的间隔内检测到小于配置的损坏数据的数量且大于或等于配置的有效数据的数量时,就会触发从E2E_SM_INIT到E2E_SM_VALID的转换。
每当在WindowSizeInit消息周期的间隔内检测到大于配置的损坏数据数量时,就会触发从E2E_SM_INIT到E2E_SM_INVALID的转换。(如果TransitToInvalidExtended=0)
每当在WindowSizeInit消息周期的间隔内检测到大于配置的损坏数据数或小于配置的有效数据数时,就会触发从E2E_SM_INIT到E2E_SM_INVALID的转换。(如果TransitToInvalidExtended=1)
从E2E_SM_VALID转换
每当在WindowSizeValid消息周期的间隔内检测到大于配置的损坏数据数量或小于配置的有效数据数量时,就会触发从E2E_SM_VALID到E2E_SM_INVALID的转换。
从E2E_SM_INVALID转换
从E2E_SM_INVALID到E2E_SM_VALID的转换在WindowSizeInvalid消息周期的间隔内被触发,该间隔小于配置的损坏数据的数量并且大于配置的有效数据的数量。
状态机中使用了许多函数:
- E2E_SMAddStatus()
- E2E_SMCheckInit()
- E2E_SMClearStatus()
E2E_SMCheck()中的步骤E2E_SMAddStatus(ProfileStatus,State)应如下图所示。
E2E_SMCheckInit()用于根据所选配置初始化状态机。
E2E状态机应具有与函数E2E_SMCheckInit()相关的行为,如下图所示。
E2E_SMClearStatus()初始化整个监控窗口(ProfileStatus窗口),以清除窗口开始。
如果WindowSize由于状态转换而增加,则E2E_SMClearRemainingStatus()将初始化监控窗口(ProfileStatusWindow)的一部分。在这种情况下,通过将开头的附加窗口条目设置为E2E_P_NOTAVLABLE来清除它们。
E2E_SMCheck()中的步骤E2E_SMClearRemainingStatus(Config,State,NextState)应具有以下行为。
如果触发到E2E_SM_INVALID的转换,则同时应用E2E_SMClearStatus()和E2E_SMClearRemainingStatus()。参数Config->ClearToInvalid表示要应用的函数:Config->ClearToInvalid=True:E2E_SMClearStatus()Config->ClearToInvalid=False:E2E_SM ClearRemainingStatus()。