目录
在前面 《分层软件架构_内容详解》文中,简要介绍了CP_AUTOSAR 通讯服务(Communication Services)所包含的内容块,本文将对通信服务中的DCM(诊断通信模块)的功能、接口函数(API)和 Dcm 配置进行展开介绍。
1、DCM 功能介绍
DCM (Diagnostic Communication Manager,诊断通信管理)模块在 AUTOSAR软件分层架构中处于通信服务层(Communication Services),在 PDU Router 模块的上方,具体位置见下图中黄框部分。
DCM 模块不依赖于网络,所有的网络相关功能都在 DCM 模块之外处理完成,而 PduR 模块可以提供不依赖于网络的一些接口给 DCM 模块。DCM 模块的主要功能如下:
1、负责处理来自于诊断工具的诊断报文(遵循 UDS 服务和 OBD服务协议规范);
2、处理诊断会话、管理诊断服务的安全等级;
3、OTA功能;
在软件开发过程、ECU 制造过程以及售后服务中,用户可借助于外部诊断工具通过 DCM 模块实现一些指定的诊断服务,DCM 模块支持UDS(Unified Diagnostic Services)和 OBD(On-Board Diagnostics)协议。外部诊断工具和 AUTOSAR 应用程序之间的通信见下图。
2、DCM 模块交互图
DCM 模块与底层软件模块、SW-Cs之间的交互图,如下图所示:
与 DEM 模块之间的关系:DEM 模块提供获取/清除故障的函数(UDS中0x19服务/0x14服务),DCM 模块对上位机的请求进行响应;
与 PduR 模块之间的关系:PduR 模块提供发送和接收诊断数据的函数;
与 ComM 模块之间的关系:ComM 模块提供给 DCM 模块显示诊断通信状态(active/inactive)的函数,DCM 模块提供处理通信请求(Full-/ Silent-/ No-Communication)的功能。而且,ComM 模块请求开启和关闭诊断通信,DCM 模块应提供对应的功能;
与 SW-C和RTE 模块之间的关系:DCM 模块分析接收到的诊断请求数据,处理与诊断通信相关的功能(如诊断协议和时序)。基于对请求数据流的分析,DCM 模块将例程或者 IO 控制执行交给 SW-Cs;
与 BswM 模块之间的关系:如果 DCM 模块初始化为从 bootloader 中跳转的顺序,那么 DCM 模块需要通知 BswM 模块应用程序已经被更新了。DCM 模块通知 BswM 模块通讯模式的改变。
与 Crypto Service Manager(Csm) 模块之间的关系:Csm(加密服务模块)提供加密算法,保证授权类的计算;
与 Key Manager (KeyM) 模块之间的关系:KeyM 管理模块支持证书处理和APIs,来实现一些诊断所需要的证书;
3、功能详述
3.1、Security Events
[SWS_Dcm_01589]:如果安全事件汇报功能(DcmEnableSecurityEventReporting = true)开启,相应的安全事件应该通过定义在 AUTOSAR_SWS_BSWGeneral 中的接口函数来汇报给 IdsM。
[SWS_Dcm_01589],DCM 模块的安全事件,在下表中出现的UDS 诊断服务的介绍可以参考文档《UDS诊断服务总列表》。
Name | 描述 | ID |
---|---|---|
DIAG_SEV_WRITE_INVALID_DATA | 上位机使用 0x2E 服务写入无效信息; | 23 |
DIAG_SEV_SECURITY_ACCESS_DENIED | 上位机发送了没有满足ECU安全等级需求的服务,应该应答 NRC 0x33(securityAccessDenied); | 24 |
DIAG_SEV_COMMUNICATION_CONTROL_SWITCHED_OFF | 上位机使用 0x28 (通讯控制服务)关闭了 ECU 通讯; | 25 |
DIAG_SEV_SERVICE_NOT_SUPPORTED | 诊断服务请求不支持(NRC 0x11 serviceNotSupported),或者是在当前会话下不支持(NRC 0x7F serviceNotSupportedInActiveSession); | 26 |
DIAG_SEV_SUBFUNCTION_NOT_SUPPORTED | 诊断服务不支持所请求的子函数(subfunction); | 27 |
DIAG_SEV_INCORRECT_MESSAGE_LENGTH_OR_FORMAT | 请求消息不满足指定的长度或者参数格式(NRC 0x13 incorrectMessageLengthOrInvalidFormat); | 28 |
DIAG_SEV_REQUEST_SEQUENCE_ERROR | 接收的诊断服务顺序错误(NRC 0x24 incorrectMessageLengthOrInvalidFormat); | 29 |
DIAG_SEV_REQUEST_OUT_OF_RANGE | 诊断请求的参数超出允许范围(NRC 0x31 requestOutOfRange) | 30 |
DIAG_SEV_REQUESTED_ACTIONS_REQUIRES_AUTHENTICATION | 收到诊断请求,但未给出执行此服务所需的身份验证。NRC 0x34 authenticationRequired | 31 |
DIAG_SEV_SECURITY_ACCESS_NUMBER_OF_ATTEMPTS_EXCEEDED | 安全访问失败并且无效的访问次数超出了范围(NRC 0x36 exceedNumberOfAttempts) | 32 |
DIAG_SEV_SECURITY_ACCESS_INVALID_KEY | 由于上位机发送了无效的密钥给 ECU 导致安全访问失败(NRC 0x35 invalidKey) | 33 |
DIAG_SEV_SECURITY_ACCESS_REQUIRED_TIME_DELAY_NOT_EXPIRED | 在延时时间过期之前,尝试解锁ECU(NRC 0x37 requiredTimeDelayNotExpired) | 34 |
DIAG_SEV_NUMBER_OF_FAILED_AUTHENTICATION_ATTEMPTS_EXCEEDED | 授权尝试的次数 | 35 |
DIAG_SEV_CERTIFICATE_FAILURE | 上位机尝试使用无效的证书进行身份验证 | 36 |
DIAG_SEV_ECU_UNLOCK_SUCCESSFUL | 成功解锁 ECU(通过 0x27 服务) | 37 |
DIAG_SEV_AUTHENTICATION_SUCCESSFUL | 成功授权(0x29 服务) | 38 |
DIAG_SEV_CLEAR_DTC_SUCCESSFUL | 0x14 服务清除 DTC 信息 | 39 |
DIAG_SEV_ECU_RESET | 0x11 服务重启 ECU | 40 |
DIAG_SEV_WRITE_DATA | 0x2E 服务清除 DTC 信息 | 41 |
DIAG_SEV_REQUEST_DOWNLOAD | 0x14 服务清除 DTC 信息 | 42 |
DIAG_SEV_DTC_SETTING_SWITCHED_OFF | 0x14 服务清除 DTC 信息 | 43 |
3.2、Error Classification
该部分描述了 DCM 模块如何处理在生命周期内发生的错误类别。
[SWS_Dcm_00044]:所有的错误类型的值都应该是独一无二的。
[SWS_Dcm_00040]:
3.2.1、Development Errors
DCM 模块可以检测出以下这些错误和异常,其取决于编译版本(开发/生产模式);
错误类型 | 相关的错误码 | 错误值 |
---|---|---|
DCM 模块正在被一个带有无效输入参数值调用,或者是DCM 模块被一个函数调用并且这个函数返回了无效的输出参数值; | DCM_E_INVALID_VALUE | 0x02 |
接口返回值超出范围 | DCM_E_INVALID_VALUE | 0x02 |
内部:DCM 模块未初始化 | DCM_E_INVALID_VALUE | 0x05 |
DCM 模块 API 函数带有无效的输入参数 | DCM_E_INVALID_VALUE | 0x06 |
DCM 模块 API 服务使用空指针作为参数 | DCM_E_INVALID_VALUE | 0x07 |
DCM 模块安装失效 | DCM_E_INVALID_VALUE | 0x08 |
存储 ProgConditions 失效 | DCM_E_INVALID_VALUE | 0x09 |
3.2.2、Runtime Errors
DCM 模块可以检测出以下这些错误和异常,其取决于编译版本(开发/生产模式);
错误类型 | 相关的错误码 | 错误值 |
---|---|---|
接口:与另一个模块交互过程中发生超时; | DCM_E_INTERFACE_TIMEOUT | 0x01 |
接口:与另一个模块(APP/DEM/PduR等)交互过程中,DCM 模块检测缓存的边界失败了; | DCM_E_INTERFACE_BUFFER_OVERFLOW | 0x03 |