AUTOSAR COM解析

模块简介

COM是AUTOSAR服务层的模块,介于PDUR和RTE之间,如下架构图所示:

COM的主要功能如下:

  1. 为RTE或者ASW提供面向信号的数据接口;
  2. 通讯控制;
  3. 按不同的发送方式发送信号;
  4. 监控接收的信号,信号超时;
  5.  提供发送成功的通知;
  6. 提供初始值和信号更新指示;
  7. 大小端转换;
  8. IPDU和信号之间的打包盒解析;
  9. 支持大数据和动态长度的数据类型。

认识各种PDU

PDU由SDU和PCI构成:SDU(Service Data Unit)服务数据单元是需要传递的数据;PCI(Protocal Control Information)协议控制单元是数据传递所需的信息,比如包含源和目标信息,PCI在传输端由协议层添加,在接收端再次移除。

  1. I-PDU:Interaction Layer Protocal Data Unit。交互层协议数据单元,对应ISO七层模型的表示层。I-PDU承载着信号。
  2. N-PDU:Networt Layer PDU。网络层协议数据单元,对应ISO七层模型的网络层。TP层和IF层之间交互使用,如单帧、多帧、首帧、流控帧。
  3. L-PDU:Data Link Layer PDU。数据链路层协议数据单元,对应ISO七层模型的数据链路层。IF层和driver层之间交互使用。

需求及其对应的软件实现解读

1、支持多种不同阶段的配置

需求:COM需要支持在不同的编译阶段配置,即配置参数需要能够在不同的编译阶段更改:

  1. Pre-Compile-Time:通常的方式,生成的代码、预处理的指令等。
  2. Link Time:模块外的常数,模块编译完成后还能够再修改。
  3. Post-Build-Time:和2类似,模块外可加载的常量数据,但是数据在特定内存段,可以在整个工程编译完成后修改。比如直接刷新此内存区域即可。

软件实现:ComEnableSignalGroupArrayApi(待补充)

2、为PDUR提供接收指示函数

COM的唯一下层模块是PDU Router,当PDUR接收到I-PDU后,COM应该提供一个函数被PDUR调用,函数名为:Com_RxIndication。

软件实现:

void Com_RxIndication (
PduIdType RxPduId,
const PduInfoType* PduInfoPtr
)

RxPduId:接收PDU的ID;

PduInfoPtr:包含接收到的PDU的长度,以及指向PDU元数据的buffer的指针。

3、为PDUR提供发送确认函数

当PDUR发送I-PDU成功到网络后,应该调用COM提供的发送确认函数,函数名为:Com_TxConfirmation。

软件实现:

void Com_TxConfirmation (
PduIdType TxPduId,
Std_ReturnType result
)

TxPduId:发送成功的PDU的ID;

result:发送结果:E_OK:发送成功、E_NOT_OK:发送失败。 

4、为PDUR提供请求发送数据的功能,以供触发发送

当一个I-PDU应该被发送时,COM应该提供函数以供PDUR触发发送,函数名为:Com_TriggerTransmit,在此函数中COM将要发送的PDU复制给PDUR。

LIN Master使用这个函数发送一个LIN帧,可以由主调度表本身或接收到的LIN报头来触发发送。

软件实现:

Std_ReturnType Com_TriggerTransmit (
PduIdType TxPduId,
PduInfoType* PduInfoPtr
)

返回值E_OK:SDU已经被复制,其中sdullength表示复制的字节数;

返回值E_NOT_OK:未复制SDU数据。PduInfoPtr不能使用,因为它可能包含NULL指针或指向无效数据。

I-PDU是stop状态时,此函数返回E_NOT_OK;

当L-PDU的PduInfoPtr->SduLength小于实际的I-PDU长度时,此函数返回E_NOT_OK;

5、COM不支持将大信号拆分成不同的I-PDU

COM不支持打信号拆分为不同的I-PDU,但支持一个I-PDU可以拆分为不同的N-PDU,此时,需要用的TP层,TP层处理的是N-PDU。

6、I-PDU中未使用的区域需要配置默认值

I-PDU的layout中未使用的bit应该配置默认值。

软件实现:ComTxIPduUnusedAreasDefault。

7、COM应该支持多种发送方式

I-PDU发送需要支持如下发送方式:

  • Periodic:周期发送
  • Direct/n-times:事件驱动式发送,发送n-1帧
  • Mixed:周期发送和事件发送混合。无事件触发时周期发送,事件触发时按事件方式发送
  • None:不发送

软件实现:

