1、ISOLAR-AB配置
1.1、整体概述
整体配置思维导图如下
根据各家配置工具以及规范总结 PDUR模块配置大的Container只有三个
PduRBswModules可以有多个,此处包含了上层例如DCM\COM与下层模块CanTp\CanIf。
ISOLAR-AB整体显示如下
1.2、PduRGeneral
下面记录一些自己认为不是特别理解的点:
PduRMetaDataSupport:
启用MetaData处理支持。MetaData的大小由全局PDU定义中的配置参数MetaDataLength定义。此特性可用于高效的CAN-CAN路由,其中MetaData包含CAN ID。
PduRZeroCostOperation:
规范解释:假设设置了这个参数,一旦无法实现0开销(此处的0开销是对与其它模块的关联,与其他模块产生交互),将会上报错误。这点理解下来,PDUR上下层模块唯一对应,不能有PDUR层面的网关功能,COM与CANIF、DCM与CANTP唯一对应,其实这个时候PDUR相当于不存在路由表了,这个时候是不是传输速度更快呢?理论上是的。
PduRFifoTxBufferSupport:
配置参数使能或使能PDU路由器支持fifo作为PDU发送缓冲区;当“PDUR GATEWAY OPERATION”设置为“disabled”时,该参数必须设置为“disabled”。该参数应被视为配置生成器的输入要求。
PduRIFGatewayOperation:
配置参数使能或使能PDU Router IF从接口模块到下层接口模块的网关;如果启用了PDUR_ZERO_CoST_OPERATION,则必须禁用此参数。该参数应被视为配置生成器的输入要求。
PduRMemorySize:
为PDU路由器缓冲区保留的内存大小。仅用于网关操作。
PduRMinimumRoutingLoModule:
下层模块用于最小路由;如果PDUR_ZERO_coST_OPERATION被禁用,则使用该参数;否则不得使用。L
PduRMinimumRoutingUpRxPduId:
接收下层模块的PDU标识符,用于到下层的PDU Router接口PDUR MINIMUM_ROUTING指定的最小路由LO模块;此参数用于PDUR_ZERO_COST_OPERATION被禁用;否则不得使用。
这个也不是乱设定的,最好设置为规范里面的
PduRSbTxBufferSupport:
配置参数不使能或使能PDU路由器支持单个缓冲区作为PDU发送缓冲区;如果PDUR_GATEWAY_OPERATION被禁用,该参数必须被禁用。该参数应被视为配置生成器的输入要求。(Sb:Signal buff)
1.3、PduRBswModules
PduRCommunicationInterface:
指定这个模块是否支持CanIf模块,当然一个模块也可以有两种属性(使用下层API的能力)既支持CANIf也可以支持CANTP,例如COM模块。
PduRLowerModule:
是否是PDUR的下层模块,此静态配置主要讲API的调度,谁去实现API,谁去调度API,例如此处PDUR去实现 PduR_CanIfRxIndication供CanIf使用。PDUR也会调用CanIf_Transmit。
PduRRetransmission:
定义TP是否具有重传功能,及时传输协议支持重传功能,此参数也可以被设置为False
上层模块处理重传功能,此功能仅在TP与网关下才匹配使用。
PduRTriggertransmit:
触发传输功能,假设设置为TRUE,底层模块既可以调用下层,也可以调用上层的TriggerTransmit功能。
PduRTxConfirmation:
发送确认,这个接口一般开着。
PduRUseTag:
主要针对下面三类接口打上标签
举个例子:开了这个功能,某一时刻使用了PduR_ComCancelTransmit API,上层模块将会直到这个接口用了Tag功能并后台记录。
1.4、PduRRountingTabls
表示一个路由路径表。此路由表允许使用多个配置,这些配置可用于在同一配置中创建多个路由表。这主要用于后构建(例如后构建可选),但也可以用于预编译和链接时的变量处理。
EcucIntegerParamDef:类似这种内部参数定义,根据你配置的个数一般都是自己生成的,配置里面是没有的,例如上图的配置项。
2、代码分析
ETAS的PDUR代码初始化,切换PdurState到PDUR_ONLINE其实不怎么合理,直接在程序里面赋值然后直接切状态,没有检验什么的,三个状态按照顺序直接下来了,然后把配置的基本信息传递给了PduR_Base。
然后对这个传递的值做了一层宏定义
随机抽查一个发送的数据进行解析如下
传输的数据为
注意测试图示里面的0x1F代表着PDUR的I-PDU ID
PDUR的I-PDU ID生成在了PduR_Cfg_SymbolicNames.h里面。