文章包含了AUTOSAR基础软件(BSW)中COM模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解COM这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都是依托于ETAS提供的工具链来配置与生成的,与AUTOSAR规范之间可能会有些许的出入,但总体的功能要点与处理流程都应该是一致的。
COM模块作为面向应用的最后一级通信抽象,为应用提供由板卡上涉及的通信接口(CAN/LIN/FlexRay等)收到的有效信息数据,应用完全不用考虑底层的通信实现,直接使用数据来实现应用的业务即可。以CAN通信举例,将DBC导入之后,经过RTA-BSW自动生成的COM模块就可以完成基本的使用需求,适当的连接系统信号之后应用层就可以使用有效数据,COM模块来负责打包、解包,大小端调整等工作。COM模块还提供了丰富的回调函数供基础软件实现一些特定功能,诸如我们可以使用超时回调函数来判断发送此报文的ECU节点是否正常。
目录
AUTOSAR规范解析
缩略语与概念定义
与其他模块的依赖关系
PDU Router
Com Users
COM通用定义
AUTOSAR COM basis
字节序转换与符号扩展
信号值定义
滤波
网关
模块功能行为
通信模式
I-PDUS的处理
接收超时监控
信号组
更新位
COM模块的交互模型
时序图
COM模块与PduR的接口
PduR、COM与RTE之间的确认处理(发送)
PduR、COM与RTE之间的指示处理(接收)
ISOLAR-AB配置
COM
ComGeneral
ComGwMapping
ComIPduGroups
ComIPdus
ComSignals
ComTimeBase
代码解析
动态配置代码
集成代码
静态代码
AUTOSAR规范解析
- 为用户提供面向信号的数据接口(例如RTE、SwCluC)。
- 将AUTOSAR信号打包到待发送的I-PDU中。
- 将接收的I-PDU拆包并向用户提供接收信号(例如RTE、SwCluC)。
-
将待发送的I-PDUs的信号路由到I-PDU中,以便发送 。
-
将待发送的I-PDUs中的信号组路由到I-PDU中以发送。
-
通信传输控制(I-PDU组的启动/停止)。
-
发送请求的复制。
-
保证传输I-PDU之间的最小距离。
-
接收信号的监测(信号超时)。
-
输入信号的滤波机制。
-
通知机制(接受后,发送前,超时等回调)。
-
提供初始化值和更新指示。
-
字节顺序转换(大小端转换)。
-
符号扩展。
-
针对每个 I-PDU支持两种不同的传输模式。
-
基于信号的网关。
-
支持大且动态长度的数据类型。
缩略语与概念定义
-
AUTOSAR COM:AUTOSAR COM模块的规范定义来自《ISO 17356-4:2005 Road vehicles -- Open interface for embedded automotiveapplications -- Part 4: OSEK/VDX Communication (COM)》
-
DM:Deadline Monitoring,超时检测。
-
I-PDU:Interaction Layer Protocol Data Unit,交互层协议数据单元。
-
L-PDU:Data Link Layer Protocol Data Unit,数据链路层协议数据单元。在AUTOSAR中,数据链路层次相当于通信硬件抽象层和单片机抽象层。
-
MDT:Minimum Delay Timer,最小延时时间。
-
PDU Router:PDU Router是将I-PDU从一个模块传输到另一个模块的模块,可用于网关操作
和内部路由。 -
SDU:Service Data Unit
-
TM:Transmission Mode
-
TMC: Transmission Mode Condition
-
TMS:Transmission Mode Selector
-
Confirmation:确认后,PDU路由器会报告COM模块的请求已成功完成。这是对COM请求的相应。例如,当PDU成功传输时。
-
Data Invalid Value:COM模块发送的默认值,发送方侧的AUTOSAR软件组件无法提供有效值。
-
Dynamic Length Signal:动态长度信号是在运行时长度可变化的信号。
-
Group signal:Group signal是包含在信号群中的一个信号。
-
Indication:Indication是从PDU路由器到COM的异步信息,例如确认某个东西已经被接收到。
-
Init Value:COM启动后,COM模块将I-PDU和信号设置为Init Value。该值一直使用到被覆盖为止。
-
I-PDU group:I-PDU组是COM模块中相同方向(即发送或接收)的I-PDU的任意集合。
-
Inter-ECU–communication:两个或多个ECU之间的通信(例如通过CAN网络)。
-
Intra-ECU–communication:在同一ECU上的软件组件之间的通信。
-
Large Signal:大信号是指大到无法容纳在基础通信协议的单个L-PDU中的信号。
-
Large I-PDU:大型 I-PDU不适合底层通信协议的I-PDU。大型I-PDU将像其他I-PDU一样由 COM处理,但通过 TP API 传输/接收。
-
Message:意义与Signal一致。
-
Metadata:对于某些I-PDU,例如J1939 I-PDU来说,有效载荷随着元数据的增加而扩展,例如CAN-ID。
-
Notification:COM模块向其用户(例如RTE、SwCluC)提供信息,例如,当有新数据可用
时,发生错误时。 -
Signal:对应用层具有实际物理含义的最小数据单元。
- Signal group:在AUTOSAR中,使用了所谓的复杂数据类型。在复杂数据类型内部,有一个或多个数据元素(基本数据类型),就像在C语言中的结构中一样。用户(如RTE或SwCluC)将复杂的数据类型分解为单个信号,并将其发送到AUTOSAR模块。由于这些信号整体上需要一致地处理,它们被称为信号组。
-
Update-bit:信号/信号组的接收者可以在发送之前通过它确定发送者是否已更新此信号/信号组中的数据。
与其他模块的依赖关系
COM模块与其他基础软件模块的关系大部分都是可选,不是必须的,主要还是在RTE和PduR之间用作通信的最后一级抽象。下图展示了COM模块与其他模块间关系。
PDU Router
COM模块使用两种PduR模块的APIs的并集,分为使用TP的APIs和不使用TP的APIS。它们之间是必须要区分的,因为COM模块通过简单的L-PDU传输未分割的I-PDU或通过TP传输分割的I-PDUS。下面总结了AUTOSAR COM模块的对PduR的功能需求:
- 输入I-PDU的标识。
- 用于输出I-PDU的发送接口,包括确认通信控制器是否已发送I-PDU。
- 触发接口,使PduR进行传输。
-
TP通信的缓冲区处理。
Com Users
使用Com模块的主要有两个部分,一个是RTE(Runtime Environment),一个是SwCluC。
RTE:RTE使用COM模块的功能来发送和接收信号。在AUTOSAR中,RTE是COM模块的上层。
SwCluC:SwCluC建立了软件集群之间的连接,用于交换(提供和接收)信号和信号组。应用程序软件集群中可以通过Com代理接口访问信号和信号组,并他提供回调。
COM通用定义
AUTOSAR COM basis
因为COM模块来自的规范定义来自《ISO 17356-4:2005 Road vehicles -- Open interface for embedded automotive applications -- Part 4: OSEK/VDX Communication (COM)》,所以我们根据ISO 17356-4对COM的功能定义,来类比介绍AUTOSAR的COM模块。
ISO 17356-4功能定义 | AUTOSAR COM实现 | ISO 17356-4相关API |
将接收的网络消息(在I-PDU中)映射到多个信号(1到n分裂机制) | 由RTE实现 | 无 |
将内部消息映射到多个消息数据对象(1到n分裂机制) | 由RTE实现 | 无 |
将只在本地发送的消息映射到外部发送消息对象和内部接收消息对象(1到n分裂机制) | 由RTE实现 | 无 |
n到1发送。将多个发送方的消息整合到一个消息对象。 | 由RTE实现 |
SendMessage
|
消息队列 | 由RTE实现 |
GetMessageStatus
|
Zero size messages | 在没有实际数据的情况下,建立通信是可能的。功能部分由
Com_TriggerTransmit()覆盖
|
SendZeroMessage
|
通知机制,TASK,FLAG和EVENT | 由RTE实现 | 无 |
I-PDU中的重叠消息 | 这是一种危险的概念,拒绝实现。 | 无 |
Usage of OIL | 无实现 | 无 |
Application modes | 不需要 | 无 |
启动序列 | 替换为:
| StartCOM, StopCOM, StartCOMExtensions, InitMessage |
启动和停止的周期消息 | 不需要,它通过I-PDU组实现 | StartPeriodic, StopPeriodic |
与NM相关调用接口 | 不需要 | I_MessageTransfer, I_MessageTimeOut |
发送端过滤 | 没有用例,过滤条件仍然用于选择传输模式,但没有信号过滤。 | 无 |
根据网络与CPU排序的消息调用桩 | COM模块仅支持具有定义的AUTOSAR接口的I-PDU调用,这是为了避免使用专有解决方案。 | 无 |
Error hook routine | COM模块定义了自己的错误报告接口,而不是Error hook routine | COMErrorHook COMError_Name1_Name2 macros COMErrorGetServiceId |
Interface for callback routines | COM模块所用回调函数的将在COM模块的规范中明确定义。 | COMCallback |
Internal communication | 不需要,由RTE保证 | SendMessage, ReceiveMessage |
字节序转换与符号扩展
AUTOSAR COM 支持以下数据类型:
- boolean
- uint8
- uint16
- uint32
- uint64
- sint8
- sint16
- sint32
- sint64
- uint8[n]
- float32
- float64
COM支持所有有符号和无符号整型数据类型的字节序转换,同时会将非整型数据类型视为对应匹配的整数数据类型,或者不解释它们的内容(ComSignalEndianness被配置为OPAQUE)。COM模块应将不确定的数据解释为uint8[n],并将其映射到一个n字节大小的信号。下面我们以一个10位有符号信号被接收并被Com_ReceiveSignal复制到一个16位有符号整型变量为例。如果接收到signal值为(-3)10进制,类型为sint16,则接收到的10位信号有取值为1111111101b。当将其复制到16位整型变量时,值将扩展到11111111111101b。
除了字节顺序转换外, COM模块并不支持FLOAT32或FLOAT64的信号的进一步转换。也就是说,仅支持字节顺序转换,但不支持复杂转换或分数、指数、符号或偏差值的标准化。
信号值定义
- 初始值: COM模块使用配置参数ComSignallnitValue的N位初始化发送方和接收方的对应N位,配置的ComSignallnitValues也用于I-PDU的初始化信号。一个信号的ComSignallnitValue可以与ComSignalDatalnvalidValue值相同。初始化阶段会清空所有update-bits值。
- 数据无效值:通过调用Com_InvalidateSignal, COM模块将在内部执行带有配置ComSignalDatalnvalidValue的无效值配置。当内部执行的带有数据无效值的Com_SendSignal 时,会决定被用作过滤器的数据无效值和TMS当前值。RTE还可以通过调用Com_InvalidateSignalGroup来请求使整个信号簇无效。
- 正常值:初始化阶段之后的有效值,包括COM部分收发的信号值。
滤波
COM模块将计算每个过滤条件为真或假,并且只在接收端过滤掉信号,滤波的方式有以下几种:
- ALWAYS:总是通过,若一个信号的过滤算法配置为ALWAYS,那么这个信号的TMC永远为True。
- NEVER:总是不通过,若一个信号的过滤算法配置为NEVER,那么这个信号的TMC永远为False。
- MASKED_NEW_EQUALS_X:若一个信号的过滤算法配置为MASKED_NEW_EQUALS_X时,只有当新值与掩码按位与后等于设定的某一值时,这个信号的TMC才等于True。
- MASKED_NEW_DIFFERS_X:若一个信号的过滤算法配置为MASKED_NEW_DIFFERS_X时,只有当新值与掩码按位与之后不等于设定的某一值时,这个信号的TMC才为True。
- MASKED_NEW_DIFFERS_MASKED_OLD:若一个信号的过滤算法配置为MASKED_NEW_DIFFERS_MASKED_OLD时,只有当新值与掩码按位与之后的值不等于旧值与掩码按位与之后的值时,这个信号的TMC才为True。
- NEW_IS_WITHIN:若一个信号的过滤算法配置为NEW_IS_WITHIN时,只有当新值在某一设定的范围内时,这个信号的TMC才为True。
- NEW_IS_OUTSIDE:若一个信号过滤算法配置为NEW_IS_OUTSIDE时,只有当新值不在某一设定的范围内时,这个信号的TMC才为True。
- ONE_EVERY_N:若一个信号的过滤算法配置为ONE_EVERY_N时,该信号值每更新N次,这个信号的TMC值为True。
网关
COM模块提供一个集成信号的网关,以1对多的方式转发信号和信号组。网关接收到用于路由的信号或信号组后,立即分别作为这些信号或信号组的发送者将I-PDU发送到PduR。由于网关关系是静态配置的,因此优化的信号网关可以通过配置跳过一些处理阶段。例如,在某些情况下,不需要进行端序转换。
模块功能行为
COM模块首先包含初始化以及去初始化。Com_Init应初始化每个I-PDU,初始化首先会按字节对齐使用ComTxlPduUnusedAreasDefault值来填充消息,然后按位对齐使用包含的信号的初始值(ComSignallnitValue)和对应的更新位。COM模块提供了用于COM层去初始化的API函数Com_Delnit,调用之后,无法通过AUTOSARCOM模块进行通信,所有启动的I-PDU组都将停止。
通信模式
首先,我们先了解一下COM模块发送信号的基本流图。
在配置COM的阶段,可以为每个I-PDU配置两个Transmission Mode,一个是ComTxModeTure,另一个是ComTxModeFalse,这个Ture和False就对应TMS的判断结果。至于最后的发送,就要根据Transmission Mode 和Transfer Property来判断是否可以发送,以及如何发送。
我们现在分别介绍Transfer Property(发送属性)与Transmission Mode(传输模式)这两个概念。
发送属性是Signal的一个属性,主要分为Pending和Triggered两种。Pending的Signal就意味着该Signal的数据更新不会自动的触发它所在的I-PDU被发送。而Triggered的Signal在更新时可以触发它所在的I-PDU被发送。但是,并不是意味着Signal是Pending就不会被发送,只是它并不会主动的触发它所在的I-PDU发送,如果同一个I-PDU有一个Signal触发了这个I-PDU的发送,那么这个Pending的相当于也就发出去了。还有一种情况是,所在的I-PDU是周期发送的,那么只要周期到了,就会发送了。Triggered分为Triggered Without Repetition、Triggered On Change以及Triggered On Change without repetition。他们当I-PDU的传输模式为DIRECT或者MIXED时,Triggered Without Repetition为直接发送一次,Triggered On Change则判断当前信号值与上一次发送值或者初始值不同时发送ComTxModeNumberOfRepetitions+1次,Triggered On Change without repetition则断当前信号值与上一次发送值或者初始值不同时发送一次。
传输模式是对于I-PDU的一个属性。需要和上面的发送属性相结合起来理解。它一共包含四种模式,分别为Periodic、Direct、Mixed以及None。当I-PDU配置为Periodic时。那么这个I-PDU包含的Signal即便有Triggered属性的,也并不会主动的被触发,只能等待Periodic周期的到来。当I-PDU配置为Direct时,则当Signal为Triggered时,就会发送,具体次数由信号发送属性与ComTxModeNumberOfRepetitions共同决定。Mix模式则为Direct和Periodic的结合,一般情况下周期发送,事件到来就按照Direct的方式发送,之后再切换回周期发送。最后None为不发送。
COM模块还可以根据ComTxModeNumberOfRepetitions配置重复发送报文,以及当ComRetryFailedTransmitRequests配置为真时,Com模块在发送失败时会自动重发,直到超时发生。
I-PDUS的处理
对于I-PDU组,应遵循以下规则:
- 一个I-PDU可以属于任意一个I-PDU组。
- 当且仅当至少有一个I-PDU组是活动的(启动的),则该I-PDU是活动的(启动的)。
- I-PDU组的最大数量是可预编译配置的。
开启与停止I-PDU通过Com_IpduGroupControl来控制。
下图为针对发送/接收不同I-PDUs的启动行为。
图为针对发送/接收不同I-PDUs的停止行为。
为了支持中断和轮询两种系统,可以在信号接收指示进行两种配置。IMMEDIATE和 DEFERRED,可通过ComlPduSignalProcessing配置项进行配置。
如果I-PDU的ComIPduSignalProcessing配置为IMMEDIATE,则COM模块将分别为底层调用的Com_RxIndication或Com_TpRxIndication接口中包含的信号和信号组调用配置好的ComNotifications。 如果将I-PDU的ComIPduSignalProcessing配置为DEFERRED,则AUTOSAR COM模块首先将I-PDU的Com_RxIndication函数或相关TP接收函数中的数据分别从PduR复制到COM中。]然后COM模块将在下次调用Com_MainFunctionRx时异步调用已配置的ComNotifications。
在拆分I-PDU时,COM模块应检查接收到的数据长度(PduInfoPtr->SduLength),
如果信号组仅部分接收到,则该信号组和所有包含的组信号不应拆封或通过ComNotification通知
。上述要求可以防止接收到不一致的信号组,从而防止接收到不一致的复杂数据类型。如果接收到的数据长度大于预期,AUTOSARCOM模块不会复制或处理未配置信号的额外接收数据。如果接收到小于预期的l-PDU,导致出现没有配置更新位的信号,则COM模块将该信号视为其更新位已设置,并将该信号解释为已更新。
COM模块继承了最小延迟计时器机制。如果I-PDU的最小延迟定时器因传输最后期限监视定时器到期而重置,并且存在对该I-PDU的延迟请求,则COM模块应立即传输该I-PDU。
接收超时监控
超时时间监控参数ComFirstTimeout和ComTimeout可以在配置容器ComSignal或ComSignalGroup中定义。相应的超时通知回调函数可以在配置容器ComSignal或ComSignalGroup的ComTimeoutNotification参数中定义。如果信号或信号组的配置参数ComTimeout被省略或配置为0,则COM模块不监控该信号或信号组。也会忽略ComFirstTimeout。
当且仅当该I-PDU包含在使能超时监控的I-PDU组中,该I-PDU的超时监控才使能。否则,关闭对I-PDU的超时监控。在接收超时的情况下,ComRxDataTimeoutAction参数决定COM模块是用初始值替换信号/信号组值还是保持最后接收到的值。当I-PDU的接收超时监控被禁用并且定时器过期时,不会给RTE任何错误指示。关闭接收超时监控不会停止接收l-PDU。
信号组
COM模块通过阴影缓冲机制实现信号组的一致性,即RTE在阴影缓冲中访问组信号。如果阴影缓冲区需要与I-PDU同步,RTE可以通过Com_SendSignalGroup或Com_ReceiveSignalGroup显式触发。同步是自动执行的。在Com_ReceiveSignalGroup将信号组数据复制到影子缓冲区后,用户可以通过调用Com_ReceiveSignal函数从影子缓冲区接收组信号。
更新位
为了使信号/信号组的接收方能够识别发送方在发送之前是否更新了该信号/信号组中的数据,COM模块支持更新位。更新位表示在包含该信号的I-PDU发送到PDU路由器之前,发送端的RTE是否更新了信号值。如果传输模式为DIRECT且ComTxModeNumberOfRepetitions大于或等于1,则不允许使用更新位。
通过在发送端和接收端进行配置,可以分别为每个信号/信号组添加最多一个更新位。更新位的位置可以通过配置参数ComUpdateBitPosition来配置。ComUpdateBitPosition包含在配置容器ComSignal中。因此,可以确保信号/信号组和相应的更新位始终是同一个I-PDU的一部分,AUTOSAR软件组件不能直接看到或访问更新位。
COM模块的交互模型
下图展示了COM模块的信号发送交互。
下图展示展示了COM模块的报文接收的交互。
下图展示了COM作为内部信号网关的交互,集成的信号网关首先充当接收器,用于所有被配置为网关信号源的信号或信号组。信号网关在接收到用于路由的信号或信号组后,立即充当这些信号或信号组的发送器。
时序图
COM模块与PduR的接口
下图显示了COM模块和PduR之间的动态行为。可以看出接收的动态行为CAN, LIN, FlexRay一致,但是发送的话CAN不用调用Com_TriggerTransmit主动触发发送。
PduR、COM与RTE之间的确认处理(发送)
下图显示了PduR、COM与RTE之间的确认处理(发送) 的动态行为。可以看出由底层发起,最终调用用户的回调函数。
PduR、COM与RTE之间的指示处理(接收)
下图显示了PduR、COM与RTE之间的指示处理(接收)的动态行为。可以看出由底层发起,最终调用用户的回调函数。
ISOLAR-AB配置
COM
ComGeneral
这个容器主要包含COM模块涉及的通用配置,其中大部分的配置项我们都不需要修改。我们介绍以下几个参数:
- ComCancellationSupport:取消传输功能的API是否可用。
- ComEnableMDTForCyclicTransmission:在Com模块中实现对循环和重复传输的
最小延迟时间监测(周期传输时,需要前置条件ComTxModeMode =
PERIODIC或ComTxModeMode =MIXED,若为重复传输时,前置条件为ComTxModeNumberOfRepetitions > 0)。 - ComEnableSignalGroupArrayApi:打开信号组访问的API,这个API一般用于信号同步。
- ComRetryFailedTransmitRequests:如果该参数设置为true,则启用失败的传输请求重试,如果不设置该参数,则采用默认值。
- ComSupportedIPduGroups:定义支持的I-PDU组的最大数量。
ComGwMapping
此容器的配置当用到信号网关功能时,根据需要选择源信号与目标信号。一个Mapping中一个源信号是可以映射到许多目标信号,在配置工具里面可以新建多个目标信号,源信号与目的信号的对应关系是1:n的关系。下图为空,需要配置可以在红框中进行配置。
ComIPduGroups
此容器可以添加自定义的IPduGroups供ComIPdus使用,下图是根据数据方向默认生成的两个IPduGroup。
ComIPdus
这里是针对之前导入的三个报文生成的IPdu,如下图所示。
这里我们先介绍一下ComIPdus内包含的子容器ComIPduCounter,自动生成的配置不包含这部分,如下图所示。
它包含了两个参数,ComIPduCoumterErorNotification会在如果收到的counter与期望的counter不匹配的时候调用,而ComlPducounterThreshold为允许偏差的阈值,当期望counter为5,阀值为2,则当接收到的counter为5/6/7都是OK的。除了这两个参数我们还需要正确配置ComIPduCounterSize与ComIPduCounterStartPosition。假如counter配置为4个bit,期望
counter为15之后翻转到0。
如上图ComIPdus还有两个子容器为ComTxModeNumberOfRepetitions与ComTxModeRepetitionPeriod,前者定义了传输模式的重复次数,后者定义当配置comtxmodennumberofrepetitions大于等于1且ComTxModeMode配置为DIRECT或MIXED时,多次传输的重复周期(以秒为单位)。
下图为默认生成的ComIPdu配置。
其中主要的配置项如下:
- ComIPduCallout: 该参数定义了对应I-PDU的callout函数的存在和名称。如果省略此参数,则不会对相应的I-PDU进行标注。这个回调函数允许用户在发送前或者接收后处理自定义的数据。
- ComIPduSignalProcessing:信号是延时发送还是立即发送。
- ComIPduErrorNotification:这个回调是在超时之后进入的回调。
- ComIpduNotificationCallback:TX_IPDU的通知回调函数。此函数在从底层为发送确认到IPDU后调用。
- ComFirstTimeout:以秒为单位定义第一个超时监视的时长。此超时在超时监视服务启动(或重新启动)之后立即使用。连续时间段的超时时间由ComTimeout配置。
- ComTimeout:以秒为单位定义超时监视超时周期的长度。
下边的引用信息都是根据导入DBC信息自动生成的,这里就不再赘述了,有兴趣的读者可以看一下,有的时候会由生成错误的情况(命名重复等原因),熟悉这些自动生成的引用信息有助于我们排查一些问题。
ComSignals
这个容器根据导入DBC的信号逐条生成默认配置,截图如下。
下面是这个容器的一些配置解释:
- ComBitPosition:这个signal的信号开始位置。
- ComBitSize:信号的长度,单位是bit。
- ComDataInvalidAction:此参数定义接收到无效信号时执行的操作,如果使用Replace,则ComSignallnitValue将用于替换。
- ComErrorNotification:仅在发送端有效,要调用的发送失败回调函数的名称。如果省略此参数,则不会产生错误通知。
- ComInitialValueOnly:该参数定义了将各自信号的初始值分别放入各自的PDU中,不通过RTE对其值进行更新。因此,Com实现不需要期望对该信号(组)进行任何API初始化调用。
- ComInvalidNotification:仅在接收端有效,要调用的接收无效数据回调函数的名称。只有当ComDatalnvalidAction配置为NOTIFY时才适用。
- ComNotification:在发送端为要调用的发送成功回调函数的名称。接收端为要调用的接收成功回调函数的名称。如果省略此参数,则不会发生通知。
- ComRxDataTimeoutAction:此参数定义接收超时监控计时器到期时执行的操作。这里的回调函数常在项目中用于实现其他ECU节点丢失故障检测的功能。
- ComSignalDataInvalidValue:定义信号数据的无效值。当ComSignalType为UINT8、UINT16、UINT32、UINT64、SINT8、SINT16、SINT32、SINT64时,该字符串应按照EcuC规范中整数类型章节的定义进行解释。如果ComSignalType为FLOAT32, FLOAT64,则该字符串应按照EcuC规范中的Float Type章节中的定义进行解释。如果ComSignalType为BOOLEAN,则该字符串应按照EcuC规范中的布尔类型章节中的定义进行解释。如果ComSignal是UINT8_N, UINT8_DYN,则该字符串将被解释为由空格分隔的字符的十进制表示。"97 98 100"表示字符串"abd",其中字符"a"位于字节0(最低地址),"b"位于字节1,"d"位于字节2和(最高地址)。对于ComSignalType为UINT8_DYN,动态长度应设置为配置的字符数。空字符串应解释为0大小的动态信号。
- ComSignalEndianness:定义信号的网络表示的端序。Intel为小端,Motorola为大端。
- ComSignalInitValue:信号的初始值。
- ComSignalType:信号的AUTOSAR类别。
- ComSignalLength:配置信号类别UINT8_N与UINT8_DYN的时候,配置长度使用的。
- UINT8_N表示一个固定长度的无符号8位整数数组。
- UINT8_DYN表示一个动态长度的无符号8位整数数组。
- ComTransferProperty:定义此信号的发送属性,前文由详细的介绍,这里就不赘述了。
- ComUpdateBitPosition:在在I-PDU内的更新位的位置。
ComTimeBase
这个容器包含Com模块的一些周期调用函数的周期配置。包括:
- ComGwTimeBase:调用函数Com_MainFunctionRouteSignals的周期,单位是S。
- ComRxTimeBase:接收周期主函数的周期。
- ComTxTimeBase:发送接收周期主函数的时间。
代码解析
动态配置代码
COM模块生成的动态代码如下所示。
我们针对一些常用的进行说明:
- Com_PBcfg.c:包含Com_Prv_xTxSigCfg_acst与Com_Prv_xRxSigCfg_acst两个结构体,分别包含了发送和接收信号的相关配置。
- Com_Cfg.c:包含了Com_NONE_TransModeInfo结构体定义,其中包含一些COM的通用配置。
/* *********************************************************************************************************************** * * Product Info * Isolar version: ISOLAR-AB 4.0.2 * Product release version: RTA-BSW 3.1.0 * *********************************************************************************************************************** */ /*<VersionHead> * This Configuration File is generated using versions (automatically filled in) as listed below. * * $Generator__: Com / AR42.4.0.0 Module Package Version * $Editor_____: 9.0 Tool Version * $Model______: 2.3.0.4 ECU Parameter Definition Version * </VersionHead>*/ #include "Com_Priv.h" #include "Com_Cbk.h" #include "PduR_Com.h" /* START : Tx IPDU notification functions */ #ifdef COM_TxIPduNotification #endif /* #ifdef COM_TxIPduNotification */ /* END : Tx IPDU notification functions */ /* START : Tx IPDU error notification functions */ /* END : Tx IPDU error notification functions */ /* START : Tx IPDU timeout notification functions */ #ifdef COM_TxIPduTimeOutNotify #endif /* #ifdef COM_TxIPduTimeOutNotify */ /* END : Tx IPDU timeout notification functions */ /* START : Rx IPDU timeout notification functions */ #ifdef COM_RxIPduTimeoutNotify #endif /* #ifdef COM_RxIPduTimeoutNotify */ /* END : Rx IPDU timeout notification functions */ /* START: TMS NONE Details */ #define COM_START_SEC_CONST_UNSPECIFIED #include "Com_MemMap.h" CONST(Com_TransModeInfo, COM_CONST) Com_NONE_TransModeInfo = { 0, /* TimePeriodFact */ 0, /* TimeOffsetFact */ 0, /* RepetitionPeriodFact */ 0, /* NumRepetitions */ #ifdef COM_MIXEDPHASESHIFT COM_TXMODE_NONE, /* Mode */ COM_FALSE /* MixedPhaseShift status */ #else COM_TXMODE_NONE /* Mode */ #endif /* #ifdef COM_MIXEDPHASESHIFT */ }; #define COM_STOP_SEC_CONST_UNSPECIFIED #include "Com_MemMap.h" /* END: TMS NONE Details */ #define COM_START_SEC_VAR_CLEARED_UNSPECIFIED #include "Com_MemMap.h" VAR(Com_IpduGroupVector, COM_VAR) Com_IpduGrpVector; VAR(Com_IpduGroupVector, COM_VAR) Com_IpduGrpVector_DM; #define COM_STOP_SEC_VAR_CLEARED_UNSPECIFIED #include "Com_MemMap.h"
- Com_Cbk.h:包含所有COM模块Signals配置的回调函数的原型。
- Com_Cfg_Internal.h:包含一些宏定义配置以及IPDU的相关回调函数原型。
/* *********************************************************************************************************************** * * Product Info * Isolar version: ISOLAR-AB 4.0.2 * Product release version: RTA-BSW 3.1.0 * *********************************************************************************************************************** */ /*<VersionHead> * This Configuration File is generated using versions (automatically filled in) as listed below. * * $Generator__: Com / AR42.4.0.0 Module Package Version * $Editor_____: 9.0 Tool Version * $Model______: 2.3.0.4 ECU Parameter Definition Version * </VersionHead>*/ #ifndef COM_CFG_INTERNAL_H #define COM_CFG_INTERNAL_H /* START: Local #defines */ #define COM_TX_TIME_BASE ( 0.01f ) #define COM_RX_TIME_BASE ( 0.01f ) #define COM_GW_TIME_BASE ( 0.005f ) /************************************************************************/ /************************ UPDATE_BIT switches ***************************/ /************************************************************************/ /* #define COM_RxSigUpdateBit */ /* #define COM_TxSigUpdateBit */ /* #define COM_RxSigGrpUpdateBit */ /* #define COM_TxSigGrpUpdateBit */ #if (defined(COM_RxSigUpdateBit) || defined(COM_TxSigUpdateBit) || defined(COM_RxSigGrpUpdateBit) || defined(COM_TxSigGrpUpdateBit)) #define COM_UPDATEBIT #endif /* #if (defined(COM_RxSigUpdateBit) || defined(COM_TxUpdateBit) || defined(COM_RxSigGrpUpdateBit) || defined(COM_TxSigGrpUpdateBit)) */ /************************************************************************/ /************************************************************************/ /************************ RX TIME OUT switches **************************/ /************************************************************************/ /* #define COM_RxSigUpdateTimeout */ /* #define COM_RxSigGrpUpdateTimeout */ /* #define COM_RxUpdateTimeoutNotify */ /* #define COM_RxIPduTimeout */ /* #define COM_RxIPduTimeoutNotify */ /************************************************************************/ /************************ TX TIME OUT switches **************************/ /************************************************************************/ #define COM_TxIPduTimeOut /* #define COM_TxIPduTimeOutNotify */ /************************************************************************/ /************************************************************************/ /********************* RX NOTIFICATION switches *************************/ /************************************************************************/ /* #define COM_RxSignalNotify */ /* #define COM_RxIPduNotification */ /* #define COM_RxSignalGrpNotify */ /************************************************************************/ /************************************************************************/ /********************* FILTER related switches **************************/ /************************************************************************/ /* #define COM_RxFilters */ /* #define COM_TxFilters */ #if (defined(COM_RxFilters) || defined(COM_TxFilters)) #define COM_FILTERS #endif /* #define COM_F_MASKEDNEWEQUALSX */ /* #define COM_F_MASKEDNEWDIFFERSX */ /* #define COM_F_MASKEDNEWDIFFERSOLD */ /* #define COM_F_NEWISWITHIN_POS */ /* #define COM_F_NEWISWITHIN_NEG */ /* #define COM_F_NEWISOUTSIDE_POS */ /* #define COM_F_NEWISOUTSIDE_NEG */ /* #define COM_F_ONEEVERYN */ /************************************************************************/ /************************************************************************/ /*********************** RX INVALID switches ****************************/ /************************************************************************/ /* #define COM_RxSigInvalid */ /* #define COM_RxSigInvalidNotify */ /* #define COM_RxSigGrpInvalid */ /* #define COM_RxSigGrpInvalidNotify */ /* #define COM_RxSigGrpInvalidActionReplace */ /************************************************************************/ /************************************************************************/ /*********************** TX INVALID switches ****************************/ /************************************************************************/ /* #define COM_TxInvalid */ /* #define COM_TxGrpSigInvalid */ /************************************************************************/ /************************************************************************/ /********************* UINT64/SINT64 switches ***************************/ /* #define COM_TXSIG_INT64 */ /* #define COM_RXSIG_INT64 */ /* #define COM_TXGRPSIG_INT64 */ /* #define COM_RXGRPSIG_INT64 */ /************************************************************************/ /********************* DYNAMIC SIGNAL switches **********************/ /************************************************************************/ /* #define COM_TX_DYNAMIC_SIGNAL_SUPPORT */ /* #define COM_RX_DYNAMIC_SIGNAL_SUPPORT */ /********************* FLOAT64 switches **********************/ /************************************************************************/ /* #define COM_TXGRPSIG_FLOAT64SUPP */ /* #define COM_TXSIG_FLOAT64SUPP */ /* #define COM_RXSIG_FLOAT64SUPP */ /* #define COM_RXGRPSIG_FLOAT64SUPP */ /* #define COM_FLOAT32SUPP */ /* #define COM_GRPSIGFLOAT32SUPP */ /************************** Misc FEATURES *******************************/ /************************************************************************/ /* #define COM_ERRORNOTIFICATION */ /* #define COM_TXDOUBLEBUFFER */ /* #define COM_RxIPduCallOuts */ /* #define COM_TxIPduCallOuts */ /* #define COM_TxIPduNotification */ #define COM_CONFIGURATION_USE_DET STD_OFF /*Currently for PBL support, this macro should always be enabled */ #define COM_VERSION_INFO_API STD_OFF #define COM_COMMON_TX_PERIOD STD_OFF #define COM_ENABLE_JITTERFLITER STD_OFF /* #define COM_ENABLE_READRXIPDULENGTH */ /* #define COM_TX_IPDUCONTROL_VIA_CALIBRATION */ /* #define COM_RX_IPDUCONTROL_VIA_CALIBRATION */ /* #define COM_TXPDU_TIMEPERIOD_VIA_CALIBRATION */ /* #define COM_RXPDU_TIMEOUT_VIA_CALIBRATION */ /* #define COM_TXPDU_DEFERREDPROCESSING */ #ifdef COM_TXSCHEDULED_DIFF_TIMEBASE #define COM_TX_TIME_BASE_IN_MS ( (uint16)10 ) #endif #define COM_ARSRVLIB_SUPPORT /* #define COM_PROVIDE_IPDU_STATUS */ /* #define COM_MULTICORE_SUPPORT */ /* #define COM_METADATA_SUPPORT */ /* #define COM_SIGNALGATEWAY */ /* #define COM_SIGNALGROUPGATEWAY */ /* #define COM_TP_IPDUTYPE */ /* #define COM_CANCELTRANSMITSUPPORT */ /* #define COM_TX_SIGNALGROUP_ARRAY */ /* #define COM_RX_SIGNALGROUP_ARRAY */ /************************************************************************/ /************************************************************************/ #define COM_RXTIMER_MAX 0xFFFFu /********************* TRANSFER PROPERTY switches **********************/ /************************************************************************/ /*#define COM_SigTriggeredOnChange*/ /*#define COM_SigGrpTriggeredOnChange*/ /************************************************************************/ /************************************************************************/ #define COM_CONFIGURATION_ID 0 #define COM_NUM_TOTAL_IPDU_GRP 2u /******************* RX IPdu Deferred Processing ************************/ /************************************************************************/ /* #define COM_RxIPduDeferredProcessing */ /* #define COM_RxSignalGrpDeferredProcessing */ /************************************************************************/ /************************************************************************/ /*#define COM_MIXEDPHASESHIFT*/ /* END: Local #defines */ /* Start Type Declarations*/ /* Filter type */ #if defined(COM_F_MASKEDNEWEQUALSX) || defined(COM_F_MASKEDNEWDIFFERSX) typedef struct { uint32 Mask; uint32 X_Val; }Com_MaskXType; #endif #if defined(COM_F_NEWISWITHIN_POS) || defined(COM_F_NEWISOUTSIDE_POS) typedef struct { uint32 Min; uint32 Max; }Com_POSMinMaxType; #endif #if defined(COM_F_NEWISWITHIN_NEG) || defined(COM_F_NEWISOUTSIDE_NEG) typedef struct { sint32 Min; sint32 Max; }Com_NEGMinMaxType; #endif #ifdef COM_F_ONEEVERYN typedef struct { uint32 Period; uint32 Offset; uint8 Occurrence; }Com_OneEveryNType; #endif typedef uint16 Com_NoOfTxGrpSignalType; typedef uint16 Com_NoOfRxGrpSignalType; #ifdef COM_TX_SIGNALGROUP typedef uint8 Com_TxIntGrpSignalIdType; #endif #ifdef COM_RX_SIGNALGROUP typedef uint8 Com_RxIntGrpSignalIdType; #endif typedef uint8 Com_TxIntSignalIdType; typedef uint8 Com_RxIntSignalIdType; #ifdef COM_TX_SIGNALGROUP typedef uint8 Com_TxIntSignalGroupIdType; #endif #ifdef COM_RX_SIGNALGROUP typedef uint8 Com_RxIntSignalGroupIdType; #endif #if defined(COM_SigTriggeredOnChange) || defined(COM_SigGrpTriggeredOnChange) typedef uint8 Com_OldValType; typedef uint32 Com_OldValTrigOnChngType; #endif typedef uint8 Com_BitsizeType; typedef uint8 Com_BitpositionType; #if defined(COM_TxFilters) || defined (COM_RxFilters) typedef uint8 Com_FilterType; #endif typedef uint8 Com_RxGwQueueIndexType; typedef uint8 Com_SigBuffIndexType; typedef uint8 Com_RxGrpSigBuffIndexType; typedef uint8 Com_TxGrpSigBuffIndexType; #ifdef COM_TX_SIGNALGROUP_ARRAY /* Com_TxSigGrpArrayIndexType - is used as a typedef for SigGrpArray_Index member in * TxSignalGroup Configuration structure. Its typedef is generated based on the number of Tx-SignalGroup's * configured with the Array Access */ typedef uint8 Com_TxSigGrpArrayIndexType; # endif /* #ifdef COM_TX_SIGNALGROUP_ARRAY */ # ifdef COM_RX_SIGNALGROUP_ARRAY /* Com_RxSigGrpArrayIndexType - is used as a typedef for SigGrpArray_Index member in * RxSignalGroup Configuration structure. Its typedef is generated based on the number of Rx-SignalGroup's * configured with the Array Access */ typedef uint8 Com_RxSigGrpArrayIndexType; /* Com_RxSigGrpBuffIndexType - is used as a typedef for RxSigGrpBuf_Index in RxSignalGroup Array * configuration structure. Its typedef is generated based on the total number of bytes of all the RxSignalGroup's * configured with Array Access */ typedef uint8 Com_RxSigGrpBuffIndexType; # endif /* #ifdef COM_RX_SIGNALGROUP_ARRAY */ typedef uint32 Com_SigMaxType; #ifdef COM_METADATA_SUPPORT /* Maximum Length of the MetaData Supported by Com Module */ # define MAXIMUM_METADATA_LENGTH_IN_BYTES ( 4U ) /** * @ingroup COM_TYPES_H * This typedef structure is data type for MetaData information\n * * typedef struct\n * {\n * uint32 MetaDataLength;\n * uint8 MetaDataDefaultValue[ MAXIMUM_METADATA_LENGTH_IN_BYTES ];\n * } Com_MetaDataInfo; */ typedef struct { uint32 MetaDataLength; uint8 MetaDataDefaultValue[ MAXIMUM_METADATA_LENGTH_IN_BYTES ]; } Com_MetaDataInfo; /** * @ingroup COM_TYPES_H * This type defines a pointer type that points to the current IPdu MetaData Information.\n * * typedef P2CONST( Com_MetaDataInfo, AUTOMATIC, COM_APPL_CONST ) Com_MetaDataInfoPtr;\n */ typedef P2CONST( Com_MetaDataInfo, AUTOMATIC, COM_APPL_CONST ) Com_MetaDataInfoPtr; #endif /* #ifdef COM_METADATA_SUPPORT */ /* END: Type Declaration */ /* Filter type */ #if defined (COM_F_MASKEDNEWEQUALSX) || defined(COM_F_MASKEDNEWDIFFERSX) /* ------------------------------------------------------------------------ */ /* Begin section for constants */ #define COM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" extern CONST(Com_MaskXType ,COM_CONST) Com_MaskX[]; /* ------------------------------------------------------------------------ */ /* End section for constants */ #define COM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" #endif #ifdef COM_F_MASKEDNEWDIFFERSOLD /* ------------------------------------------------------------------------ */ /* Begin section for constants */ #define COM_START_SEC_CONFIG_DATA_POSTBUILD_32 #include "Com_MemMap.h" extern CONST(uint32 ,COM_CONST) Com_Mask[]; /* ------------------------------------------------------------------------ */ /* End section for constants */ #define COM_STOP_SEC_CONFIG_DATA_POSTBUILD_32 #include "Com_MemMap.h" /* ------------------------------------------------------------------------ */ /* Begin section for RAM variables of uint32 type */ #define COM_START_SEC_VAR_CLEARED_POSTBUILD_32 #include "Com_MemMap.h" extern VAR(uint32,COM_VAR) Com_F_OldVal[]; /* ------------------------------------------------------------------------ */ /* End section for RAM variables of uint32 type */ #define COM_STOP_SEC_VAR_CLEARED_POSTBUILD_32 #include "Com_MemMap.h" #endif #if defined(COM_SigTriggeredOnChange) || defined(COM_SigGrpTriggeredOnChange) /* ------------------------------------------------------------------------ */ /* Begin section for RAM variables of struct/enum/pointer type */ #define COM_START_SEC_VAR_CLEARED_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" extern VAR(Com_OldValTrigOnChngType,COM_VAR) Com_OldValTrigOnChng[]; /* ------------------------------------------------------------------------ */ /* End section for RAM variables of struct/enum/pointer type */ #define COM_STOP_SEC_VAR_CLEARED_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" #endif #if defined(COM_F_NEWISWITHIN_POS) || defined(COM_F_NEWISOUTSIDE_POS) /* ------------------------------------------------------------------------ */ /* Begin section for constants */ #define COM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" extern CONST(Com_POSMinMaxType ,COM_CONST) Com_POSMinMax[]; /* ------------------------------------------------------------------------ */ /* End section for constants */ #define COM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" #endif #if defined(COM_F_NEWISWITHIN_NEG) || defined(COM_F_NEWISOUTSIDE_NEG) /* ------------------------------------------------------------------------ */ /* Begin section for constants */ #define COM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" extern CONST(Com_NEGMinMaxType ,COM_CONST) Com_NEGMinMax[]; /* ------------------------------------------------------------------------ */ /* End section for constants */ #define COM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" #endif #ifdef COM_F_ONEEVERYN /* ------------------------------------------------------------------------ */ /* Begin section for constants */ #define COM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" extern CONST(Com_OneEveryNType,COM_CONST) Com_OneEveryN_Const[]; /* ------------------------------------------------------------------------ */ /* End section for constants */ #define COM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" /* ------------------------------------------------------------------------ */ /* Begin section for RAM variables of struct/enum/pointer type */ #define COM_START_SEC_VAR_CLEARED_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" extern VAR(Com_OneEveryNType,COM_VAR) Com_OneEveryN[]; /* ------------------------------------------------------------------------ */ /* End section for RAM variables of struct/enum/pointer type */ #define COM_STOP_SEC_VAR_CLEARED_POSTBUILD_UNSPECIFIED #include "Com_MemMap.h" #endif #define Com_getfloat64InitValue(val) ((float64)0) /* START: Miscellaneous Macros */ /* Maximum value for 32bits */ #define COM_MAX_U32_VALUE (uint32)(0xFFFFFFFFUL) /* Maximum value for 64bits */ #define COM_MAX_U64_VALUE (uint64)(0xFFFFFFFFFFFFFFFFULL) /* Mask used in the Code to identify the maximum unsigned long index of an array */ #define COM_MAX_U32_INDEX (COM_MAX_U32_VALUE) /* Used for Sign Extention */ #define COM_SIGN_EXT_MASK (COM_MAX_U32_VALUE) /* Maximum number of bits supported in Com */ #define COM_SIG_MAX_NO_OF_BITS (32u) /* Maximum signal value */ #define COM_SIG_MAX_DATA (COM_MAX_U32_VALUE) /* END: Miscellaneous Macros */ /* START : Tx IPDU notification functions */ #ifdef COM_TxIPduNotification #endif /* #ifdef COM_TxIPduNotification */ /* END : Tx IPDU notification functions */ /* START : Tx IPDU error notification functions */ /* END : Tx IPDU error notification functions */ /* START : Tx IPDU timeout notification functions */ #ifdef COM_TxIPduTimeOutNotify #endif /* #ifdef COM_TxIPduTimeOutNotify */ /* END : Tx IPDU timeout notification functions */ /* START : Rx IPDU timeout notification functions */ #ifdef COM_RxIPduTimeoutNotify #endif /* #ifdef COM_RxIPduTimeoutNotify */ /* END : Rx IPDU timeout notification functions */ #endif /* COM_CFG_INTERNAL_H */
集成代码
MemMap与SchM等就不在这里赘述了。这里跟COM模块相关比较重要的集成代码就是一些回调函数了,例如下面的超时回调函数,ASW可以利用这个自增的全局变量来判断发送这个报文的ECU是否正常。
FUNC(void,COM_CODE) Rte_COMCbkTOut_xxxxxx(void)
{
if (xxxxxx_ToutCounter < 0xFFFFFFFEu)
{
xxxxx_ToutCounter++;
}
}
我们还可以利用接收回调函数来由底层处理一些信号信息,还可以在发送前以及接收后对自定义的信号做一些预处理,这里就不再赘述相关回调的用法了,大家根据项目需要参考以前的示例实现即可。
静态代码
主要介绍常见的静态代码涉及API说明,具体详细完整的介绍读者可以参考《AUTOSAR_SWS_COM.pdf》以及《RTA-BSWReferenceGuide.pdf》。
- Com_MainFunctionRx:此函数执行COM模块接收处理,这些处理不在PDU-R调用的COM函数(例如Com_RxIndication)中直接处理。
- Com_MainFunctionTx:该函数执行COM模块的发送处理,这些处理不在用户(例如RTE、SwCluc)调用的COM函数(例如Com_Sendsignal)中直接处理。
- Com_MainFunctionRouteSignals:调用COM模块的信号网关部分,转发所接收的待路由信号。
- Com_Init/Com_DeInit:COM模块的初始化与去初始化操作。
- Com_IpduGroupStart/Com_IpduGroupStop:启动/停止之前定义的I-PDU组,例如我们调用Com_IpduGroupStop,则循环I-PDU将被停止。
- Com_SendSignal/Com_ReceiveSignal:提供给上层使用的发送与接收信号接口。
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。