之前简单介绍了Autosar Dcm模块,接下来我们直接切入主题,如何通过Vector Configurator Pro工具配置DSD子模块,并实现客户的需求。
Dsp配置可以说是Dcm的核心,大部分的需求开发都是在这个子模块中进行。
DcmDspDidLookUpFilterEnabled:是否支持外部DID查找过滤。若支持,Dcm可以调用应用函数。
DcmDspDDDidCheckConditionReadPerSourceDid:Dcm在接收到0xF200-0xF3FF范围内的0x22和0x2A服务时会调用“CheckConditionRead”接口。
DcmDspDDDidCheckPerSourceDid:Dcm在接收到0xF200-0xF3FF范围内的0x22和0x2A服务时会执行DIDs和内存块检查等预条件检查。
DcmDspDDDidClearOnStateChange:Dcm在改变会话/安全权限改变时清除DID状态,条件不满足时不允许访问。
DcmDspMaxDidToRead: 在单个22服务中允许读取的最大DID数量。若读取的DID数量大于该值,发送否定响应。
DcmDspMaxPeriodicDidToRead: 在单个2A服务中允许读取的最大DID数量。若读取的DID数量大于该值,发送否定响应。
DcmDspPowerDownTime:指定在下点过程中待机的最短时间。若该值存在,在11 04服务肯定响应时回复该值;反之,在11 04服务肯定响应时回复0xFF。
DcmDspReadDIDReportsNODIByte:在读取OBD DID(0xF801-0xF8FF)时报告OBD VID的NODI字节。若该值存在,Dcm将完全镜像 OBD2 VID数据;反之,Dcm将省略NODI字节
DcmDspReadPagedDataPageSize:读操作时每页Buffer的大小
DcmDspRidLookUpFilterEnabled:是否支持外部RID查找过滤。若支持,Dcm可以调用应用函数
DcmDspRteImplicitComEnabled:建立一个专门的Buffer,用来拷贝RTE的数据。
这个容器包含一个Data的配置
DcmDspDataFixedLength:如果设置为TRUE,Dcm 将直接从配置中使用数据长度参数值。一般都会勾上。
DcmDspDataScalingInfoSize:数据伸缩信息的长度。Dcm接收到0x24请求时输出该值。
这个容器包含属于DID的Data的配置。
DcmDspDataBlockIdRef:DCM直接访问Nvm block。
DcmDspDataConditionCheckReadFnc:Did读取检测条件的函数名。若不为空,DCM接收到Did的读取会调用该函数;反之则不检测。
DcmDspDataConditionCheckReadFncUsed:决定是否使用条件检测
DcmDspDataEcuSignal:指定 Dcm 对某个 ECU 信号的控制访问的函数名称
DcmDspDataEndianness:定义DID的字节序
DcmDspDataFreezeCurrentStateFnc:指定Dcm冻结当前IO状态的函数名。一般用于0x2F服务(IOControlByDataIdentifier)。
DcmDspDataGetScalingInfoFnc:指定Dcm读取缩放信息的函数名。一般用于0x24服务(ReadScalingDataByIdentifier)。
DcmDspDataInfoRef:对DcmDspDataInfo的引用
DcmDspDataReadDataLengthFnc:指定Dcm读取DID数据的长度的函数名
DcmDspDataReadEcuSignal:指定Dcm读取某个ECU 信号的函数名
DcmDspDataReadFnc:指定Dcm读取数据内容的函数名
DcmDspDataResetToDefaultFnc:指定Dcm复位当前IO默认状态的函数名
DcmDspDataReturnControlToEcuFnc:指定Dcm返回IO状态给APP的函数名
DcmDspDataShortTermAdjustmentFnc:指定Dcm调整IO状态的函数名
DcmDspDataSize:DID数据的长度。若数据长度可变,该参数就是最大的数据长度
DcmDspDataSystemTemplateDiagnosticDataElementRef:定义被DcmDspData引用的诊断数据
DcmDspDataType:指定数据类型
DcmDspDataUsePort:访问数据的接口类型。
'USE_DATA_ASYNCH_CLIENT_SERVER' or 'USE_DATA_SYNCH_CLIENT_SERVER':Dcm调用RTE接口;
'USE_DATA_SYNCH_FNC' or 'USE_DATA_ASYNCH_FNC':Dcm会调用专用的接口(自己实现的接口)
DcmDspDataWriteFnc:指定Dcm写数据内容的函数名
这个容器包含DID的Info的配置,是配置DID的会话、解锁等级。
DcmDspDidReadModeRuleRef:配置DID读取模式规则。
DcmDspDidReadSecurityLevelRef: 配置DID读写的安全解锁等级。一个服务允许多个引用。
DcmDspDidReadSeesionLevelRef: 配置DID读写的会话等级。一个服务允许多个引用。
这个容器包含DID的配置
DcmDspDidIdentifier:配置DID的ID号。
DcmDspDidInfoRef:指定DID的配置信息
DcmDspDidRef:
DcmDspDidRoeQueueEnabled:
DcmDspDidSystemTemplateDiagnosticDataIdentifierRef:
DcmDspDidUsePort:DID 的信号组合成一个 struct 数据类型。
USE_DATA_ELEMENT_SPECIFIC_INTERFACES:根据DspData配置,创建单独的Port。
USE_ATOMIC_SENDER_RECEIVER_INTERFACE:
USE_ATOMIC_NV_DATA_INTERFACE:
DcmDspDidUsed: 配置是否激活DID的使用,项目开发阶段可以使用,不用重复添加删除DID。
以上在配置Diagnostic->Diagnostic Data Identifiers时都会自动对应生成,所以在配置一个DID的时候关注最外层的配置界面即可。
这个容器包含RID的Info的配置,与DID配置不同,配置RID例程没有最外层的配置界面,只能在Basic Editor中进行配置。
DcmDspRoutineAuthorization:例程权限设置,设置规则、安全访问等级、会话权限。
DcmDspStartRoutineIn:启动例程的参数输入容器
DcmDspStartRoutineOut:启动例程的参数输出容器
DcmDspRoutineStopIn:结束例程的参数输入容器
DcmDspRoutineStopOut:结束例程的参数输出容器
DcmDspRoutineRequestRspIn:请求例程结果的参数输入容器
DcmDspRoutineRequestRspOut:请求例程结果的参数输出容器
DcmDspRoutineSignalEndianness:例程信号的字节序
DcmDspRoutineSignalLength:例程信号数据的长度(bit)
DcmDspRoutineSignalPos:例程信号数据的位置(偏移量)(bit)
DcmDspRoutineSignalType:例程信号数据的类型
这个容器包含RID的配置
DcmDspRequestResultsRoutineFnc:指定例程请求结果的函数名。若不为空,Dcm会调用该接口,反之Dcm会调用RTE接口。
DcmDspRequestResultsRoutineSupported:该例程是否支持STOP操作。若设置false,Dcm接收例程请求结果(3103)操作时会返回NRC12。
DcmDspRoutineFixedLength:例程是否固定长度
DcmDspRoutineIdentifier:例程ID
DcmDspRoutineInfoByte:
DcmDspRoutineInfoRef:指定的例程信息
DcmDspRoutineSystemTemplateDiagnosticRoutineRef:
DcmDspRoutineUsePort:Dcm使用“RoutineServices_
DcmDspRoutineUsed:是否使用该例程。若禁用,例程将不使用Dcm生成的代码
DcmDspStartRoutineFnc:启动例程时调用的函数名。若不为空,Dcm在启动例程时会调用该函数
DcmDspStopRoutineFnc:结束例程时调用的函数名。若不为空,Dcm在结束例程时会调用该函数
DcmDspStopRoutineSupported:该例程是否支持STOP操作。若设置false,Dcm接收stop操作(3102)时会返回NRC12。
这个容器包含通信控制的配置
DcmDspAllComMChannelRef:配置引用CAN通道,根据需求,可配置多个通道。
(1)接下来我们介绍下DCM如何通知BSWM模块的通信控制的。
Autosar代码中有这12中通道配置。控制应用报文、网络管理,以及RX和TX。
Bswm模块制定相应的规则来控制CAN的收发功能。
举例:
上图中CANA应用报文的TX规则:接收到“DCM_DISABLE_RX_TX_NORMAL”和“DCM_DISABLE_RX_TX_NORM_NM”就关闭CANA应用报文的TX功能,反之开启CANA应用报文的TX功能。
这个容器包含DTC开关控制的配置
DcmDspControlDTCSettingReEnableModeRuleRef:控制重启DTC设置的规则。如果设置,Dcm会在DisableDTCSetting请求开始的时候监控,如果不满足规则,Dcm会自动启动DTC。
DcmSupportDTCSettingControlOptionRecord:指定是否支持DTC group参数。若设置false,Dcm接收带有DTC group参数的请求时直接拒绝;反之,Dcm接收85服务时可带DTC group参数。
例如IFC项目中默认配置下也可以支持85 01/02, 但是IDC项目中就必须加上DTC Group,所以IDC就需要将配置勾选取消。
这个容器包含安全访问的配置
DcmDspSecurityBypassEnabled:安全访问是否支持Bypass模式。
DcmDspSecurityResetAttemptCounterOnTimeout:延时计时器到期时Dcm是否复位安全尝试计数器。
DcmDspSecuritySingleInstanceAttemptMonitor:安全访问是否使用同一个尝试计数器。若位置true,所有的DcmDspSecurityRows共用一个安全尝试计数器;反之,每个DcmDspSecurityRows都单独使用一个安全尝试计数器。
DcmDspSecuritySingleInstanceDelayTimer:安全访问是否使用同一个计时器。同上。
DcmDspSecurityADRSize
DcmDspSecurityAttemptCounterEnabled:安全尝试计数是否支持外部存储。若设置true,Dcm调用读写尝试计数器的API接口;反之,Dcm在初始化的时候清空这个安全访问等级的尝试计数器
DcmDspSecurityCompareKeyFnc:秘钥比较函数。当DcmDspSecurityUsePort设置为USE_ASYNCH_FNC时,Dcm会调用该函数。
DcmDspSecurityDelayTime:安全访问延迟时间。在延迟期间,Dcm不会接收任何安全访问请求。Dcm只有在失败尝试次数达到设置次数之后才会配置该时间。
DcmDspSecurityDelayTimeOnBoot:Dcm在上电周期内的延迟时间。在延迟期间,Dcm不会接收任何安全访问请求。若设置非0,Dcm从初始化后的这段时间会拒绝任何安全访问请求。
DcmDspSecurityDelayTimeOnFailedGetAttemptCounter:设置获取尝试次数失败后的延迟时间。
若不设置,Dcm获取失败后直接将计数清0,接收安全访问请求;
若设置为0,Dcm会一直等待获取尝试次数的结果,在此期间拒绝任何安全访问请求;
若设置不为0,Dcm会在这段时间内等待获取尝试次数的结果,在此期间拒绝任何安全访问请求,若超时,回复NRC响应(商榷)。
DcmDspSecurityGetAttemptCounterFnc:获取尝试次数的函数名。Dcm初始化时重载尝试计数器。
DcmDspSecurityGetSeedFnc:获取种子函数。当DcmDspSecurityUsePort设置为USE_ASYNCH_FNC时,Dcm会调用该函数。
DcmDspSecurityKeySize:安全访问密钥长度。
DcmDspSecurityLevel:安全访问等级。
DcmDspSecurityNumAttDelay:安全访问尝试次数。若设置大于0,尝试失败的次数超过该值时返回NRC36;若设置等于0,不限失败尝试次数。
DcmDspSecuritySeedSize:安全访问种子长度。
DcmDspSecuritySetAttemptCounterFnc:修改安全访问尝试次数的函数。
DcmDspSecurityUsePort:安全访问类型。USE_ASYNCH_CLIENT_SERVER:Dcm使用P-port接口(SecurityAccess_{SecurityLevel}函数)访问;USE_ASYNCH_FNC:Dcm直接调用DcmDspSecurityGetSeedFnc和DcmDspSecurityCompareKeyFnc自定义函数访问。
对于每个安全级别,服务 0x27 应始终有一对对应的子服务:
- 一个用于“获取种子”操作,具有奇数的子服务标识符值(例如 0x01);
- 一个用于“发送密钥”操作,其偶数子服务标识符值等于“获取种子”+1(例如 0x02);
参数值应始终与服务 0x27 配置容器的DcmDsdSubServices 中“get seed/send-key”对的Subfunction Id匹配:SecurityLevel = (
比如内部安全解锁等级为27 61,那Subfunction Id为0x61(Hex), DcmDspSecurityLevel为49(Dec)。
这个容器包含会话控制的配置
DcmDspSessionForBoot:定义切换会话是否跳转到Boot。DCM_NO_BOOT:不跳转Boot;
DCM_SYS_BOOT:xxx; DCM_SYS_BOOT:xxx (有何区别)。
DcmDspSessionLevel:指定相应诊断会话的值
DcmDspSessionP2ServerMax:指定诊断会话的 P2 时间(以秒为单位)。
DcmDspSessionP2StarServerMax指定诊断会话的 P2* 时间(以秒为单位)。
以上是DSP子模块通用容器配置,我们仅仅用到其中一部分配置,很多配置还需具体实践。