信号发送也需要配置方式ComTransferProperty,有如下几种:

  • PENDING:写信号,不会触发发送。往往用来配置周期信号。
  • TRIGGERED:写信号,会触发该信号所在的I-PDU的发送,取决于I-PDU配置的发送方式。会重复发送,重发帧数在I-PDU的发送方式ComTxMode中配置ComTxModeNumberOfRepetitions。
  • TRIGGERED_ON_CHANGE:写信号,当值发生变化(与上次值或者初始值相比),会触发该信号所在I-PDU的发送,取决于I-PDU配置的发送方式。会重复发送,重发帧数在I-PDU的发送方式ComTxMode中配置ComTxModeNumberOfRepetitions。
  • TRIGGERED_ON_CHANGE_WITHOUT_REPETITION:和TRIGGERED_ON_CHANGE类似,区别是只会发送一帧。
  • TRIGGERED_WITHOUT_REPETITION:和TRIGGERED类似,区别是只会发送一帧。

当信号发送方式ComTransferProperty配置为TRIGGERED,I-PDU发送方式ComTxModeMode配置为DIRECT 或 MIXED,写此信号时,COM应该立即发送该I-PDU(最晚不超过下一次Com_Mainfunction),发送ComTxModeNumberOfRepetitions+1次。

当信号发送方式ComTransferProperty配置为TRIGGERED_WITHOUT_REPETITION,I-PDU发送方式ComTxModeMode配置为DIRECT 或 MIXED,写此信号时,COM应该立即发送该I-PDU(最晚不超过下一次Com_MainFunctionTx),发送1次。

当信号发送方式ComTransferProperty配置为TRIGGERED_ON_CHANGE,I-PDU发送方式ComTxModeMode配置为DIRECT 或 MIXED,写此信号时,若值发生变化,COM应该立即发送该I-PDU(最晚不超过下一次Com_Mainfunction),发送ComTxModeNumberOfRepetitions+1次。 

当信号发送方式ComTransferProperty配置为TRIGGERED_ON_CHANGE_WITHOUT_REPETITION,I-PDU发送方式ComTxModeMode配置为DIRECT 或 MIXED,写此信号时,若值发生变化,COM应该立即发送该I-PDU(最晚不超过下一次Com_Mainfunction),发送1次。 

当I-PDU的发送方式 ComTxModeMode配置为None,COM应该不发送此I-PDU。

每次调用Com_MainFunctionTx一个I-PDU至多发送一帧。 

I-PDU的发送方式配置为Mixed时,事件触发时,重发的帧数、周期发送的帧也被计数,所以报文看起来周期混乱。 

8、COM应该支持每个I-PDU配置两种发送模式

COM需要支持每个I-PDU配置两种发送模式,比如不同的发送周期,且能够在运行时实时切换。

软件实现:

TMS:Transmission Mode Condition。每个I-PDU可以配置两个TMS,分别对应true和false,如果I-PDU的TMS计算为true/false,则执行对应的发送方式。

发送TMS切换时,发送方式需要立即切换。配置为PERIODIC或MIXED的I-PDU,切换后重新开始周期计时。

void Com_SwitchIpduTxMode (
PduIdType PduId,
boolean Mode
)

上述函数用于切换I-PDU的发送方式,调用后立即切换至Mode模式,若当前模式已处于Mode,则不受影响。

9、COM模块应支持可配置的基于两种传输模式的信号数据选择机制

COM应单独提供I-PDU中每个信号的条件,来选择其中的一种传输模式。当I-PDU中所有信号的所有条件计算为TRUE,那此I-PDU的发送模式应该是TRUE。

软件实现:待补充。

10、收到新的发送请求时,COM应该取消未发送的重复发送

当有剩余的重发发送未完成时来了新的发送请求,COM应该取消剩余的重复发送,开始发送新的信号

11、COM应该支持对用户即时immediate或延迟deferred两种方式的通知

COM应支持配置I-PDU的TxConfirmation\RxIndication为immediate或deferred。immediate由PDUR中断完成,deferred由Com_Mainfunction周期调用完成。

软件实现:

信号处理方式ComIPduSignalProcessing ,两种:

IMMEDIATE:信号通知函数ComUser_CbkTxAck\ComUser_CbkRxAck在Com_TxConfirmation或Com_RxIndication中调用,中断形式解包。

DEFERRED:信号通知函数在Com_Mainfunction中调用,轮询形式解包。

