
AUTOSAR架构的COM
接收操作
PduR模块向上路由接收通知,将COM的调用Com_RxIndication函数,其调用逻辑下图1。
图1 接收通知逻辑,引自[1]
Com_RxIndication函数定义如下:
图2 Com_RxIndication函数定义,引自[2]
当进入Com_RxIndication函数,对8个字节的数据进行解包的内部处理。
图3 引自[2]
关于解包模式有两种:IMMEDIATE(立刻)和DEFERRED(推迟),可通过
ComIpduSignalProcessing配置。这两种模式的区别是:DEFERRED模式下,COM模块必须先复制Ipdu的数据。DEFERRED模式下,信号通知/确认周期性执行,而IMMEDIATE模式下,信号通知/确认则在接收通知/发送确认函数及时执行。
图4 解包模式,引自[2]
当解包一条I-PDU时,COM模块必须检查接收数据的长度,解包,通知(解包完成)。这里解包就像根据报文通信协议配置DBC,即将8个字节数据从某位到某某位逐个提取,赋给对应的已定义好信号,已提取的信号数据存于COM模块的buffer。
图5 DBC配置
然后ASW经RTE模块调用Com模块的Com_ReceiveSignal或Com_ReceiveSignalGroup函数提取相关的信号。关于Com_ReceiveSignal函数定义如下:
图6 Com_ReceiveSignal函数,引自[2]
以上就是从PduR模块到COM模块再到ASW的接收过程,如下图7右框所示。发送过程则如左框所示,类似于接收的逆过程,下面来具体了解下。
图7 接收发送过程示意,引自[3]
发送操作
首先,ASW经RTE模块调用Com模块的Com_SendSignal或Com_SendSignalGroup函数发送相关的信号给COM模块,存入其相关的buffer。关于Com_SendSignal函数定义如下:
图8 Com_SendSignal函数定义,引自[2]
这里需要判断buffer是否有足够的存储空间,故将调用Com_TriggerTransmit函数来检查,该函数定义如下:
图9 Com_TriggerTransmit函数,引自[2]
再通过周期性调用Com_MainFunctionTx函数将刚存入buffer的数据进行打包成I-PDU格式。
图10 Com_MainFunctionTx函数,引自[2]
在Com_MainFunctionTx中通过调用PduR模块的PduR_ComTransmit函数向下发送数据。
图11 发送请求过程,引自[1]
当发送成功后,CAN模块将向上确认,从PduR模块到COM模块,将调用Com_TxConfirmation函数完成确认。
图12 Com_TxConfirmation函数,引自[2]
以上就是从ASW到COM模块再到PduR模块的发送过程,当然这里忽略很多传输特性的细节,若想了解如下图13,14所示的CAN发送接收过程,详见[2]。
图13 发送过程,引自[2]
图14 接收过程,引自[2]
信号处理
COM模块处理PDU与信号的转换,而与前面文章的CAN,CAN接口和PDUR模块的处理均仅基于PDU,那么针对PDU转换成信号,会有什么不一样的要求呢?
1)支持数据类型
首先是信号的数据类型,COM模块必须支持下图15所示的数据类型:
图15 数据类型,引自[2]
2)字节顺序--大小端
然后是字节顺序问题,即大端格式还是小端格式,其定义如下图16,17所示。对应的就是我们在报文通讯协议定义中看到的motorola格式(大端)和Intel格式(小端)。COM模块必须要在发送方的I-PDU调用前执行字节顺序转换。
图16 小节字节顺序,引自[3]
图17 大端字节顺序,引自[3]
关于大小端的详细解释,推荐一篇非常不错的博文,见参考[4]。
3)符号扩展
其次是数据的符号问题。比如如何处理有符号数据,如下图18示例。由此可知COM模块定义一套符号转换的规则。
图18 有符号数据转换示例,引自[2]
图19 符号转换规则示意。
4)信号值
信号值有3种类型:初始值,无效值和正常值,如下表所示。那么分别在什么时候使用呢?
引自[2]
- 对于初始值,主要是COM模块在初始化发送方和接收方的每一个信号使用。
- 对于无效值,主要是当发送方不能提供有效值给相应信号,比如发送方因传感器故障的情况,这时COM模块为发送方提供一个无效值来代替。
除了以上要求,当然还需要考虑很多因素,比如更新位,可参考[5]。
以上就是CAN通讯中COM模块的简单介绍,写到此处觉得有些地方还需推敲,待后续进一步研究再来更新。
注:
COM模块来源于ISO17356-4,若要深入理解COM模块,可以去参考ISO17356 part1-6。
文章转载自公众号:汽车电子与软件
