Autosar BSW 之 通信(1) Com

对不同速率的总线网络提供数据交换;为汽车控制单元应用软件提供了统一的通信环境,为内部和外部通信定义了公共的软件通信接口和行为;

COM 的业务逻辑是为 RTE 提供收发信号的相关逻辑。处于 BSW 中 CAN 协议栈的顶层。 向下直接交互 PduR,COM 组包信号为 I-PDU, 向下交给 PduR 进行路由,可能会路由到其他模块,但是主要是路由给 CanTp 或者 CanIf,由 CanTp 或者 CanIf 向下进行物理层的发包工作,收包的路线是相反的,底层提供中断,Controller 引起中断,进入中断处理程序调用相应的中断处理函数,进行收包,传 PduR,PduR 会把包路由给 COM 由 COM 解包,做一些逻辑处理。

定义

  • Confirmation:通过 Confirmation,PDU Router 可以报告来自 COM 的请求成功完成,这是对 COM 请求的反应。例如,当一个 PDU 被成功传输时,就会发送 Confirmation

  • Data Invalid Value:COM 模块发送,表示发送端的 AUTOSAR 软件组件不能提供有效值。

  • Dynamic Length Signal:运行期间数据的长度可能会不同(不固定)

  • Dynamic Length I-PDU:包含动态长度信号的 I-PDU,其长度取决于动态长度信号的长度(【动态长度信号,根据长度来表示数据长度?】)

  • Group signal:是 Signal Group 中的一个信号

  • Indication:是 PDU Router 给 COM 的异步信息,例如,通知 COM 收到数据了

  • Init Value:I-PDUs 和 Signals 在启动后被 COM 设置为初始值,一直使用直到被覆写。

  • I-PDU group:COM 模块中相同方向(发送或接收)的 I-PDU 的任意集合

  • Inter-ECU-Communication:车载 ECU 之间的通信

  • Intra-ECU-Communication:ECU 内部的软件组件的通信

  • Large Signal:信号太大而无法装入底层通信协议的 L-PDU

  • Large I-PDU:在底层通信协议中无法放入 L-PDU 的 I-Siganl-I-PDUs。这样的 I-PDUs 可以被 COM 处理,但是会通过 TP API 发送和接收。如果 Large I-PDU 只有一个信号,或者信号可以被 RTE 串行化,那么可以通过 LargeDataCOM 以更高效的方式传输。如果信号需要被单独分开处理,或者必须要被路由,那么只能通过 COM 处理。

  • Message:经常会被 Signal 替换,有同样的意思

  • Metadata:payload 通过包含例如 CAN ID 的元数据,进行扩展(【payload?】)

  • Notification:COM 传递给 RTE 的信息,例如新数据到达,或者发生错误

  • Signal:和 Message 相同

  • Signal Group:AUTOSAR 也有复杂数据类型,在一个复杂数据类型

  • Updata-bit:AUTOSAR COM 提供的机制,信号(组)接收方可以识别发送方在发送之前是否修改了数据

1. PDU

1.1 名词

  • PDU:Protocol Data Unit 协议数据单元,PDU 由 SDU 和 PCI 组成

    • SDU:Service Data Unit 服务数据单元

    • PCI:Protocol Control Information 协议控制信息

  • I-PDU:Interaction Layer PDU,由 data、length、I-PDU ID 组成。PDU 路由主要转发 I-PDU,即时路由除外(【即时路由?】)

  • N-PDU:Network Layer PDU,或 I-PDU Segment,由传输协议模块使用,对 I-PDU 进行分段

  • L-PDU:Data Link Layer PDU,或 Large PDU,一个或多个 I-PDU 被打包成 L-PDU,L-PDU 是基于总线的,例如 CAN 总线的 L-PDU 就是 CAN 帧

  • DM:Deadline Monitoring 超时监控

  • MDT:Minimum Delay Timer

  • TM:Transmission Mode 传输模式

  • TMC:Transmission Mode Condition 传输模式条件

  • TMS:Transmission Mode Selector 传输模式选择器

