一条报文在CanIf模块中都经历了什么
写在前面入行一段时间了基于个人理解整理一些东西如有错误欢迎各位大佬评论区指正CanIf模块是 AUTOSAR 基础软件BSW的一部分位于 CAN 驱动程序CanDrv、CAN 收发器CanTrcv和上层通信服务层如 CanSm、CanNm、CanTp、PduR之间。它提供了一个标准化的接口用于管理不同类型的 CAN 硬件设备如 CAN 控制器和 CAN 收发器并确保硬件独立性。1.一条Rx报文都在CanIf模块中经历了什么回答这个问题前先来看几个参数表。对于一条报文它存在若干属性比如ID比如CANFD/CAN报文类型比如Full/BasicCAN。当我在接收一条报文时我需要去验证这条报文是不是我要接收的它的属性是不是和我期望是一致的。那么我就需要几个参数表表中会存储报文信息。1.1CanIf_MailBoxConfig从上到下依次表示为该报文属于哪个通道First PduIdLast PduIdTx报文配置参数Buffer配置参数Buffer IdMailBox类型即FullCAN or Basic CAN1.2CanIf_RxPduConfig从上到下依次表示为PduIDMASK下游模块Pdu名称是否为NM报文下游回调函数DlcMessage Type:CAN or CANFD1.3Rx报文进入CANIF模块当控制器收到一条Rx报文且CAN层会调用CanIf_RxIndication将PDU传入CANIF模块会传入接收这条报文的Mailbox等。1.4Rx报文属性校验在CanIf_RxIndication中首先会基于CanId来判断MsgType是否为CANFD报文Remove FD-flag from CAN identifier通过MailBox索引号找到CanIf_MailBoxConfig中记录的PDUID,比较报文属性与本地属性表中记录的信息是否一致若不一致则丢掉该报文。这里对于FullCAN和BasicCAN会调用不同的函数来判断主要原因是BasicCAN的MaiBox能够接收一定范围ID的报文对于RxID,需要进行计算来判断是否能够接收。1.5报文传递给下游模块上述属性校验通过后调用CanIf_HlIndication向下传递在这里还有校验DLC长度。最终将pduinfo传递给下游的回调函数有可能是PduR_CanIfRxIndication也有可能是CanTp_RxIndication或者CanNm_RxIndication。需要调用哪个查找表CanIf_RxPduConfig。2.一条Tx报文都在CanIf模块中经历了什么如果CANNM模块或者PDUR模块想发送一条CAN报文首先会调用CanIf_Transmit函数将PduInfo传入CANIF模块中基于传入的PduId查找CanIf_TxPduConfig获取报文属性。包括通道MailBoxConfigIdxTxPduLength等。和Rx报文类型会依次检查报文长度是否正确该通道是否正常工作等。之后将报文加入到对应队列等待发送。发送成功后查找表格CanIf_TxConfirmationFctList判断应该调用哪个函数上报发送成功的消息。常用的有CanNm_TxConfirmationCanTSyn_TxConfirmationPduR_CanIfTxConfirmation等。