1. General behavior一般行为
在CanIf范围内,传输过程始于调用CanIf_Transmit(),并在调用上层模块的回调服务<User_TxConfirmation>()时结束。在传输过程中,CanIf、CanDrv和CAN邮箱应共同将要传输的L-PDU仅存储一次在单个位置。根据传输方法,这些位置可以是:
• CAN硬件传输对象或
• 如果启用了传输缓冲,则为CanIf内的传输L-PDU缓冲区。
对于触发传输,CanIf只需存储给定L-PDU的传输请求,而不是其数据。当HTH再次空闲时,数据将通过触发传输函数及时获取。请求传输的单个Tx L-PDU永远不应存储两次。这种行为对应于CAN网络上定期通信的通常方式。
如果启用了传输缓冲,则如果CanDrv在传输请求时拒绝了Tx L-PDU,CanIf将在CanIf Transmit L-PDU缓冲区(CanIfBufferCfg)中存储它。
基本上,CanIf中用于缓冲Tx L-PDU的整个缓冲区由一个或多个CanIfBufferCfg(请参见CanIfBufferCfg)组成。每个CanIfBufferCfg分配给一个或多个专用的CanIfBufferHthRef(请参见CanIfBufferHthRef),并可配置为缓冲一个或多个Tx L-PDU。但是,如上所述,在CanIfBufferCfg的总数中,每个Tx L-PDU只能缓冲一个实例。
当对应的Tx L-PDU的配置设置中启用了传输缓冲时,CanIf在L-PDU传输期间的行为与未启用传输缓冲时不同。如果禁用传输缓冲并且向CanDrv发出的传输请求失败(CAN控制器邮箱正在使用,BasicCAN),则L-PDU不会复制到CAN控制器的邮箱中,CanIf_Transmit()返回值为E_NOT_OK。如果启用了传输缓冲并且传输请求发送失败,则根据CanIfTxBuffer配置,L-PDU可以存储在CanIfTxBuffer中。在这种情况下,尽管无法执行传输,API CanIf_Transmit()返回值为E_OK。在这种情况下,CanIf通过CanIf_TxConfirmation()回调处理L-PDU的未完成传输,上层模块无需重试传输请求。
可用的传输CanIf Tx L-PDU缓冲区的数量可以完全独立于在CAN网络描述文件中定义的用于该ECU的已使用传输L-PDU的数量进行配置。
根据[SWS_CANIF_00835],Tx L-PDU通过CanIfBufferCfg配置容器(请参见CanIfBufferCfg)引用HTH。即使不需要传输缓冲,这也是有效的。在这种情况下,CanIfBufferCfg的缓冲区大小(请参见CanIfBufferSize)必须设置为0。然后,CanIfBufferCfg配置容器仅用于引用HTH。
2. Buffer characteristics缓冲区特性
CanIfTxPduBufferRef、CanIfBufferCfg、CanIfBufferHthRef和CanIfBufferSize描述了可能的CanIfBufferCfg配置。
2.1.将L-PDU存储在发送L-PDU缓冲区中
Can