2. signal

2.1 信号值

  • 初始值

AUTOSAR COM模块使用配置参数ComSignalInitValue的低N位初始化发送方和接收方的每个N位的信号类型, 配置的ComSignalInitValues也用于I-PDU的初始化信号。

一个信号的ComSignalInitValue可以与ComSignalDataInvalidValue值相同。初始化阶段会清空所有update-bits值。默认情况下,所有I-PDU组应在停止状态,不得由Com_Init()调用启动。

  • 数据无效值

通过调用Com_InvalidateSignal, AUTOSAR COM模块将在内部执行带有配置ComSignalDataInvalidValue的Com_SendSignal。ComTransferProperty和传输模式决定了ComSignalDataInvalidValue在总线上的传输。内部执行的带有数据无效值的Com_SendSignal,会决定被用作过滤器的数据无效值和TMS当前值。VFB仅为复杂数据类型定义一个属性。因此,一个失效的复杂数据类型到一个失效的信号簇的最佳映射是使一个信号簇的所有信号失效。因此,RTE还可以通过调用Com_InvalidateSignalGroup来请求使整个信号簇无效。

  • 正常值

初始化阶段之后的有效值,包括COM部分收发的信号值。

2.2 发送信号属性

  • Triggered属性-触发

调用Com_SendSignal( )服务请求具备Triggered属性的信号发送,可以触发相关I-PDU的发送,但是如果该I-PDU的发送模式被配置为Peiodic时,只更新信号的值,不会触发相关I-PDU的立即发送,而是在下一周期到来时触发发送。

  • Pending属性-延迟

Com_SendSignal( )服务请求调用具备Pending属性的信号发送,不会触发相关I-PDU的发送。

2.3 信号收发

  • 发送

发送过程中,应用层调用COM层提供的信号或信号簇发送函数,根据配置,信号或信号簇的数据经过字节序转换后被更新到I-PDU中相应的位置。AUTOSAR COM规范中同一I-PDU可以设置两种发送模式,对其中各信号的传输模式条件进行计算,I-PDU选择其中一种发送模式进行发送。然后启动发送死限监控,调用PduR_ComTransmit()函数将I-PDU发送到下层。

根据该信号的配置判定是内部信号还是外部信号。

  • 内部发送:直接将信号数据复制到接收信号数据区,并执行通知操作;

  • 外部发送:若该信号发送属性为触发triggered,则该信号所属的I-PDU将立即发送(除非该I-PDU发送模式为周期传输模式),若该信号发送属性为延迟pending,则不进行传输,发送时,信号经过字节顺序转换后数据被复制到I-PDU中,同时设置相关更新位信息,然后根据该I-PDU的TMS切换传输模式,进行传输并设置启动相关定时器。

  • 接收

接收过程中,当下层接收到I-PDU时,下层将调用COM层提供的指示函数Com_RxIndication(),取消并重启接收死限监控,将I-PDU的数据从底层拷贝到COM中。调用信号或信号簇的接收函数后,该I-PDU中的信号或信号簇将经过字节顺序转换、符号扩展和接收过滤后,数据被拷贝到应用层。

接收过程要判断是内部信号还是外部信号。

  • 内部接收:直接将信号数据复制到接收信号数据区;

  • 外部接收:首先判断对于的I-PDU组是否启动,若启动,返回E_OK,否则返回COM_STOP,取消并重启该I-PDU的相关死限监控定时器,将数据复制到I-PDU数据区,I-PDU中的信号经过字节书序转换、符号扩展和过滤机制后,复制到接收信号数据区,再执行通知操作,通知上层软件调用相关API函数接收信号。

2.4 信号过滤

AUTOSAR COM模块会评估每次过滤的条件为真或假;

AUTOSAR COM模块会在接收端滤出想要过滤的信号;

