前言
在客户需求中,需要实现当ECU处于非网络休眠状态,诊断请求将触发ECU网络请求而维持网络通信,在诊断响应完成后释放上述网络请求。该功能在Autosar中有对应实现。本文介绍ETAS软件中的实现路径。
Autosar定义
在Dcm标准中,有如下需求定义:
当ActiveDiagnostic处于DCM_COMM_ACTIVE,Dcm收到诊断请求激活时,会调用ComM_DCM_ActiveDiagnostic,使对应的网络的ComM进入Full Communication状态.之后Ecu就会主动发送网络管理报文,用来维持网络通信
ETAS代码实现
知道了标准中定义的函数接口ComM_DCM_ActiveDiagnostic,直接在代码中搜索相关函数调用
Dcm_ActiveDiagnosticState_en默认初始化为DCM_COMM_ACTIVE,在上层dcm中有接口函数Dcm_SetActiveDiagnostic设置是否激活该功能
Std_ReturnType Dcm_SetActiveDiagnostic(boolean active)
{
/* Multicore: No lock necessary as its an atomic operation .
* Also, the application has to take care of calling Dcm_SetActiveDiagnostic() before Dcm calls CheckActiveDiagnostics from RxIndication. */
/*Check if the data active parameter is set to True to call ComM_DCM_ActiveDiagnostic()*/
if(active != FALSE)
{
Dcm_ActiveDiagnosticState_en = DCM_COMM_ACTIVE;
}
else
{
Dcm_ActiveDiagnosticState_en = DCM_COMM_NOT_ACTIVE;
}
return(E_OK);
}
对应工具中的配置接口为
可以在应用SWC建立对应的Rport,map后即可调用该接口来开启或关闭该功能。因为默认是开启的,所以不需要使用该接口即可实现对应功能。
诊断协议栈中收到诊断报文,会进行调用Dcm_CheckActiveDiagnosticStatus函数进行判断
void Dcm_CheckActiveDiagnosticStatus(uint8 dataNetworkId)
{
/* Check the diagnostic state is active, then call the ComM_DCM_ActiveDiagnostic*/
if(Dcm_ActiveDiagnosticState_en == DCM_COMM_ACTIVE)
{
ComM_DCM_ActiveDiagnostic(dataNetworkId);
}
}
当Dcm_ActiveDiagnosticState_en为DCM_COMM_ACTIVE即调用ComM_DCM_ActiveDiagnostic进行请求网络
激活后置位DiagnosticRequestState_b,当diagnosticRequestState_b为TRUE时,ActiveRequest_b置TRUE,即可进行主动请求网络的动作。
总结
诊断报文请求网络管理报文的功能,在Autosar标准协议栈中应该都是默认支持的。但是项目之前的应用软件错误调用了Dcm_SetActiveDiagnostic接口,导致功能无法实现。所以,任何不清楚目的的函数调用,都要格外小心,有可能导致一个bug!