接收I-PDU的信号处理方式配置为IMMEDIATE,COM应该在Com_RxIndication中调用ComUser_CbkRxAck并解包;如果配置为DEFERRED,COM应该在Com_RxIndication中将I-PDU从PDUR copy到COM,再异步地在Com_MainfunctionRx中调用ComUser_CbkRxAck并解包。当在延迟解包过程中调用Com_ReceiveSignal,获取的信号将是未更新的值。

案例:I-PDU的信号处理方式配置为DEFERRED,周期调用Com_ReceiveSignal,应用层通过I-PDU的callout函数获取是否有信号更新。如此配置会导致偶发应用层收到的信号不是最新值。场景如下:

A时刻收到信号,I-PDU的callout函数被调用,信号被copy到COM层,但是未解包;之后的B时刻周期调用了Com_ReceiveSignal,获取的仍是老信号;在之后的C时刻周期调用的应用层通过I-PDU的callout判断接收到了信号,并使用了B时刻Com_ReceiveSignal获取的信号;D时刻Com_MainfunctionRx才调用。这样就会导致使用了老信号,比如在认证场景下就出现失效。

2个解决方案:

1、应用层判断接收到新信号,不能与实时的callout中断强关联,因为callout调用后,还需要调用Com_ReceiveSignal才能获取新信号。可以修改成周期触发:一个周期内判断一次有没有接收到新信号,再将Com_MainfunctionRx、Com_ReceiveSignal、应用层策略依次放在其之后调用,这样就保证了判断接收到信号之后,信号得到更新。

2、同1,应用层判断接收到新信号,不能与实时的callout中断强关联,因为callout调用后,还需要调用Com_ReceiveSignal才能获取新信号。可以修改成周期触发:一个周期内判断一次有没有接收到新信号。将I-PDU的信号处理方式改为IMMEDIATE,这样仅需保证Com_ReceiveSignal、应用层策略依次放在判断接收到信号之后调用即可,Com_MainfunctionRx的位置就无需关注。 

12、COM应该支持两种不同的信号超时处理方式 

对于接收的信号,当信号超时未收到时,COM模块应提供两种选择:

  • 告知上层,使用替代值;
  • 使用之前最后收到的值。

软件实现:

ComRxDataTimeoutAction超时动作:

  • REPLACE:信号被ComSignalInitValue替代;
  • SUBSTITUTE:信号被ComTimeoutSubstitutionValue替代;
  • NONE:不被替代,使用last value。

ComTimeout超时时间:超时监控的时间。

ComTimeoutSubstitutionValue超时替代值。

13、COM应该支持打开和关闭I-PDU Group

I-PDU Group是I-PDU的集合,COM应该支持打开和关闭信号的收发。PDU group默认是关闭的,Com_Init也不会打开PDU group,如果I-PDU不属于任何group,那Com_Init会开启它的收发。I-PDU可以属于任何group,只要其中一个group是打开的状态,此I-PDU即可收\发。

软件实现:

打开PDUgroup:

void Com_IpduGroupStart (
Com_IpduGroupIdType IpduGroupId,
boolean initialize
)

关闭PDUgroup: 

void Com_IpduGroupStop (
Com_IpduGroupIdType IpduGroupId
)

IpduGroupId:PDUgrout ID;

initialize:此group中的I-PDU的初始化请求,为true时,调用后I-PDU就像COM重新初始化过一样。 

这个接口可以用来作为应用层通讯的开关,比如:FOTA时需要静默,可以通过这个接口实现。

14、COM应该支持使能I-PDUgroup的接收超时监控 

当有ECU处于仅监听模式时,对手ECU应该不监控它的超时。

软件实现:

void Com_EnableReceptionDM (
Com_IpduGroupIdType IpduGroupId
)
void Com_DisableReceptionDM (
Com_IpduGroupIdType IpduGroupId
)

 15、COM应具有ISO-17356-4的接口和功能

软件实现:

uint8 Com_SendSignal (
Com_SignalIdType SignalId,
const void* SignalDataPtr
)

SignalId:信号ID

SignalDataPtr:信号数据的指针

此函数更新发送信号的数据,如果信号发送方式ComTransferProperty配置为TRIGGERED,且I-PDU的发送方式为DIRECT或MIXED,此函数调用就会立即出发一帧信号的发送。

uint8 Com_ReceiveSignal (
Com_SignalIdType SignalId,
void* SignalDataPtr
)

此函数接收信号数据,将数据放到SignalDataPtr中。

函数调用关系序列图

1、COM和PDUR之间的交互

2、PDUR的Confirmation处理 

3、 PDUR的Indication处理,同上

      

4、ASW(RTE)\COM\PDUR模块交互

发送:

 接收:

  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值