AUTOSAR COM模块应在发送端对传输模式条件(TMC)使用过滤机制,但不应过滤发送端信号;

AUTOSAR 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;

注:对于ComSignalType FLOAT32、FLOAT64、UINT8_N或UINT8_DYN的信号,AUTOSAR COM模块应只支持配置为ALWAYS、NEVER或ONE_EVERY_N的ComFilterAlgorithm ;

对于ComSignalType配置为BOOLEAN的信号,AUTOSAR COM模块应只支持ComFilterAlgorithm配置为 ALWAYS;NEVER;MASKED_NEW_EQUALS_X;MASKED_NEW_DIFFERS_X;MASKED_NEW_DIFFERS_MASKED_OLD; ONE_EVERY_N;

过滤处理:

如果AUTOSAR COM模块在接收端过滤掉一个信号(信号簇),即filter condition的结果为false,则AUTOSAR COM模块应丢弃该信号(信号簇),不进行处理,及不会将该信号的值放入old_value中;

如果AUTOSAR COM模块将一个信号的过滤器计算为true(值没有被过滤掉),那么AUTOSAR COM模块应将该信号的值放入old_value中;

如果在send-API编写相应的信号之前对过滤器进行了计算,则需要有一种方法来确定该信号的过滤器状态。 一些筛选器需要new_value来计算筛选器。 然而,这只有在使用send-API更新信号之后才可用。 因此,有必要在第一次发送之前为new_value定义过滤器使用的值。

对于配置的接收滤波器MASKED_NEW_DIFFERS_MASKED_OLD的信号, AUTOSAR COM模块将处理该信号在接收截止日期监测超时后收到的第一个值,就像该值已经通过了过滤条件一样;

在相关的I-PDU的RX截止超时后AUTOSAR COM模块会让过滤器MASKED_NEW_DIFFERS_MASKED_OLD传递任何值。

3. 数据传递

3.1 下层PDUR

PDUR对COM的功能需求:

  • 输入I-PDUs的指示 用于发送I-PDUs的发送接口,

  • 包括通信控制器是否已发送I-PDU的确认

  • 触发接口,使PDU router能够引起来自AUTOSAR COM模块的传输

  • 用于TP通信的缓冲区处理

3.2 上层RTE

COM模块为RTE提供面向信号的数据接口:

  • 将AUTOSAR信号打包传送给I-PDUs

  • 将接收到的I-PDUs打包并将接收到的信号提供给RTE

  • 将接收到的I-PDUs信号路由到I-PDU进行传输

  • 将接收到的I-PDUs中的信号簇路由到I-PDU中进行传输

  • 通信传输控制(I-PDU组的启动/停止)

  • 发送请求的复制

  • 保证传输I-PDUs之间的最小距离

  • 接收信号监控(信号超时)

  • 传入信号的过滤机制

  • 不同的通知机制

  • 提供初始值和更新指示

  • 字节顺序的转换

  • 符号扩展

  • 每个I-PDU支持两种不同的传输模式

  • 基于信号的网关

  • 支持大型和动态长度数据类型

  • 支持I-PDU计数器和I-PDU复制

