1、 COM-Stack API中的两类参数
有粉丝@leilei,问我PDUID怎么这么绕?这就帮你分析一波,嘿嘿。。
我们在「Autosar通信协议栈-AutoSAR通信模块的架构AutosarComStack001 」可以知道,COM-Stack 数据传输和数据接收中的 API 定义的函数参数主要是两类参数:如下述API所示:
//一般通信发送 Std_ReturnType PduR_ComTransmit(PduIdType ComTxPduId, const PduInfoType* PduInfoPtr); Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId,const PduInfoType *PduInfoPtr)
// 诊断发送 Std_ReturnType PduR_DcmTransmit(PduIdType DcmTxPduId, const PduInfoType* PduInfoPtr); Std_ReturnType CanTp_Transmit( PduIdType CanTpTxSduId, const PduInfoType * CanTpTxInfoPtr );
- 一类是指向 PDU 数据缓冲区的指针,其中数据缓冲区包含要传输的信息(也就是当前层的SDU)
- 用于识别 PDU的句柄 ID(也称为 PDU-ID)
2、 局部PDU和全局PDU的定义及联系
为了使通信堆栈正常运行,相邻模块(例如Com和PduR )必须就在这些模块之间交换的 PDU-ID 约定一套规则,以确保这些相邻模块之间交换的 PDU-ID是同一个东西。有如下三个规则:
1. 每个模块都有自己的 PDU-ID ,独立于其他模块,可自由选择。
如有一个PDU,不妨叫他为【韭菜PDU】;【韭菜PDU】在Com模块的PDU-ID = 3;PduR 将【韭菜PDU】 传输到CanIf,而此时【韭菜PDU】在CanIf模块的PDU-ID = 6;但是请注意:韭菜PDU在Com模块/CanIf模块的句柄PDU-ID 是唯一的,否则用Davinci/EB工具配置的时候就会报错。但是有一种情况就是:两个不同的 API:PduR_ComTransmit()和PduR_- DcmTransmit()。即使它们在PduR模块中具有相同的句柄 PDU-ID,PduR 模块能够区分两个 PDU,因为可以根据其 API不同来区分,具有唯一的句柄 ID这一限制只在同一个 API 的范围适用。
2. 句柄 ID 由提供 API 的模块定义,并由调用 API 的模块使用。在PduR模块和Com模块交互的情况下,。。。。
3. 全局PDU的定义怎么样实现两个相邻模块使用的 PDU 的绑定呢?也就是【韭菜PDU】的两个影分身如何确保是同一个本体分解出来的呢?。。。。
3 、PDU之间的链接关系的传输接收配置的实例
3.1 Tx from Com to CanIf
。。。。。。。。
3.2 Rx from CanIf to Com
。。。。。。