Vector DavinciConfigurator系列——DCM

最近要求把实现的DCM功能配置理下,好不容易整理完,放在这便于有需要的同行交流学习吧。

DcmConfigSet

DcmPageBufferCfg

配置文件的变化:

Dcm_Cfg.h

Dcm_Lcfg.c

Dcm_Lcfg.h

Vector Dcm手册中有描述:8.25 How to Save RAM using Paged-Buffer for Large DIDs

Page-Buffer是用来处理大数据DID和19服务的,但此选项不影响DID的Page-Buffer功能,只影响19服务的支持。

如果想要配置大数据DID22服务的功能,需要按照手册这一节后面的配置方法对DcmDspDataUsePort进行配置。

这些选项和生成的标准服务函数都有关系,比如CheckConditionRead函数需要配置为USE_DATA_ASYNCH_CLIENT_SERVER/ USE_DATA_ASYNCH_FNC才能生成,出现OpStatus传参。

在Vector DCM手册中ConditionCheckRead(),

以此类推,若想知道其余几个配置项的作用,直接关键词搜索DCM手册即可。

DcmGeneral

此容器下我所整理的配置说明是个人筛选过认为较有意义的项目

Final Response To Fbl Enabled

配置使能与否带来的改变为

在代码中主要带来的影响是使能了Dcm_SetProgConditions和Dcm_GetProgConditions。

DcmForeignDiagnosticRequestDetectionEnabled

使能此项会PDUR会要求使能这两项,这两项定义为:

是否支持上下层模块调用Cancel接收或者发送

这个配置的功能可以理解成是否使能同个网络下其他ECU对本ECU的诊断取消功能,因此需要提前使能上面的Cancel功能。

定义:若启用此功能,Dcm将监控来自其关联客户端发送、但目标地址为网络上其他ECU的诊断请求。根据TP连接类型的不同,其效果是取消该客户端当前正在处理的所有任务。

DcmKeepAliveTime

(此处数值为Dcm Task Time的倍数)

Vector DCM手册中有应用实例 How to Extend the Diag Keep Alive Time during Diagnostics

其实这个参数就是多了一个定时器,ECU需要在达到这个时间后再进行休眠。(已向Vector求证过)

Vector:

目的:“DcmKeepAliveTime”(诊断通信保持激活时间)参数可确保诊断测试仪与电子控制单元(ECU)之间的通信保持活跃。如果正在运行诊断会话,该参数有助于防止电子控制单元进入低功耗状态或过早终止会话。

DcmMainFunctionWorkerTaskTime

使能后生成代码未看到变动。

描述:允许以秒为单位配置服务处理任务的时间。

作用: 该值用于设置Dcm服务描述(Service-Description)和BSW调度器。DCM的服务处理速度将取决于此设置,即在出现E_PENDING时DCM轮询应用程序的速度。 如果此参数缺失,但已启用拆分任务(即/Dcm/DcmConfigSet/DcmGeneral/DcmSplitTasksEnabled = TRUE),则将通/Dcm/DcmConfigSet/DcmGeneral/DcmTaskTime中指定的时间周期调用工作器任务。

DcmRequestManufacturerNotificationEnabled/DcmRequestSupplierNotificationEnabled

此配置选项主要是为了统一控制通知函数。

描述:如果您已配置了冗长的通知列表,但希望临时禁用某类通知(例如禁用所有制造商通知),则无需删除这些列表。只需通过设置对应的DCM配置参数,即可禁用该类型的通知功能。

在VectorDcm手册中How to Get Notified on a Diagnostic Service Execution Start and End有详细描述。

ResetToFblAfterSessionFinalResponseEnabled

这个选项比较特殊,默认是disable,disable时生成的宏是STD_ON,STD_ON的时候1002是由FBL回复的。

Respond All Request

如果启用(该功能),诊断通信管理模块(Dcm)将接受并处理任何请求的服务标识符。如果禁用(该功能),诊断通信管理模块会接受任何诊断服务标识符的接收操作,但不会处理属于区间 [0x40, 0x7F] 与 [0xC0, 0xFF] 范围内的任何(服务标识符)。

DcmSafeBswChecks

用于启用SilentBsw功能。可在DCM手册中查SlientBsw关键词。

Security Level Change Notification Enabled

在SA等级发生变化时,会调用生成的Notification函数。

DcmSenderReceiverPRPortsEnabled

使能这个选项,会为DID的读写及IO控制生成PR-Port。

禁用这个选项,会为DID的读写及IO控制生成P-Port和R-Port。

Note:在此处说明下,常用Port的区别,这里所谓的PR是一个大的集合的概念,一个提供,一个需求,囊括了诸如CS\SR Port等子集。

