Classic AutoSAR Det 调试技巧
配置 Det 模块
配置 Det 模块分为两个部分:
- 添加 Det 模块本身
- 各模块的 Det 检测开关
添加打桩函数
我们可以选择不使用 Dlt,直接通过串口打印错误信息。
在 det.c 中找到 Det_ReportError() 这个函数,该函数的 4 个参数 ModuleId,InstanceId,ApiId,ErrorId 是 DET 最重要的信息。在该函数中打桩,将错误信息通过串口传出去:
void Det_ReportError(uint16 ModuleId, uint8 InstanceId, uint8 ApiId, uint8 ErrorId)
{
PrintStr("==ModuleId:%d InstanceId:%d ApiId:%d ErrorId:%d====\r\n", ModuleId, InstanceId, ApiId, ErrorId);
}
破译错误信息
ModuleId
在 AUTOSAR 架构里面,每个模块 ID 都是标准定义的,可以参考 AUTOSAR_TR_BSWModuleList.pdf 文件。根据下表可以知,ModuleId=51 对应模块就是 PDUR。
![[AUTOSAR_TR_BSWModuleList.pdf]]
ErrorId
其实 ErrorId 也是标准定义的,也可以在各个模块的标准内找到定义,但我们也可以用更便捷的方法:
- 打开 PUDR 模块的源码,找到 Det_ReportError 函数的所有调用,随便找到一个即可:
- 然后顺藤摸瓜,找到定义 PDUR_E_INVALID_REQUEST 的 .h 文件
- 我们是顺着 PDUR_E_INVALID_REQUEST 这个值点进来的,但是我们本例中的 ErrorId 是 2,是下面的 PDUR_E_PDU_ID_INVALID,这个宏定义和注释已经足够明确了,如果还不满足的话就在 PDUR 模块下搜索所有 PDUR_E_PDU_ID_INVALID。
- 搜索到 31个结果,这样显然是大海捞针,所以继续使用其他参数来进一步筛选。
InstanceId
用上面同样的方法,找到 InstanceId = 50。
找到 InstanceId = 50 且 ErrorId 是 2 的出处:
很明显就是这句话了,这就是产生 DET 的报错信息的代码,结合函数上下文就能对故障分析个大概了。如果还不够,就借助劳特巴赫等调试工具来定位问题: