赞
踩
嵌入式、C语言、autosar、OS、BSW
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | vector , EB |
芯片厂商 | TI 英飞凌 |
编程语言 | C,C++ |
编译器 | HighTec (GCC) |
autosar版本 | 4.3.1 |
缩写 | 描述 |
---|---|
MDT | Minimum Delay Timer |
TMS | Transmission Mode Selector |
位于服务层。
AUtosar COM 是基于ISO 17356-4:2005 OSEK/VDX Communication (COM)而来。主要用于上层(SWC,RTE)与下层(PDUR)的信号mapping、signal组合、滤波,对NM通知等。
COM模块需要可实现以下功能,以下功能可根据需求配置,如果在其他特定模块中已经实现,可通过配置disable该功能:
1.将接收到的网络消息(在一个I-PDU内)映射到多个消息数据对象(1:n分割机制)。
2.内部消息到多个消息数据对象的映射(1:n拆分机制)。
3.将仅本地发送的消息映射到外部发送消息对象和内部接收消息对象(1:n分割机制)
4.M: 1发送;将来自多个发送者的消息映射到一个相同的消息对象。
5.通知机制:TASK, FLAG和EVENT。
6.启动和停止周期性消息。
7.NM接口。
8.发送端滤波。
9.Network-order message回调。
10.值符号的转换。
11.最小传输时间间隔。
12.拆包和组包信号和信号组。
13.字节顺序转换。
14.信号失效机制。
15.更新位(信号状态信息)
16.动态长度信号。
17.信号传输请求的复制。
18.接收和传输截止时间的监控。
19.I-PDU的处理。
AUTOSAR COM模块提供一个集成的信号网关,以1:n的方式转发信号和信号组。
信号网关允许信号和信号组从一个Rx I-PDU路由到一个或多个Tx I-PDU。为了减少中断运行时间,信号路由在Com_MainFunctionRouteSignals()中在任务级别执行。
由于信号可以通过COM单独访问,因此可以在路由时改变i - pdu的信号布局。此外,还可以改变路由信号的字节对齐方式,并为Tx信号和I-PDU指定任何可用的传输属性。
为了允许在两个信号之间进行路由,必须满足关于Rx和Tx信号兼容性的几个要求:
应用程序数据类型必须相等.
Rx信号的比特数不能大于Tx信号的比特数.
当路由字节数组(应用程序数据类型为uint[8])时,字节数必须相等.
如果一个Tx信号在多个路由关系中使用(n(Rx):1(Tx)路由),运行时路由关系必须是互斥的,以保证数据的一致性。
信号组从Rx I-PDU到Tx I-PDU路由一致。为了保证信号的数据一致性,要求Tx信号组的所有信号都用一个Rx信号组的信号填充。如果没有给出,信号组路由是不可能的。
不要求Rx信号组的所有信号都路由到Tx信号组。这允许将Rx信号组路由到具有较少组信号的Tx信号组.
最大路由延迟受多种因素的影响,COM无法保证延迟。在估计路由延迟时,必须考虑以下因素:
COM(主)函数的循环次数
Tx I-PDU的最小延迟时间
Tx I-PDU的传输方式和周期时间
Tx信号传输方式和滤波器设置
由底层引起的延迟(如总线访问延迟时间)
其他因素,如中断事件,可能延迟路由执行
基本Tx-I-PDU的网关路由超时描述了两个路由事件引用同一个Tx-I-PDU之间在超时之前的最大时间间隔。如果路由超时,则停止Tx-I-PDU的循环传输。如果该Tx-I-PDU发生网关映射事件,则重新启动PDU的循环传输。
每个Pdu都有ComIPduSignalProcessing参数,该参数可以有值IMMEDIATE or DEFERRED.
IMMEDIATE : 1.通知函数 在Com_TxConfirmation()或Com_RxIndication()函数中被调用。
2.带有IMMEDIATE信号处理的被触发信号的传输将在各自的Com_MainFunctionTx()的下一次调用中被触发。
DEFERRED: 1.通知函数在Com_MainFunctionRx()或Com_MainFunctionRx()的下一个调用周期中被调用。
2.信号处理DEFERRED的I-PDU中包含的信号值将在各自的Com_MainFunctionRx()中在任务级别上更新。
为了请求信号的传输,上层使用API Com_SendSignal。在执行可选参数检查后,COM用新的信号值更新I-PDU,并检查信号的传输属性是否需要直接传输。如果是,则设置一个标志,稍后在COM层的发送部分的循环主函数中计算该标志。Tx I-PDU必须分配给Com_MainFunctionTx
直接传输和周期传输的i - pdu的传输过程如下图所示。
周期传输
会在下个Com_mainfunctionTX 的时候发送更新的数据(5)
直接传输
在同一个周期更新的值B会被A覆盖。,所以如果上层更新信号过快会被覆盖掉。
MIXED 混合传输:
结合了上述两种类型。
AUTOSAR COM提供信号组,以一次性地发送多个信号。映射到一个信号组的信号称为group signals,它们之间应该是有联系的。为了保证group signals的一致性,每个信号组都有一个阴影缓冲区。要请求传输具有多个组信号的group signals,必须遵循以下API调用顺序:
/* Update the group signal values in the shadow buffer */
Com_SendSignal(GroupSignal1, &SigBuffer1);
Com_SendSignal(GroupSignal2, &SigBuffer2);
/* Copy the shadow buffer to the Tx buffer */
Com_SendSignalGroup(SignalGroupA);
注意事项: 为了保证整个信号组的数据一致性,一个信号组的完整传输(连续调用’Com_SendSignal’和’Com_SendSignalGroup’)不能被同一信号组的另一个传输请求或’Com_InvalidateSignalGroup’的调用中断。
AUTOSAR COM允许为每个I-PDU配置两种不同的传输模式(ComTxModeTrue和ComTxModeFalse)。仅根据映射到该I-PDU上的信号的滤波状态来选择在特定时间点有效的I-PDU的传输模式。
如果映射到特定I-PDU的任何信号的滤波器的计算结果为TRUE,则该I-PDU以传输模式TRUE传输。当映射到该I-PDU的所有信号的滤波器的值为FALSE时,该IPDU使用传输模式FALSE。
如果映射到特定I-PDU的所有信号都没有分配滤波器,则传输模式计算为TRUE,并且永远不会改变。
通过调用Com_SwitchIpduTxMode API,可以显式地切换每个Tx I-PDU的配置传输模式(TRUE/FALSE)。如果请求的传输模式与当前激活的传输模式不同,则立即激活新的传输模式。
可以选择性地为每个发射信号分配一个信号滤波器。发射信号的滤波器只用于传输模式的选择,但发射信号的值永远不会被过滤掉。
支持以下过滤器:mask, x, min和max的值可以为每个过滤器配置.
F_Always (TRUE)
F_Never (FALSE)
F_MaskedNewDiffersMaskedOld ((new_value&mask) != (old_value&mask))
F_MaskedNewEqualsX ((new_value&mask) == x)
F_MaskedNewDiffersX ((new_value&mask) != x)
F_MaskedNewIsOutside ((new_value<min) || (max<new_value))
F_MaskedNewIsWithin ((min<=new_value) && (new_value<=max))
在COM规范中定义了一种可选机制,通过为I-PDU引入最小发送距离来实现总线负载的划分。这个概念也在Tx主函数中处理.
混合传输方式示例如下图所示。请注意,由于最小发送距离,循环传输可以延迟,但基本周期不修改。直接传输用红色实箭头表示。
如果ComEnableMDTForCyclicTransmission参数设置为false,则只考虑基于事件的传输的最小延迟时间,它可以由Com_InvalidateSignal(), Com_InvalidateSignalGroup(),Com_SendSignal(), Com_SendSignalGroup(), Com_SendSignalGroupArray() or Com_TriggerIPDUSend().发起.
下图表明循环传输不会结束最小延迟时间。在循环传输之后直接触发基于事件的传输,尽管最小延迟还没有过去。紧接着,在比较中,第二个基于事件的传输请求被配置的最小延迟时间延迟,因为第一个基于事件的传输已经重新加载了延迟计数器。
对于Tx i - pdu,提供了截止日期监控机制来检测底层传输机制的故障。
支持两种不同的变体:
Normal Mode: 如果COM触发了I-PDU的发送,则观察I-PDU的发送请求到下一个Tx确认(Com_TxConfirmation())之间的时间。例如,发送请求由Com_SendSignal()、Com_TriggerIPduSend()或循环触发器给出。
None Mode: 对于由总线接口调度表(例如LIN调度表)触发的i - pdu,观察两个连续Tx确认之间的时间(Com_TxConfirmation())。“None Mode”适用于两种传输模式都配置为None的Tx I-PDU。当I-PDU对应的I-PDU组启动并在传输确认时重新加载时,定时器启动。如果这个定时器还没有运行,这个时候一个触发事件,例如Com_TriggerIPduSend(),也将启动定时器。
如果设置为 Normal Mode,在调用Com_SendSignale或者Com_SendSignaleGtoup的时候开始计时器,如果在Confirmation前超时,则触发notification functions。
如下图所示,如果设置为None Mod ,超时计时器由Com_IPduGroupControl()启动,收到confirmation 后重置定时器,如果两个confirmation 间超时则触发notification functions。
AUTOSAR COM提供了一个可选功能,为上层的一个发送请求复制传输请求到下层。
下层接收上层的一个发送请求。如果将ComTxModeNumberOfRepetitions属性配置为大于0的值(对于DIRECT或MIXED传输模式),则只要在上层发送请求后调用该I-PDU的“n + 1”确认,COM就会使用可配置的ComTxModeRepetitionPeriodFactor循环地触发Tx IPDU的传输。
如下图所示,N = 2 ,重复复制发送了两次
为了接收信号,上层使用API Com_ReceiveSignal。该业务发送的信号值包含在该信号的最新I-PDU中。由于信号处理上下文依赖于相应Rx IPDU的配置,所以直到下一次调用相应的Com_MainfunctionRx时,最新的信号值才可用。
信号的接收过程通常与I-PDU的接收是异步的。但是可以在接收通知回调中调用Com_ReceiveSignal。
调用com_receivessignal总是返回最后接收到的信号值,如果超时发生并且Rx数据超时动作被设置为REPLACE,则返回初始值,即使相应的I-PDU组停止。
AUTOSAR COM提供signal groups 用于一次性接收多个signals。signals映射到一个signal groups,signal之间通常是由联系的,说人话就是同一类signal放在一个signal group。为了确保组信号值的一致性,为每个信号组提供阴影缓冲区。
由于信号处理上下文依赖于相应Rx IPDU的配置,所以直到下一次调用相应的Com_MainfunctionRx时,最新的信号组值才可用。
注意: 为了保证整个信号组的数据一致性,一个信号组的完整接收(Com_ReceiveSignalGroup和Com_ReceiveSignal的连续调用)不能被同一信号组的另一个接收请求中断。
/* Copy the Rx buffer to the shadow buffer */
Com_ReceiveSignalGroup(SignalGroupA);
/* Get the group signal values from the shadow buffer */
Com_ReceiveSignal(GroupSignal1, &SigBuffer1);
Com_ReceiveSignal(GroupSignal2, &SigBuffer2);
Array-based access of SignalGroups 作为 替换Transmission of a Signal Group 和Reception of a Signal Group的方式,可以不用对Group中的Signals单独处理。调用Com_ReceiveSignalGroupArray和Com_SendSignalGroupArray API用于发送和接收基于uint8数组的SignalGroup。使用Array-based 后 ,group 打包和拆包的资源消耗就没了,SignalGroup的进一步处理留给API的调用者。但是,为了允许快速处理,必须满足以下先决条件:
1.只支持固定大小的数据类型。
2.SignalGroup必须在包含的I-PDU中按字节对齐。
3.SignalGroup不能被其他信号打断。
4.Transmission Mode Selector只能选择ALWAYS, NEVER, MASKED_NEW_EQUALS_X和
MASKED_NEW_DIFFERS_X。
要激活此功能,请打开全局COM配置开关ComEnableSignalGroupArrayApi必须启用。此外,只有SignalGroups ComSignalGroupArrayAccess被active才允许array-based access。
注意: 如果Array-based access of SignalGroups 经过了signal gateway,由于signal gateway需要解包分组信号,上述基于阵列表示的优点将消失。
COM会评估从底层接口给出的SDU的DLC的实际长度,以支持接收具有可变长度的Rx i - pdu。
分为两种情况:
1.实际收到的DLC大于等于静态配置的PDU长度:
仅处理与静态配置的PDU长度相同的SDU负载数据。
信号的内容可以被正常处理。
2.实际收到的DLC小于静态配置的PDU长度:
仅处理实际收到的DLC长度的PDU数据。
信号的内容可以被正常处理。会导致信号异常。如果配置的更新位不包含在实际接收到的有效载荷中,则信号被处理,就像设置了更新位一样。
对于Rx信号和信号组,提供截止时间监控机制,检测其他ecu的故障。可以为每个信号和信号组配置超时时间,但是只能单独监视具有配置的更新位的信号和信号组。对于没有配置更新位的信号和信号组,应用基于I-PDU的超时。
如果发生超时,COM是否调用超时通知并将信号值替换为配置的初始值是可配置的。如果Rx超时值与初始值不同,可以使用“Rx Data Timeout Substitution Value”参数配置Rx超时值。
在发送端,可以为每个信号和组信号配置一个无效值,该值由COM无效api设置,以表明应用程序不能提供任何有效的信号值。
对于信号组,所有的组信号应立即失效,因为组信号以一致的方式相关。因此,如果一组信号无效,则整个信号组无效。
在接收端,COM根据配置的无效值检查接收到的信号和组信号的值。如果检测到无效值,COM提供以下操作:
1.无效的值被信号的初始值所替换,然后进行正常的信号处理
2.调用配置的无效通知,并且无效值不存储在内部COM缓冲区中
3.对于信号组,将检查所有组信号的无效值。如果至少有一个组信号无效,则对该信号组的所有组信号执行无效操作。
可以对Rx信号和组信号配置滤波算法,过滤掉特定的信号值。如果滤波器算法被评估为FALSE,则整个信号处理被抑制。因此,信号数据不存储在内部COM缓冲区中,并且不调用已配置的通知函数。
对于信号组,如果所包含的任何组信号的至少一个已配置的滤波算法被求值为TRUE,则执行信号处理。只有当所有滤波算法的值都为FALSE时,信号组才会被过滤掉。
对于信号和信号组,可以配置更新位来指示自信号在总线上的最后一次传输以来信号值是否已被应用程序更新。
在发送端,更新位在Com_SendSignal或Com_SendSignalGroup的上下文中设置。由于更新位在值更新后只能在总线上出现一次,因此更新位必须根据下层的发送行为清除。每个Tx I-PDU可配置 update-bit。
如果下层在发送上下文中复制了I-PDU负载,则在COM触发I-PDU的发送后,更新位将被直接清除。如果下层请求通过调用Com_TriggerTransmit解耦的I-PDU负载,则更新位将在此上下文中被清除。
接收ECU检查与信号或信号组相关的更新位的状态,如果没有设置更新位,则禁止完整的信号处理。在功能良好的网络中,如果信号值发生了变化,则应该始终设置更新位。
描述路由是一种基本的路由模式,在这种模式下,一个传入的Rx- I-PDU的一部分被复制到1…n个目的tx -I-PDU中,而不需要对其内容进行进一步的解释和处理。在这种模式下,可以绕过正常的信号处理路径,从而减少路由事件延迟。
大的I-PDU是指大到无法装入底层通信协议的单个L-PDU的PDU。一个大的I-PDU必须将ComIPduType配置为TP,并且将通过传输协议发送/接收。在接收端,COM总是保存一个大I-PDU中包含的信号的有效值。
在传输端,当一个大的I-PDU传输正在进行时,COM将通过调用api: Com_SendSignal, Com_SendSignalGroup和Com_SendDynSignal返回COM_BUSY。
注意: 对于较大的i - pdu, ComTxIPduClearUpdateBit上下文只能配置为confirm。
动态长度信号是ComSignals或ComGroupSignals, ComSignalType配置为UINT8_DYN。动态长度信号的取值范围为0 ~配置的ComSignalLength。动态长度信号必须包含在ComIPduType配置为TP的I-PDU中,动态长度信号必须放置在I-PDU的末尾。允许为动态长度信号配置更新位。在这种情况下,更新位必须位于动态长度信号的前面。使用API Com_ReceiveDynSignal接收动态长度信号,使用API Com_SendDynSignal发送动态长度信号。
动态长度信号必须放置到字节边界,并且必须具有信号的端序OPAQUE。
在接收端,唯一支持的ComFilterAlgorithm是ALWAYS,而在发送端,动态长度信号和组信号支持ComFilterAlgorithms ALWAYS和NEVER。此外,ComTransferProperties TRIGGERED_ON_CHANGE和TRIGGERED_ON_CHANGE_WITHOUT_REPETITION不支持动态长度信号和组信号。
Com Optimizations 和状态机等后面续上。。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。