{本篇文章是我稍微结合官方需求文档和规范文档,通过搜集网上资料总结起来COM模块初步的认识,适合新手阶段。可以先从本篇文章开始先对COM有个初步的认知,再去通过英文版本官方需求文档和规范文档进行深入学习,如果有现成的demo可结合demo工程同步学习。}
Com模块:{AUTOSAR通讯服务类的重要组成部分}
![](https://i-blog.csdnimg.cn/blog_migrate/7ab600f68a77f431c199c73f78a3b2db.png)
概述:
Com的业务逻辑是为RTE提供收发信号的相关逻辑。处于BSW中CAN协议栈的顶层。向下直接交互PDUR,COM组包信号为I-PDU,向下交给PDUR进行路由,可能会路由到其他模块,但是主要是路由给CAN Tp或者CanIf,由 CanTp 或者 CanIf 向下进行物理层的发包工作,收包的路线是相反的,底层进行收包,传 PduR,PduR 会把包路由给 COM 由 COM 解包,做一些逻辑处理。
模块功能:
1、首先是为RTE提供面向信号的数据接口
2、将来自上层RTE的AUTOSAR Signal (group)打包或封装成I-PDUs向下层PDUR来传输
3、将来自下层PDUR的I-PDUs进行拆包,以signal形式提供给RTE
4、来自接收到的I-PDUs的信号到要发送的I-PDUs的路由过程 (信号网关)
5、来自接收到的I-PDUs的信号组要发送到的I-PDUs的路由过程 (信号网关)
6、通信传输控制
7、发送请求的复制
8、保证 I-PDUs 传输之间的最小距离
9、监听接收信号
10、对接收信号的过滤机制
11、不同的通知机制
12、提供初始化值和更新指令
13、字节序转换
14、符号(Sign)扩展
15、每个 I-PDU 支持两种不同的传输模式
16、基于信号的网关
17、支持大长度数据和动态长度数据类型
18、支持 I-PDU 计数和 I-PDU 复制
COM模块的信号网关功能:
信号网关只适用于信号和信号组,还有就是循环任务调用。
信号网关仅支持ComGwMapping 配置容器的静态路由,并且只能独立于路由信号和组信号的内容来配置路由。
COM 模块的信号网关不支持处理包含在大 I-PDU 中的信号或组信号。
路由路径配置:
可以根据 ComGwDestinationDescription 容器 (ECUC_Com_00549) 或通过 ComGwSignal 参考(ECUC_Com_00551)配置信号或组信号的目的地。
传输模式配置:
传输模式将根据 I-PDU 的其他关联信号的 TMC(传输模式条件) 进行选择。 如果没有信号就通过于 TMS (传输模式选择器)计算,则将使用传输模式 ComTxModeTrue。
信号路由:
AUTOSAR COM模块的信号网关根据配置将路由 信号/组信号的值复制到进行传输的信号/组信号中,ComGwMapping配置允许将信号/组信号从一个源信号/组信号路由到零(无信号网关功能)或多个目的地(1:N)。
![](https://i-blog.csdnimg.cn/blog_migrate/eaf788785a6e5fb0058fbabe7dc103cc.png)
信号网关在接收端支持以下I-PDU/ signal 处理阶段:(如上图所示)
1、为基于 I-PDU 的监控重置接收 DM(超时监控)
2、I-PDU callout
3、I-PDU counter handling
4、检查更新位
5、字节顺序转换和符号扩展(sign extension)
信号网关应支持发送方的以下 I-PDU/信号处理阶段:(如上图所示)
1、设置更新位
2、字节顺序转换和符号扩展
3、I-PDU传输模式选择
4、I-PDU counter handling
5、I-PDU callout
信号网关对于信号处理的要求:
无论是信号还是组信号,都是从接收到的I-PDU转发待路由的信号到传输I-PDU。并且在要路由的信号被转发到发送I-PDU之后停止接收I-PDU不会阻止之前转发到发送I-PDU的发送。
还有不管是信号还是信号组,如果接收到的路由的信号/组信号的字节序与相关目标(组)信号的字节序不同,COM模块应将其字节序转换为目标(组)信号的字节序。
再有,就是针对信号组,COM应该以一致的方式路由属于同一信号组的所有组信号,因此COM模块应在路由操作期间将信号组的数据作为一个一致的(子)数据集传输。
信号网关对超时的要求:
可以理解为即使触发了超时监控,没有及时接收到信号或组信号,但是收到后还会继续转发。
信号网关对更新位的要求:
1、如果接收信号/信号组和目标信号/信号组都配置了更新位,并且接收信号/信号组设置了更新位,则COM模块应路由设置更新位的信号/信号组, 并在目标信号/信号组发送后,清除目标信号/信号组的更新位。
2、如果接收信号/信号组和目的信号/信号组配置了更新位,并且接收信号/信号组的更新位未设置,COM模块不应路由该信号/信号组 。
3、如果接收到的信号/信号组配置了更新位,但目标信号没有配置更新位,并且接收的设置了更新位,则COM 路由此信号/信号组按无更新位的方式处理转发。
4、如果接收到的信号/信号组配置了更新位,并且更新位未设置,但目标信号没有配置更新位,则COM 模块不应路由此信号/信号组。
5、如果接收到的信号/信号组没有配置更新位,并且目标信号/信号组配置了更新位,当接收到新的信号/信号组时,COM模块应设置目标信号的更新位, 并在发送目标信号/信号组后将其清除。
COM发送流程:
![](https://i-blog.csdnimg.cn/blog_migrate/22d45eb7f7671f7f9e7c9685999f6383.png)
流程:(如上图所示)
1、SWC 调用 RTE 提供的 Send_Signal、Send_SignalGroup 接口
2、Send_Signal 会检查信号是否配置了开启更新位,如果配置了,就会设置更新位为 1
3、把信号转换字节序(CPU序到总线网络序)
4、拷贝到 PDU 中
5、Signal Transfer Properties:如果该信号的发送属性为 Trigger,他期待立即发送,那么就会触发信号所在 PDU 的发送。
6、Transmission Mode Selection:触发发送时,使用该信号的值作为输入,根据 Filter 算法,算出一个结果,True 或者 False,True 就会使用该 I-PDU 的 TxModeTrue 发送模式, 否则使用 TxModeFalse 发送模式。
7、PduR_ComTransmit + Transmission Deadline Monitoring:如果触发发送,就会开启 TxDM监控,TxDM 在接收到发送确认时就会取消,否则超时就表明没有成功发送出去,就会引起对上层的通知,这个通知是提前配置好的接口,我们直接调用即可。
8、Minimum Delay Time + Notification:如果成功发送,就会设置 MDT,表示该报文在接下来 MDT 时间内,不可以再发送。并调用提前配置的通知接口,进行通知。
9、MainFunctionTx:如果没有触发直接发送,触发了混合或者周期发送,或者触发了直接发送但是还需要重复(repetition)再发几次,那么这些发送会在 MainFunctionTx 中处理,只要发送,就还会涉及到上述步骤2到步骤7。
COM接收流程:
![](https://i-blog.csdnimg.cn/blog_migrate/3f2b5e48b9cbb897e4ff91ddb9505569.png)
流程:(如上图所示)
1、PduR 调用 RxIndication 传入 PduId 转发来自 CanIf 或者 CanTP 的 PDU 包,拷贝到 Com
2、重置 PDU 的 Rx DM(超时监控)
3、检查更新位,如果配置了更新位,且未设置,则丢弃 PDU
4、通过则逐个检查 PDU 中的信号,每个信号都会经历下面 【5 - 8】
5、对信号执行字节序转换以及符号扩展
6、检查信号是否为提前配置好的无效数据,会有配置好的动作,NOTIFY 或者 REPLACE,顾名思义,前者为通知,后者为替换数据为指定数据
7、接收过滤,有几种过滤算法,过滤算法根据输入的值计算出 True\False,来判断是否让这个信号通过。
8、通过则重置对信号的 Rx DM(超时监控)
9、将信号从 COM PDU 拷贝到对应的 Signal 的区域
10、Com 根据 PDU 的处理方式 IMMEDIATE,则为 PDU 立即执行通知,调用提前配置好的通知函数,通知 RTE(中断);处理方式为DEFERRED,则设置标志位,下次 MainfunctionRx 会检查 PDU 标志位,如果设置了标志位,会进行通知(轮询)。
11、再回到第4步,直到遍历完所有信号。
COM信号网关流程:
![](https://i-blog.csdnimg.cn/blog_migrate/15fb42a3adb0185930d7d673d4a41901.png)
流程:(如上图所示)
1、PduR 调用 RxIndication 传入 PduId 转发来自 CanIf 或者 CanTP 的 PDU 包,拷贝到 Com
2、重置 PDU 的 Rx DM
3、检查更新位,如果配置了更新位,且未设置,则丢弃 PDU
4、通过则逐个检查 PDU 中的信号,每个信号都会经历下面 【5 - 9】
5、对信号执行字节序转换以及符号扩展
6、信号是否配置了进行路由,是则进行路由
7、路由到发送方向的 PDU,设置更新位,字节序转换以及符号扩展,
8、之后发送过程与COM发送流程的【6 - 9】一样
9、再回到第4步,直到遍历完所有信号。
信号值:
AUTOSAR COM的信号值包括三种:
初始值:AUTOSAR COM模块使用配置参数ComSignalInitValue的低N位初始化发送方和接收方的每个N位的信号类型, 配置的ComSignalInitValues也用于I-PDU的初始化信号。一个信号的初始值可以与无效值值相同。初始化阶段会清空所有更新位的值。默认情况下,所有I-PDU组应在停止状态,不得由Com_Init()调用启动。
数据无效值:通过调用Com_InvalidateSignal函数, AUTOSAR COM模块将在内部执行带有配置数据无效值的传输信号。信号传输属性和传输模式决定了无效值在总线上的传输。内部执行的带有数据无效值的传输信号,会决定被用作过滤器的数据无效值和TMS当前值。VFB仅为复杂数据类型定义一个属性。因此,一个失效的复杂数据类型到一个失效的信号簇的最佳映射是使一个信号簇的所有信号失效。因此,RTE还可以通过调用Com_InvalidateSignalGroup来请求使整个信号簇无效。
正常值:初始化阶段之后的有效值,包括COM部分收发的信号值。
信号传输属性:
发送信号有Triggered属性和Pending属性。
Triggered属性:
调用Com_SendSignal( )服务请求具备Triggered属性的信号发送,可以触发相关I-PDU的发送,但是如果该I-PDU的发送模式被配置为Peiodic时,只更新信号的值,不会触发相关I-PDU的立即发送,而是在下一周期到来时触发发送。
Pending属性:
Com_SendSignal( )服务请求调用具备Pending属性的信号发送,不会触发相关I-PDU的发送。
针对信号:
前提赋值到一个直接或者混合传输模式的I-PDU:
1、带有triggered属性的信号,在这个信号的任何发送请求时,COM模块会立即启动ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU 的发送。
2、带有 Triggered_Without_Repetition 属性的信号,在这个信号的任何发送请求时,COM 模块应该立即启动一个被赋值的 I-PDU 的传输
3、带有 Triggered_ON_CHANCE 传输属性的信号,在一个这样的信号的一个发送请求时,如果新发送的信号和本地存储的(上一个发送或者初始化的)在长度或值上不同,AUTOSAR COM 会立即发起 ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU的传输。
4、带有Triggered_ON_CHANCE_WITHOUT_REPRTITION 属性的信号,在一个这样的信号的发送请求时,如果新发送的信号和本地存储的在长度或者值上不同,AUTOSAR COM 模块应该立即发起一个被赋值的I-PDU的传输。
5、COM 模块不应该支持 ComBitSize 被配置为 0的信号和组信号的传输属性 Triggered_ON_CHANCE 和 Triggered_ON_CHANCE_WITHOUT_REPETITION
AUTOSAR COM 模块不应该发起 NONE 传输模式的 I-PDUs 的传输。可以通过 Com_TriggerTransmit 请求带有 NONE 传输模式的 I-PDUs。
一个与 I-PDU关联的 pending 信号,当 I-PDU 由于某种原因触发传输时,这个信号会被传输。
Notice: Com_TriggerTransmit 可以被调用来给任何 I-PDU 而无关其传输模式。
针对信号组:
如果 I-PDU 在一个组信号或者信号组的一个更新的情况下被发出,AUTOSAR COM 信号组和组信号可能都有传输属性,和传输模式相结合而定义。
前提该信号组任何发送请求分配给直接传输模式或者混合传输模式的I-PDU时:
1、带有 ComTransferProperty TRIGGERED 属性的信号组,COM 会立即启动ComTxModeNumberOfRepetitions 加 1 次该I-PDU的传输
2、带有 Triggered_without_repetition 属性的信号组,COM 会立即启动一次被该I-PDU的传输。
3、Triggered_On_Chance 属性的,不包含任何有传输属性的信号的,这样的信号组。如果至少有一个新发送的组信号和本地存储的长度或者值不同(上次发送的,或者初始化的),COM应该立即启动 ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU的传输。
4、 Triggered_On_Chance 属性的,包含任意一个自己配有传输属性的信号,这样的信号组。如果至少有一个新发送的配置有 Triggered_On_Chance 的组信号和本地存储的长度或者值不同(上次发送的,或者初始化的),COM应该立即ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU的传输。
5、带有 Triggered_On_Chance_Without_Repetition 属性的信号组,如果至少有一个新发送的组信号和本地存储的长度或者值不同(上次发送的或者初始化的),COM应该立即启动 ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU的传输。
选择传输模式:
COM 应该允许给每个I-PDU静态地配置两种不同的传输模式。
仅使用映射到该 I-PDU 的信号值来选择在特定时间点有效的 I-PDU 的传输模式。也就是说发送时,使用该信号的值作为输入,根据过滤器算法算出传输模式是TRUE还是FALSE。
用于选择传输模式的 I-PDU 的信号以及用于选择传输模式的条件是静态配置的。
一些情况下的传输模式的选择要求:
对于 TMS(发送模式选择器) 的选择,COM 模块应考虑所有有配置的 ComFilter 容器的(组)信号。
发送方向的I-PDU的一个信号有配置的 ComFilter 容器,这个信号被称作用于选择这个I-PDU的传输模式。如果该信号的配置容器没有分配的配置容器 ComFilter, 这个信号不会用于选择这个I-PDU的传输模式。
1、如果I-PDU内没有信号可以用于传输模式的选择,COM模块会评估这个I-PDU的发送模式选择器(TMS)为真。
2、 COM 评估一个用于发送模式选择的信号的 TMC(发送模式条件)为真,则COM应该评估 TMS 为真。
3、 COM 评估用于发送模式选择的信号的 TMC(发送模式条件)全为假,则COM应该评估 TMS 为 false。
4、COM 应该为每一个 I-PDU 定义一个发送模式选择器(TMS)
5、在包含的一个信号通过调用 Com_SendSignal 或者 Com_SendSignalGroup 更新后,COM 应该重新计算这个 I-PDU 的 TMS。
6、对于 MASKED_NEW_DIFFERS_MASKED_OLD 配置条件的传输模式的计算,COM 应该只使用最低有效的 ComBitSize 位。
7、对于 MASKED_NEW_DIFFERS_X, MASKED_NEW_EQUALS_X, NEW_IS_- OUTSIDE, NEW_IS_WITHIN 配置条件的传输模式的计算,COM 模块应使用配置的 ComSignalType 的所有位。
8、信号过滤算法被配置为 ALWAYS,将始终将相应 I-PDU 的 TMS 设置为 true。
9、如果 TMS 被评估为 true,COM 应该为这个I-PDU使用定义在配置容器 ComTxModeTrue 的ComTxModeMode。
10、如果 TMS 被评估为 false,COM 应该为这个I-PDU使用定义在配置容器 ComTxModeFalse 的ComTxModeMode。
注释->
DM:Deadline Monitoring 超时监控
MDT:Minimum Delay Timer 最小延时定时器,用在I-PDU发送成功后,设置一段时间不可以再发送
TM:Transmission Mode 传输模式
TMC:Transmission Mode Condition 传输模式条件
TMS:Transmission Mode Selector 传输模式选择器
参数 ComTxModeNumberOfRepetitions 的数值,就是最终发送的次数
{针对无效信号值、信号传输模式、信号传输属性、过滤算法等相关知识在本篇没有详细介绍,只是简单提到一些,后续会开新篇进行介绍,读者也可根据Autosar官方需求文档和规范文档自行学习。}