通俗易懂的,CS port就是通过这个接口要调一个函数去执行的,SR port仅仅是数据的传输(可以理解成一个高级的全局变量)。

State Recovery After Reset Enabled

使能这个选项,能够在ECU重新上电后恢复例如会话状态、安全等级等状态。

在DCM手册How to Recover DCM State Context on ECU Reset/Power On有详细描述。

DcmSuppressResponseOnCanTpFuncMixedAddrRequests

使能该选项后,将不回复混合寻址的请求。

DcmDsd

DcmDsdServiceTable

DcmDsdService
DcmDsdSidTabFnc

在这个选项中填上内容后,可以自定义该服务,生成的代码如图。

详情可以参见DCM手册_()

DcmDsdSidTabModeRuleRef

若在此处引用了任何模式规则,则当模式规则条件未满足时,Dcm将自动拒绝接收到的该服务所有请求。

这个规则可以参考BswM中的规则,

Dsd Sid Tab Service Dispatcher

此选项需要在DcmDsdSidTabFnc使能的情况下使能,否则会报错。

此选项决定了DcmDsdSidTabFnc定义的函数是以什么方式,选项设置为TRUE时,诊断服务的任何接收到的请求都会通过调用call-out来分派,服务处理会在内部或外部进行。

在Vector DCM手册How to Support Diagnostic Service Dispatching中有相应描述。

Vector FAE 描述

当使能Dispatcher后,需要用户自行实现Callout Dcm_HandleServiceExtern()。如果用户通过该Callout返回FALSE,则诊断处理继续由Dcm接管,反之则需要通过DcmDsdSidTabFnc中配置的用户函数处理。 

从外部和内部调用的区别是由Dcm自己处理相应的诊断服务或者由用户自行实现诊断服务处理。代码执行中的具体区别是在Dcm_RepeaterExecute()中调用pServiceInfo->ProcFunc(Dcm处理)或者pServiceInfo->AltProcFunc(用户处理)。 

从外部调用不会直接导致问题,但如果用户自定义的服务处理存在问题或者没有正确给出返回值、写入参数,可能会导致Dcm无法正常处理或者诊断响应异常。如果由于用户的诊断处理函数实现不当而造成问题,并没有特定给的保护机制。对于Dcm模块而言,将把用户给出的数据作为“正常”数据进行处理,但无法预测用户的实现可能会导致的具体问题。所以建议使用用户自行实现诊断处理时,对照比较对应的pServiceInfo->ProcFunc处理函数对于返回值和参数的使用方式进行实现。 

实际就是使能Dispatcher就多个判断条件,使能则利用Dcm_HandleServiceExtern多做一层判断,满足就跑第二列里的alternative函数,不满足就跑第一列dcm的函数。

DcmDsdServiceRoleRef

这个选项仅适用于0x29 Authentication认证服务,可以理解为另一种安全访问。

DcmDsdSidTabSecurityLevelRef

顾名思义,安全访问等级的引用

DcmDsdSidTabSessionLevelRef

顾名思义,会话的引用

DcmDsdSidTabVehicleSystemGroupRef

车辆系统组的引用

DcmDsl

DcmDslBuffers

DcmDslBufferSize

这个buffersize的最小值由长度最大的did决定,若不满足,则在生成代码前的校验过程中会提示错误。

DcmDslCallbackDCMRequestService

可以配置一个StartProtocol函数,用于请求开始一个新的诊断协议。

举个实例:

若我们的uds升级和ota升级用的不是两条报文,而是一条报文,何时开始uds何时开始ota,即可由此处定义。

DcmDslServiceRequestManufacturerNotifications

在此处新建Confirmation和Indication函数,会生成两个Callout函数,在访问DCM前,先访问Callout函数,决定是否由DCM处理或是由我们自定义处理。

举个实例:

部分项目中,FOTA功能有些DID并非由DCM及诊断应用层决定,而是由FOTA的模块决定的,那么其实在收到比如读FOTA DID后,不应转发到DCM,而由FOTA中的模块直接赋值。

Vector的代码中vFota_Service中有体现。

DcmDslDiagResp

DcmDslDiagRespMaxNumOfDeclinedRequests

多个诊断客户端处理的上限数量?

DcmDslDiagRespMaxNumRespPend

最多回多少个78,达到上限后回NRC0x10

DcmDslDiagRespOnSecondDeclinedRequest

是否会对第二个诊断客户端进行回复,若使能,对任何第二个诊断客户端都回复nrc21.

DcmDslDiagRespPeriodicMsgPaddingPattern

是否对回复进行填充

DcmDslProtocol
DcmDslProtocolRow
DcmDslProtocolID

选择不同的DCM协议

DcmDslProtocolPriority

诊断客户端的优先级

参见Vector DCM手册How and When to Configure Multiple Protocols

DcmSendRespPendOnRestart