3.3 信号传输模式

  • ComTxMode

      包含于该I-PDU的任何具备Triggered属性的信号及信号组的更新都会触发I-PDU的立即发送,当上层面模块调用Com_SendSignal( )/Com_SendSignalGroup( )更新信号或者信号组时,Com层根据配置需求发送n次该I-PDU。

      用户配置发送周期,只有该I-PDU的周期到来时才会触发该I-PDU的发送,上层模块调用Com_SendSignal()/Com_SendSignalGroup( )只更新信号及信号组的内容。

      Direct/n-times和Periodic的混合模式,当上层模块调用Com_SendSignal( )/Com_SendSignalGroup( )请求该I-PDU包含的信号/信号组的发送时,将会触发该I-PDU的直接n次发送,同时,用户配置的周期到来也会触发该I-PDU的发送。

      无论何时COM层不能够触发拥有该发送模式的I-PDU的发送,只有PduR模块调用Com_TriggerTransmit()服务才能够触发该I-PDU的发送。

    • 直接/N次传输模式(Direct/n-times模式)

    • 周期传输模式(Periodic 模式)

    • 混合传输模式(MIXED)

    • None传输模式(NONE)

  • 在AUTOSAR COM规范中允许为每个I-PDU静态配置两种不同的传输模式,ComTxModeTrueComTxModeFalse。在AUTOSAR COM规范中通过传输模式切换,来选择I-PDU中的其中一种传输模式进行传输。

    • 先使用过滤机制判断I-PDU中各信号的发送模式条件,同时更新I-PDU中的信号。

    • 通过各信号的判断结果来计算该I-PDU的TMS(transmission mode selector)。若至少有一个C( 与IPDUk中的信号Si相关)为True,则TMS为True,对应I-PDU以用户配置的ComTxModeTrue的发送模式发送;若所有C(Si,IPDUk)都为False,则TMS为False,对应I-PDU以用户配置的ComTxModeFalse的发送模式发送.

  • 发送模式条件TMC+发送模式选择TMS

    • 发送端信号的TMC(发送模式条件)的计算与接收端的信号过滤机制相同,但是,在发送端信号过滤并不会丢弃任何的信号,而只是用于计算信号TMC的值。

    • 发送端的TMS,一个I-PDU的TMS的值是根据其所有下属的信号的TMC结果决定的,若一个I-PDU下属的信号中至少有一个信号的TMC计算为True,那么这个I-PDU的TMS为True,只有该I-PD下属的所有的信号的TMC都计算为False时,该I-PDU的TMS才为False。

  • 每个I-PDU配置两种发送模式,在程序运行过程中,某I-PDU的发送模式是由TMS来决定,若一个I-PDU的TMS根据上述的算法计算为True,那么该I-PDU将以配置的True状态下的发送模式进行发送。当一个I-PDU下属的某个信号的过滤算法配置为ALWAYS,那么这个I-PDU将一直以用户配置的TM为True状态下发送模式进行发送。

  • AUTOSAR COM模块中的逻辑信号流显示为映射到一个I-PDU (IPDUk)的两个信号(Signal1和Signal2) :

暂时无法在飞书文档外展示此内容

3.4 数据接收

  • BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;

  • CAN Driver模块的Can_MainFunction_Read函数将访问CanController(硬件)的寄存器—仲裁寄存器,数据寄存器和数据长度寄存器(保证读取数据的有效性),并读取这些寄存器的数据;

  • 数据读取结束后,这时继续调用CAN Interface模块的CanIf_RxIndication函数,这样数据从CAN Driver模块传给了上一层的CAN Interface模块;

  • CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块;

  • PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存,供应用层软件读取使用。

3.5 数据发送

  • BSW调度器周期性调用Com模块的Com_MainFunction_Tx函数,Com模块将从其缓存器中读取需发送的数据;

  • Com模块的Com_MainFunction_Tx函数将调用PduR模块的PduR_ComTransmit函数,将数据传给PduR模块;

  • PduR模块路由到CAN Interface模块,调用CanIf_Transmit函数,这样数据从PduR模块传给了下层的CAN Interface模块;

  • CAN Interface模块再调用Can Driver模块的Can_Write函数,将数据写入相应的寄存器;

  • 与CAN接收功能一样,Can_Write函数将访问仲裁,数据长度和数据寄存器,将数据写入。

3.6 数据发送确认

  • BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Write函数;

  • CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认;

  • 数据读取结束后,这时继续调用CAN Interface模块的CanIf_TxComfirmation函数,这样数据从CAN Driver模块传给了上层的CAN Interface模块;

  • CAN Interface模块再调用PduR模块的PduR_TxConfirmation函数,将数据传到PduR模块;

  • PduR模块路由到Com模块,调用Com_TxConfirmation函数,确认发送状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶小破孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值