最近要求把实现的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