本学习笔记基于 R23-11 CP SWS AUTOSAR_CP_SWS_CANTransportLayer.pdf
AutoSar官方文档网址:Classic Platform AUTOSAR
一、导言和功能概述
CanTP位于PDU Router和CAN Interface module之间。CAN TP 模块的主要用途是分段和重新组装长度超过 8 字节的 CAN I-PDU 或长度超过 64 字节的 CAN FD。
根据 AUTOSAR 基本软件架构,CanTp 提供以下服务:
- 传输方向的数据分段
- 在接收方向重新组装数据
- 数据流控制
- 检测分段会议中的错误
- 传输取消
- 接收取消
尽管 CAN 传输协议主要用于车辆诊断系统,但它的开发也是为了满足其他基于 CAN 的系统对传输层协议的要求。
二、术语与缩略语
Prefix: | Description: |
---|---|
I- | 相对于AUTOSAR COM交互层 |
L- | 相对于CAN Interface 模块,它相当于逻辑链路控制(数据链路层的上部-下部称为媒体访问控制) |
N- | 相对于CAN Transport 层,它相当于OSI网络层 |
Acronym | Description |
---|---|
PDU | 在分层系统中,它指的是特定层协议中规定的数据单元。它包含该层的用户数据(SDU)以及可能的协议控制信息 X 层的 PDU 是其下层 X-1 的 SDU(即 (X)PDU = (X-1)SDU |
SDU | 在分层系统中,这是指由给定服务的用户发送的一组数据 层,并传输给对等服务用户,同时保持语义不变 |
I-PDU | This is the PDU of the AUTOSAR COM module |
CAN N-PDU | This is the PDU of the CAN Transport Layer. It contains a unique identifier, data length and data (protocol control information plus the whole N-SDU or a part of it). |
CAN N-SDU | This is the SDU of the CAN Transport Layer. In the AUTOSAR architecture, it is a set of data coming from the PDU Router. |
Abbreviation | Description |
STmin | 发送方在两次 CF 传输之间的最短等待时间 |
三、基本概念
3.1 CAN Transport Layer connection(s)
在AUTOSAR架构的最终版本中,传输协议工具将用于传输诊断(例如OBD和UDS协 议)和AUTOSAR COM I-PDUs。因此,CanTp模块能够同时处理多个连接(即并行处理 多个分段会话)。
最大同时连接数是静态配置的。这种配置对生成代码的复杂性和资源消耗(CPU、ROM和RAM)有重要影响,因为必须为每个同时访问预留资源(例如,用于处理N-PCI数据的接收和发送状态机、变量等)。
为了使用户能够选择同时接收(或发送)哪些I-PDUs,每个N-SDU标识符将通过配置的CanTp “connection channel” 进行内部路由。由于“connection channel”不可从外部访问,所有必要的信息以传输N-SDU将与N-SDU标识符相关联(例如,“连接通道”编号、超时、寻址格式等)。
3.2 CAN Transport Layer交互
CanTp 上部接口为 PduR 模块提供全局访问,以发送和接收数据。这种访问是通过 CANN-SDU 标识符(CAN NSduId)实现的。CAN NSduId 是指由描述 CAN N-SDU 的属性组成的常量数据结构。每个 CAN N-SDU 的特定数据结构都可能包含以下属性: N-SDU(Tx或Rx)的类型,其寻址格式,此消息的L-SDU标识符或其他对实现有用的属性。
下图显示了 CanTp、PduR 和 CanIf 模块之间的交互。
3.3 处理模式
AUTOSAR 通信栈支持轮询和事件触发两种模式。因此,每个通信层都可以从下层接收信息,并通过不同的机制将信息传播到上层。
对于CAN Transport Layer,仅支持事件触发模式。
3.4 数据一致性
为了优化通信堆栈, AUTOSAR 限制了 CAN 传输层的缓冲容量。因此, CanTp 将 N-SDU 有效载荷直接从上层(DCM、COM 或 PDU 路由器-在 1:1 TP 路由的情况下)复制到 CAN driver ,反之亦然。因此,为了保证数据的一致性,上层将遵守以下 规则:
- 在传输时,N-SDU数据有效载荷将保持不变,从传输请求到收到传输确认
- 在接收时,从接收开始到接收指示,N-SDU数据访问将被锁定
3.5 静态配置
在运行时,CAN传输模块必须具有管理传输连接所需的所有信息。因此,应静态配置以下属性:
- CAN N-SDU 的数量
- 每个 CAN N-SDU的唯一标识符
- 每个 CAN N-SDU的的通信方向(Tx或Rx)
- 每个连接的寻址格式(normal, extended, mixed 11bit, normal fixed, or mixed 29 bit),并且根据寻址格式,
– Normal: none
– Extended: N_TA
– Mixed 11 bit: N_AE
– Normal fixed: N_TA, N_SA
– Mixed 29 bit: N_TA, N_SA, N_AE
对于将 N-SDU 与元数据结合使用的通用连接,可以省略静态寻址信息。
- 每个连接的寻址格式(normal, extended or mixed),在extended寻址格式的情况下,为N_TA 值,在mixed格式的情况下为N_AE值
- 每个CAN N-SDU标识符都对应一个相关的CAN L-SDU标识符,必要时(多个帧分段会话),CAN L-SDU标识符用于传输CAN FC N-PDU
- 经典CAN帧和CAN FD帧
CAN Transport Layer 的配置可以在编译或构建后执行。
3.6 PDU Router services
CAN Transport Layer 使用 PDU Router 的回调功能来复制传输数据并确认传输,启动接收,复制接收到的数据并指示消息的接收:
- PduR_CanTpRxIndication
- PduR_CanTpStartOfReception
- PduR_CanTpCopyRxData
- PduR_CanTpCopyTxData
- PduR_CanTpTxConfirmation
3.7 CAN Interface services
CAN Transport Layer 使用CAN Interface 的以下服务进行传输 CAN N-PDUs:
- CanIf_Transmit
四.功能规格
本节介绍CAN Transport Layer 的功能。解释了向上层和下层提供的服务以及CAN Transport Layer的内部行为。
CanTp 模块提供分段、流量控制传输和消息重组服务。其主要目的是发送和接收可能适合或不适合单个CAN帧的消息。不适合单个CAN帧的消息将被分割成多个部分,以便每个部分都可以在单个CAN帧中传输。
4.1向上层提供的服务
CanTp模块的服务接口可分为以下几大类:
- 初始化和关闭
- 通信服务
以下段落描述了每个服务类别的功能。
4.1.1 初始化和关闭
- CanTp 模块应具有两种内部状态,CANTP_OFF和CANTP_ON
- 上电后CanTp模块应处于CANTP_OFF状态
- 在状态CANTP_OFF中,CanTp 应允许更新构建后的配置
- 当CanTp使用CanTp_Init()成功初始化时,CanTp模块将更改为内部状态 CANTP_ON
- 只有当 CanTp 处于CANTP_ON状态时,CanTp 模块才应执行分段和重新组装任务
- 函数CanTp_Init应初始化模块的所有全局变量,并将所有传输协议连接设置为 CANTP_ON 的子状态 , 其中分段传输和分段接收均未进行(Rx线程处于CANTP_RX_WAIT状态,Tx线程处于CANTP_TX_WAIT状态)
- 如果为CanTp模块启用了开发错误检测,当PDU Router或CAN Interface在调用CanTp_Init函数之前尝试使用任何功能(除了CanTp_GetVersionInfo)时,CanTp模块应引发一个错误(CANTP_E_UNINIT)
- 如果CanTp模块处于全局状态CANTP_ON时调用CanTp_Init函数,则该函数应将模块返回到空闲 Idle 状态(状态为CANTP_ON,但既不进行传输也不进行接收)
- 如果在 CanTp 模块处于全局状态CANTP_ON时,调用 CanTp_Init,则 CanTp 模块将断开所有当前连接
- 函数CanTp_Shutdown应正确停止CanTp模块
下图总结了上述所有要求:
4.1.2 传输请求
传输操作CanTp_Transmit()将允许上层请求使用CAN传输协议设施(如分段、扩展地址格式等)进行数据传输 。
- 函数CanTp_Transmit()应为异步
- 在传输请求被接受后,如果N-SDU传输被完全处理(成功与 否),CanTp模块将通知其上层
4.1.3 传输取消
传输取消功能允许上层取消正在进行的传输。
用例:由于接收到另一个具有更高优先级的诊断协议而取消诊断传输。
- 此功能应通过静态配置(参数CanTpTc)来激活或停用
- 传输取消由 CanTp_CancelTransmit()的调用触发
- 在调用服务CanTp_CancelTransmit()后,此连接上的传输将中止
注意: Api PduR_CanTpTxConfirmation()应在值为 E_NOT_OK 的传输代码之后调用。 请注意,如果传输正在进行中,则会在接收方端生成超时错误。
4.2 向下层提供的服务
根据AUTOSAR通信栈的规范,CAN Transport Layer为CAN interface提供以下两个回调函数: CanTp_TxConfirmation()和CanTp_RxIndication()。
4.2.1传输确认
CanIf模块应调用传输确认功能,以通知CAN Transport Layer CanTp请求的CAN帧传输是否成功执行。L-PDU标识符与呼叫相关联,以识别相应的传输。
- 当在最大时间(等于N_As)后未收到传输确认时,CanTp模块应中止相应的会话。 在收到传输确认之前,无论成功与否,N-PDU对其他并发会话都不可用。
- 对于确认调用,CanTp 模块应提供函数CanTp_TxConfirmation()
- 当调用CanTp_TxConfirmation()函数并返回结果为E_NOT_OK时,CanTp应中止相应的会话
N_As:发送端CAN帧(任意N-PDU)的传输时间
4.2.2 接收指示
CanIf模块应调用接收指示功能,通知CanTp模块已接收到新的CANN-PDU帧(即传输协议帧)。根据CanIf的配置,接收指示可以在中断服务例程(ISR)上下文中执行。
- 对于接收指示,CanTp 模块应提供 CanTp_RxIndication()
4.3 内部行为
CAN Transport Layer的内部操作提供了基本机制,以执行该模块的主要目的,即在单个CAN帧或 多个CAN帧中传输消息。
CAN Transport Layer的整个行为将被 event 事件触发,因此CanTp可以直接处理来自PDU Router的N-SDU(或来自CAN Interface的L-SDU)的传输。
4.3.1 N-SDU接收
- 当接收到SF或FF N-PDU时,CanTp模块应使用以下方式通知上层(PDU Router) PduR_CanTpStartOfReception()函数
注意:上层将保留并锁定一个缓冲区,用于接收N-SDU。
- CanTp应使用 PduR_CanTpStartOfReception()的参数 TpSduInfoPtr 向 PduR 提供 FF/SF 的内容
- 接收到的数据链路层数据长度(即RX_DL)应从CAN帧/PDU( CAN_DL)的第一个接收有效载荷长度推导出来,如下所示: 对于小于或等于 8 个字节CAN_DL值,RX_DL值应为 8。 对于大于 8 个字节的CAN_DL值,RX_DL值等于CAN_DL值
ISO frame overview table:
当CanTp_RxIndication被调用用于一个具有元数据的SF(单帧)或FF(首帧)N-PDU时,CanTp模块应存储PDU元数据中包含的寻址信息,并使用这些信息来初始化与上层的连接,用于传输FC(流控制)N-PDU,以及识别CF(连续帧)N-PDU。元数据中的寻址信息取决于寻址格式:
- Normal, Extended, Mixed 11 bit: none
- Normal fixed, Mixed 29 bit: N_SA(源网络地址), N_TA(目标网络地址)
当调用PduR_CanTpStartOfReception()进行通用连接(带有 MetaData 的N-SDU)时,CanTp 模块应通过 N-SDU 的MetaData转发提取的寻址信 息。元数据中的寻址信息 取决于寻址格式