【小猫爪】AUTOSAR学习笔记12-功能安全之E2E模块

前言

  从这一节开始,正式步入功能安全专题。这一节先来看一个与Communication Stack强相关的且与功能安全有关的模块,它就是E2E模块。

1 E2E模块简介

  E2E在AUTOSAR架构中,它被定义成是一个函数库。E2E 可以保护安全相关的数据交换,避免数据交换过程中通信链路造成的错误。E2E通信保护库实现了这些保护机制算法。E2E 的主要功能:

  1. 为将要发送的安全相关的数据提供保护;
  2. 对接收到的安全相关的数据进行校验;
  3. 对接收到的安全相关的数据错误做出指示。

  E2E模块保护数据的算法其实就是CRC,它主要就是定义了怎样使用一些特定的CRC算法来确保数据的准确性和连续性,E2E用在发送数据上叫做Protect,用在接收数据上叫做Check。

2 E2E功能简介

  E2E 模块可以被三个地方调用,分别是COM 模块中的COM callout ,E2E Transformer模块 和 E2E Protection Wrapper。当 E2E 库被 Transformer 和 Wrapper 调用时,需要在 Transformer 和 Wrapper 中对数据元素进行序列化。在 E2E 模块内部会调用 Crc 模块提供函数。

2.1 五种保护机制

  E2E提供了一下五种保护机制来保护数据安全,如下:

  1. CRC:发送端根据数据计算CRC值,接收端会重新计算并检查。
  2. Sequence Counter: 发送端每次传输,该值都会加一,接收端会检查该值。
  3. Alive Counter:发送端每次传输,该值都会加一,接收端会检查该值,通常跟Sequence Counter是一个东西(具体我也不知道有什么区别)。
  4. Data ID:给每个数据或者I-PDU Group编号。
  5. Timeout detection: 接收者接收超时,发送者响应超时。

  为了同时满足保护机制的标准化和灵活性要求,E2E 模块提供了很多个 profile,包括P01、P02、P04、P05 和 P06,P07, P11, P22,它们之间的最大区别就在于每一个所采用的保护机制是以上五个保护机制的子集。

Profile保护机制发送描述最大保护数据长度
Profile01Counter(4bit)、Data ID(16bit)、 CRC8、Timeout monitoringData ID由Data ID Mode决定是否发送 ,Counter和CRC需要发送30bytes
Profile02Counter(4bit)、Data ID List(8bit)、 CRC8Data ID 不会发送,仅用作 CRC计算,Counter和CRC需要发送256bytes
Profile04Counter(16bit)、Data ID(32bit)、CRC32、Length(16bit)Counter、Data ID、CRC、Length均会发送4096bytes
Profile05Counter(8bit)、Data ID(16bit) 、CRC16Data ID 不会发送,仅用作 CRC计算,Counter和CRC需要发送4096bytes
Profile06Counter(8bit)、Data ID(16bit)、CRC16、Length(16bit)Data ID 不会发送,仅用作 CRC 计算,Counter,CRC和Length需要发送4096bytes
Profile07Counter(32bit)、Data ID(32bit)、CRC64、Length(32bit)Counter、Data ID、CRC、Length均会发送未知
Profile11Counter(4bit)、Data ID(16bit or 12bit)、CRC8Counter、Data ID、CRC均会发送30bytes
Profile12Counter(4bit)、Data ID List(16*8bit)、CRC8Data ID 不会发送,仅用作 CRC计算,Counter和CRC需要发送未知

:1. 保护机制中包含Length的Profile支持保护不定长数据,其他则不支持。2. 保护机制中的Data ID List指的是每一条消息的Data ID由Counter值去确定,所以需要静态定义Data ID和Counter的对应表格,这种机制就叫做Data ID List。3. 当使用 profile4、profile5 和 profile6 保护数据时,如果需要保护的数据较长时,CRC 计算时间会较长,由于 E2E 模块的保护和检测功能都是同步执行的,可能会影响系统的实时性。4. 每一种profile检测到错误时所采取的措施也是不一样的,至于每一种profile的工作机制大家可以参考官方规范手册《AUTOSAR_SWS_E2ELibrary.pdf》。

