1. 什么是I-PDU?
我理解的 I-PDU 应该就是一个 Message,Message 是由多个信号组成的。比如下图中多路复用 Multiplexor = 0 时,无数个信号组成了一个 Message。
Com模块获取应用层的信号(Signal),经一定处理封装为I-PDU(Interaction Layer Protocol Data Unit)发送到PduR模块。信号I-DPU可以包含一个或多个信号,可以理解为一个I-PDU为一帧CAN消息,信号就是dbc中定义的。如果需要将多个信号发送到同一I-PDU,则信号可以进一步形成信号组。
2. I-PDU中Callout有什么用,以及怎么用
为什么要用到Callout,AUTOSAR中有两种回调,一个是Callback,另一个是Callout
2.1 Callback:
callback函数,该函数是AUTOSAR规范里定义好的接口,通常是用于较底层模块(例如PduR)根据需求向上层(例如Com)提供通知。例如在Dcm模块中,当PduR调用Dcm_StartOfReception()和Dcm_CopyRxData()函数将收到的诊断请求数据放置在Dcm模块的Buffer中,然后PDUR调用Dcm_TpTxConfirmation()函数通知Dcm模块接收到了新的诊断请求,其中Dcm_TpTxConfirmation()就是callback函数
2.2 Callout:
callout函数与callback函数最大区别在于callout函数没有在AUTOSAR规范中定义,仅提供一个函数指针,通常用于OEM或者Tirer1实现特殊的需求,例如在Com模块中,对IPDU进行处理时,提供ComIPduCallout配置选项,用于设置一个callout函数对CAN或者其他总线信号进行处理
2.3 所以I-PDU中Callout是为例实现我们想要对某种信号进行特殊处理时,才会添加的。代码中会将回调函数放到一个数组里,之后重新定义一个接口,在函数里进行调用;
如果是RX中的 I-PDU中Callout, Callout 在 Com_RxIndication()的上下文中调用
如果是TX中的 I-PDU中Callout, 在COM触发发送之前调用Callout
下面只截取了一些用到Callout的函数和结构体,宏定义以及COM接收到数据的buffer没有展示;