1002和11服务的正响应发送的时机,使能则在跳地址之前。

DcmTimStrP2ServerAdjust

这个配置相当于对P2Server进行了调整,调整至为原先的P2Server值减去配置值,以确保ECU在到达P2Server前能进行响应。

原文描述:This parameter is used to guarantee that the DCM response is available on the bus before reaching P2.

DcmDsp

携带DID的数据,一般由cdd导入candela生成,不需要手动配置。

DcmDspDataInfo

一个DID的数据信息。

DcmDspDatas

DID数据的从属信息。

DcmDspDataBlockIdRef

配置后did从相应的NvMBlock中读或写,但是需要did的长度与nvmnlock的长度相匹配。

但是我配置后生成的代码无差异,还需要和Vector确认。

DcmDspDataConditionCheckReadFnc

自定义check condition函数

DcmDspDataConstantValue

将汇报出去的DID值设为某固定常值,并不再使用port。

DcmDspDataEndianness

数据大小端

DcmDspDataReadDataLengthFnc

生成一个callout函数汇报did的长度。

DcmDspDataReadFnc

自定义一个read函数

DcmDspDataSize

数据长度

DcmDspDataUsePort

选择数据访问方式。

选择情况较为复杂,在VectorDCM手册中直接搜关键词可以获得相关配置说明。

DcmDspDidInfo

携带DID的ID信息,主要是会话权限,是否支持读写,读写在什么安全等级什么会话下支持之类的配置。一般由cdd导入candela生成,不需要手动配置。

DcmDspDidRange

决定了DID的高低位范围。

DcmDspDid

确定各个DID的ID信息、与DidInfo的引用关系、是否使能以及使用的PORT的类型。一般由cdd导入candela生成,不需要手动配置。

DcmDspRoutineInfo

新建历程的信息,需要什么子服务,比如开始历程,结束历程,结果请求。

并且在此处定义请求历程的格式,历程回复的格式。

例如,这个RequestResultOut(31 03)中对回复的结果进行了设置,例如回复的0-7个bit为RoutineInfo,8-15个bit为StatusFlag,即回复的格式为71 03 02 A0(RID) xx(RoutineInfo)xx(StatusFlag)

例如这个StartRountineIn(31 01),请求的格式为31 01 02 A0 XX(FotaStatus)

DcmDspRoutines

DcmDspRequestResultsRoutineFnc

定义具体执行3103历程的函数。

DcmDspStartRoutineFnc

定义具体执行3101历程的函数。

DcmDspStopRoutineFnc

定义具体执行3102历程的函数

DcmDspRoutineIdentifier

定义了历程的RID。

ComControl

用于28服务的配置。

DcmDspFaultMemory

配置用于19服务的快照信息的recordID

DcmDspSecurity

DcmDspSecurityBypassEnabled

安全旁路功能,使能该功能能够绕开安全访问,相当于禁用了安全访问的功能,一直保持解密的状态。

详见Vector DCM手册 8.44 How to Support Bypass Mode for Security-Access

DcmDspSecurityResetAttemptCounterOnTimeout

惩罚时间到了之后,错误次数是否需要清零。

DcmDspSecuritySingleInstanceAttemptMonitor

是否多个安全等级共用同一个计数器。

DcmDspSecuritySingleInstanceDelayTimer

是否多个安全等级共用同一个惩罚时间。

DcmDspSecurityCallback

自定义一个notification函数在进行安全访问时调用。

DcmDspSecurityAttemptCounterEnabled

使能计数器

DcmDspSecurityDelayTime

惩罚时间长度

DcmDspSecurityDelayTimeOnFailedGetAttemptCounter

当获取安全尝试次数的接口(GetSecurityAttemptCounter)返回值失效时,该参数用于设定Dcm在此时间段(以秒为单位)内拒绝受理任何安全访问请求的延迟时长。

DcmDspSecurityGetAttemptCounterFnc

自定义获取计数器的函数

DcmDspSecurityGetSeedFnc

自定义获取种子的函数

DcmDspSecurityKeySize

钥匙长度

DcmDspSecurityNumAttDelay

计数器上限

DcmDspSecuritySeedSize

种子长度

DcmDspSecuritySetAttemptCounterFnc

自定义计数器赋值的函数

DcmDspSecurityUsePort

安全访问使用的port配置

DcmDspSession

DcmDspSessionCallback

自定义一个Notification函数,在访问10服务时调用。

DcmDspSessionRow
DcmDspSessionForBoot

是否是Boot会话

DcmDspSessionLevel

子服务名称,例如1001 这里填1,1002填2,1042填0x42即66.

DcmDspSessionP2ServerMax

该会话的P2Server

DcmDspSessionP2StarServerMax

该会话的P2*Server

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值