2.2 E2E的状态机

  E2E profile 中对数据的检测只表示在单个周期内数据的正确性,E2E 的状态机则将固定次数内(reception window)的 profile 数据检测结果进行统一管理,并将处理后的状态提供给调用者,调用者可根据状态决定是否使用数据。E2E 各状态转换描述如下:
在这里插入图片描述
  各个状态具体描述如下:

状态描述
E2E_SM_DEINIT未初始化状态,在此状态如果用户调用 E2E_SMCheck,返回 E2E_E_WRONGSTATE。
E2E_SM_NODATA无数据状态,调用 E2E_SMCheckInit,进入该状态。在该状态如果用户调用 E2E_SMCheck,检测的 profile 状态不 为 E2E_P_ERROR 和 E2E_P_NONEWDATA , 则 进 入E2E_SM_INIT 状态,否则一直停留在此状态。
E2E_SM_INIT初 始 化 状 态 , 在 reception window 内 , 用 户 调 用E2E_SMCheck,更新 ErrorCounter 和OKCounter 的值。如果 ErrorCounter 的值小于等于设置的阈值并且 OKCounter大于等于设置的阈值,则进入 E2E_SM_VALID 状态。如 果 ErrorCounter 的 值 大 于 设 置 的 阈 值 , 则 进 入E2E_SM_INVALID 状态。否则一直停留在该状态。
E2E_SM_VALID数 据 有 效 状 态 , 在 reception window 内 , 用 户 调 E2E_SMCheck,更新 ErrorCounter 和 OKCounter 的值。如果 ErrorCounter 的值小于等于设置的阈值并且 OKCounter大于等于设置的阈值,则停留在该状态。否则进入E2E_SM_INVALID 状态。
E2E_SM_INVALID数 据 无 效 状 态 , 在 reception window 内 , 用 户 调 用E2E_SMCheck,更新 ErrorCounter 和 OKCounter 的值。如果 ErrorCounter 的值小于等于设置的阈值并且 OKCounter大于等于设置的阈值,则进入 E2E_SM_VALID 状态。否则一直停留在该状态。

2.3 E2E Protection Wrapper

  前面提到了E2E Protection Wrapper 属于 E2E 三种调用者之一,其位置比较特殊,它不属于BSW层,而是位于 RTE 之上,属于 SWC 层的一部分,其保护的数据需要为信号组的形式。其结构如下:
在这里插入图片描述

  E2E Protection Wrapper主要功能如下。
  1. 负责将复杂数据元素进行序列化
  2. 负责将调用 E2E Lib 时使用的数据结构实例化和初始化
  3. 调用 E2E 接口对数据元素进行保护
  4. 调用 RTE 接口接收和发送数据

  E2E Protection Wrapper 为每组需要保护的数据元素生成一组接口,发送数据接口E2EPW_Write_<p>_<o> 和 E2EPW_WriteInit_<p>_<o> , 接 收 数 据 接 口E2EPW_Read_<p>_<o> 和 E2EPW_ReadInit_<p>_<o> 。 当 用 户 发 送 数 据 时 调 用E2EPW_Write_<p>_<o> ()接口,该接口将数据进行序列化,调用 E2E 的接口保护数据,调用 RTE 的数据发送接口发送数据;当用户接收数据时调用 E2EPW_Read_<p>_<o> ()接口,该接口调用 RTE 的数据接收接口接收数据,序列化接收数据,并调用 E2E 接口检查接收数据。

2.4 E2E 错误反馈方式

  当用户使用 E2E Protection Wrapper 调用 E2E 时,E2E 中检查的错误通过 E2EProtection Wrapper 中的返回值反馈给用户。该返回值为 32 位的无符号数,各字节代表不同的错误类型。E2EPW_Write**<p>_<o>和 E2EPW_Read**<p>_<o>返回值描述如下表。

