文章目录
- 前言
- 工具配置
- 代码编写
- 总结
前言
项目开发过程中,诊断服务一般客户需求或系统需求都会有特定NRC(一般为NRC22-条件不满足),也就会有特定的条件,需要手动加代码实现。本文介绍ETAS工具中配置的接口及简单实现。
工具配置
对于每一个服务,及每个服务中的子服务,都可以配置对应的user函数。以10服务为例:
在Dcm-DcmConfigSet-DcmDsd-DcmDsdServiceTables中配置SessionControlClass中的选项DcmRbDsdSidTabUserModeRuleFnc,此处配置的为自定义函数名
如果不配置,默认使用DcmAppl_UserServiceModeRuleService函数。也可以在该函数中进行自定义逻辑的判断。
此处示例配置如下:
对于子服务来说:
如果不配置,默认生成的函数为DcmAppl_UserSubServiceModeRuleService
配置完后,生成BSW代码
代码编写
查看生成的代码,10服务的检查自定义函数,如下所示
1002服务的检查自定义函数,如下所示:
对应的函数接口:
extern Std_ReturnType Dcm_SessionControlClass_Check(Dcm_NegativeResponseCodeType * Nrc_u8, uint8 Sid_u8);
extern Std_ReturnType DcmAppl_UserServiceModeRuleService(Dcm_NegativeResponseCodeType * Nrc_u8, uint8 Sid_u8);
extern Std_ReturnType Dcm_Programming_SessionControl_Check(Dcm_NegativeResponseCodeType * Nrc_u8, uint8 Sid_u8, uint8 Subfunc_u8);
extern Std_ReturnType DcmAppl_UserSubServiceModeRuleService(Dcm_NegativeResponseCodeType * Nrc_u8, uint8 Sid_u8,uint8 Subfunc_u8);
由上述接口可以很清楚的看到,对于Service的检查,只有Service的ID作为输入,Nrc_u8是我们要输出的。而对于包含子服务的检查,则会传递Service的ID及子服务ID。
此处我们自定义的两个函数需要自己实现:
10服务的示例如下:
Std_ReturnType Dcm_SessionControlClass_Check(Dcm_NegativeResponseCodeType * Nrc_u8, uint8 Sid_u8)
{
Std_ReturnType retVal_u8 = E_OK;
*Nrc_u8= 0x00;
if(....) /* 此处增加自定义逻辑实现 */
{
*Nrc_u8 = 0x22;
}
return (retVal_u8);
}
此处无需判断Sid_u8,因为配置的是10服务的回调函数,肯定是10服务触发的。
1002服务的示例如下:
Std_ReturnType Dcm_Programming_SessionControl_Check(Dcm_NegativeResponseCodeType * Nrc_u8, uint8 Sid_u8,uint8 Subfunc_u8)
{
Std_ReturnType retVal_u8 = E_OK;
*Nrc_u8= 0x00;
return (retVal_u8);
}
此处无需判断Sid_u8及Subfunc_u8,因为配置的是1002服务的回调函数,肯定是1002服务触发的。
细心的同学可能发现了,如果不配置自定义函数,其实也会进默认的check函数,该函数也是由用户实现的。所以其实不管对于什么服务或子服务,都可以在默认的函数中进行判断,没必须要再单独生成一个函数了。示例如下:
Std_ReturnType DcmAppl_UserSubServiceModeRuleService(Dcm_NegativeResponseCodeType * Nrc_u8, uint8 Sid_u8,uint8 Subfunc_u8)
{
Std_ReturnType retVal_u8 = E_OK;
*Nrc_u8= 0x00;
if(((Sid_u8 == 0x10u && Subfunc_u8 == 0x02u) || (Sid_u8 == 0x11u && Subfunc_u8 == 0x01u) ) )
{
if(....) /* 此处增加自定义逻辑实现 */
{
*Nrc_u8 = 0x22;
}
}
return (retVal_u8);
}
总结
一般在1002跳转boot,1101复位等服务中,需要判断一些安全条件(例如车速,蓄电池电压),防止车辆出现不受控的情况。