函数类型返回值 Byte3返回值 Byte2返回值 Byte1返回值 Byte0
WriteE2E_PxxProtect 函数 的 返 回 值 , 当Byte1 为 E2E_E_OK时,该值才有效E2E ProtectionWrapper 实 时 检 查的结果Rte_Write 函数的返回值,当 Byte2 为E2E_E_OK 时,该值才有效
ReadE2E_PxxCheck 函数检查的错误状态,当Byte2 为 E2E_E_OK时,该值才有效E2E_PxxCheck 函数的返回值,当 Byte1为 E2E_E_OK 时,该值才有效E2E Protection Wrapper 实 时 检 查的结果Rte_Read 函数的返回值,当 Byte1 为E2E_E_OK 时,该值才有效

  E2E_PxxCheck 函数检查的错误状态描述如下表:

错误状态描述
E2EPW_STATUS_OK0x0数据被正确接收,无 crc、counter 等错误
E2EPW_STATUS_NONEWDATA0x1检查函数被调用,但是未收到新数据
E2EPW_STATUS_WRONGCRC0x2接收到新数据,但是存在 crc 或其他数据检查错误
E2EPW_STATUS_SYNC0x3数据被正确接收,但是由于上次产生的检查错误,导致数据连续性检查需要进行数据同步
E2EPW_STATUS_INITIAL0x4已接收数据,crc 正确,但是由于进行了初始化导致无法验证 counter 的正确性
E2EPW_STATUS_REPEATED0x8已接收数据,crc 正确,但是 counter 重复
E2EPW_STATUS_OKSOMELOST0x20已接收数据,crc 正确,但是 counter 不连续,DeltaCounter 在可接受范围内
E2EPW_STATUS_WRONGSEQUENCE0x40已接收数据,crc 正确,但是 counter 不连续,DeltaCounter 超出可接受范围

END

  • 15
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
神经网络在自动驾驶中扮演着重要角色,它可以帮助车辆感知环境、做决策和控制行为。以下是一个简单的自动驾驶神经网络算法代码详解: ```python import numpy as np # 定义神经网络类 class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): # 初始化权重和偏置 self.W1 = np.random.randn(input_size, hidden_size) self.b1 = np.zeros((1, hidden_size)) self.W2 = np.random.randn(hidden_size, output_size) self.b2 = np.zeros((1, output_size)) def forward(self, X): # 前向传播计算输出 self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = np.tanh(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.a2 = self.sigmoid(self.z2) return self.a2 def backward(self, X, y, learning_rate): # 反向传播更新权重和偏置 m = X.shape[0] delta2 = self.a2 - y dW2 = (1/m) * np.dot(self.a1.T, delta2) db2 = (1/m) * np.sum(delta2, axis=0) delta1 = np.dot(delta2, self.W2.T) * (1 - np.power(self.a1, 2)) dW1 = (1/m) * np.dot(X.T, delta1) db1 = (1/m) * np.sum(delta1, axis=0) self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 def sigmoid(self, x): # sigmoid激活函数 return 1 / (1 + np.exp(-x)) # 样本输入和输出 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) # 创建神经网络对象 nn = NeuralNetwork(2, 3, 1) # 训练神经网络 for i in range(10000): output = nn.forward(X) nn.backward(X, y, learning_rate=0.1) # 测试神经网络 test_input = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) predictions = nn.forward(test_input) print(predictions) ``` 这段代码实现了一个简单的多层感知器神经网络,用于解决XOR逻辑门问题。其中`NeuralNetwork`类定义了神经网络的结构和操作,`forward`方法用于前向传播计算输出,`backward`方法用于反向传播更新权重和偏置。最后通过训练和测试数据来验证神经网络的准确性。该代码可以作为自动驾驶神经网络算法的基础,根据具体问题进行进一步扩展和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猫爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值