AUTOSAR DET模块解析

作者:Stephen Du

免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性。复制/转发请注明来源/作者。

欢迎添加微信交流学习。

在这里插入图片描述

AUTOSAR DET模块解析

参考文档: AUTOSAR_SWS_DefaultErrorTracer.pdf/AUTOSAR_SWS_DevelopmentErrorTracer.pdf

DET的文档有些版本归类到诊断(Diagnostics)下面,有些版本归类到系统服务(SystemServices)下面。关于这个问题也是我个人最困惑、吐槽的地方。很多文档官网一直在变更。

1. 简介

DET模块虽然表面上看起来不复杂(其实也复杂,见后文),但是有一点毋庸置疑,他的使用率非常的高,几乎所有模块都会使用它,不光包含BSW(Basic software modules),SWC(Software Components)依然会使用。也许你和我一样,看到陌生的缩写第一反应会问这是什么缩写,关于这个模块的缩写是个有趣的事情,本文后面会详细介绍。我们先大概说说这个模块干嘛的,简单来说你可以理解为一个错误检测/追踪/管理模块,如果你是一个从事或熟悉测试相关工作,你还可以理解为里面的断言(assert)。当然DET模块的功能远比断言要强大,断言可以是DET的其中一个功能,你可以先这样理解,有一个大概概念。

现在来说说DET到底是什么缩写?

在4.2版本以前(不含),DET(Development Error Tracer),开发错误追踪器。显然,其名字已经非常明确了它的定位,就是开发阶段的开发错误追踪器,再直白点,简单来说对应代码(程序猿都喜欢直截了当谈代码?)一般就是对各个模块的函数参数进行检查或者上下文环境检测等,看看是否合法。比如你的参数是一个指针类型,看看是不是空指针;或者你的参数取值是否超过取值范围等等。

但是从4.2版本(含)开始,DET(Default Error Tracer)的角色发生了变化,其地位直奔高富帅。虽然DET还是DET,但已然不是曾经的DET了。一个词的变化意味着设计者对其的期望不一样啦。这里的Default不但包含了以前的Development,还新增了Runtime Error,Transient faults,Production errors,Extended production errors

按照我们通常的理解,以前的Development理论上其关注点就在开发阶段,那么测试完成release后理论上是可以将其关闭的,本身AUTOSAR的效率一直饱受病逅,关闭DET功能后也会提升很多效率。但是现在改为Default后,它不再是只关注开发阶段啦,运行时(Runtime)也要关注,所以我们就不能在发布时将其关闭了(当然,这里只是说从设计者的初衷至少是这样的,你非要关闭也可以,你的地盘你做主)。

由于每个功能函数/模块对错误检测/处理的需求不一样(视需求而定),所以这个模块和其他模块(如各外设模块)还有点区别,就是这个模块虽然提供了标准的API,但是并没有规定这些API里面具体需要干什么,完全由开发者/设计者来决定,比如你可以在函数里面做以下事情:

  • 当错误发生时,在里面设置调试断点让代码停下,以便调试。
  • 对错误进行计数。
  • 发生运行时错误后,使用默认值去替换以便能继续运行。
  • 记录(日志)调用(成功)及参数存到缓存(RAM),类似于(堆)栈信息。
  • 通过通信接口发送错误信息到外部以便分析。

以上是一些常用的可能的功能,你还可以根据实际需要在里面进行处理。

该模块对操作系统的内存保护机制同样也没有进行考虑。

虽然协议没有规定每个函数体具体需要实现什么,但是其规定了一些基本信息/规则/机制。对于某个发生的错误,你需要告诉DET模块这个错误是哪个模块发生的?哪个函数发生的?错误类型是什么?这几个信息是通过API参数规定好的。

比如:

Std_ReturnType Det_ReportError( uint16 ModuleId, uint8 InstanceId, uint8 ApiId, uint8 ErrorId )

除了这些,通常还包含下面这些功能:

  • 当报告一个错误时,Error_Hook列表将会被执行(也就是需要调用这些函数),这个Error_Hook列表是可配置的。
  • 在重置/复位后,允许对一些可选错误进行恢复以处理这些错误恢复信息及检索版本信息。

这些错误恢复信息是可选的,并且怎么使用以及其含义都是未定义的,根据客服需求来。

前面提到过DET的文档在某些版本是归类到诊断下面的,敏锐的你肯定会问,那肯定和诊断也有关系了。是的,DET模块与诊断关系非常紧密(本文不详述,会更新其他文档,请关注)。所以需要实现诊断模块的一些需求。除了诊断外,它还需要考虑SWS BSW General文档里面规定的一些需求。所以这么看下来,其实它一点都不简单。

2. 模块初始化

2.1 void Det_Init(const Det_ConfigType* ConfigPtr)

[SWS_Det_00019] DET模块必须提供Det_Init函数。

[SWS_Det_00020] Det_Init函数需要负责将DET模块设置为初始状态。

Det_Init函数什么时候被调用由EcuM模块的配置决定。

2.2 void Det_Start(void)

[SWS_Det_00025] DET模块必须提供Det_Start函数。

  1. 如果需要存储永久错误信息,在NVRAM模块初始化完成后,可以调用Det_Start函数来触发DET模块进行。
  2. 假如在启动过程中不需要调用DET,Det_Start函数可以为空。
  3. Det_Start函数是否会被调用,什么时候被调用,通过EcuM或ModeM模块的配置来决定。

3. 错误挂钩(Error_Hook)

[SWS_Det_00207] 为了在开发和运行时支持调试和错误跟踪,DET提供了通知功能,那就是Error_Hook,Error_Hook将用于转发错误通知,Error_Hook是可配置的。如果用户至少配置了一个Error_Hook,那么当DET收到错误报告后,将通过调用配置的Error_Hook来进行通知。

[SWS_Det_00035] 每个Error_Hook函数在被相关函数(Det_ReportError, Det_ReportTransientFault, Det_ReportRuntimeError)调用时,他们的参数集必须是一样的。这些配置的标注函数是ECU配置。(需要查询其他文档什么意思,待确认,后续更新)

4. 错误报告

[SWS_Det_00024] 如果在DET模块还没有初始化就调用相关错误报告函数,应该立即退出函数,不做任何处理,包括:不能调用Error_Hook,不报告错误信息,不执行任何功能。

[SWS_Det_00014] 错误报告函数(Det_ReportError, Det_ReportTransientFault, Det_ReportRuntimeError)应立即调用所有配置的Error_Hook函数。

[SWS_Det_00018] DET模块应该按照配置的先后顺利来执行这些Error_Hook。

[SWS_Det_00015] 可选功能只能在所有配置的Error_Hook函数执行后才被调用执行。这些可选功能通过预编译配置项(pre-compile-time)进行配置。

[SWS_Det_00034] 如果DLT模块有效/配置了,每个错误报告函数(Det_ReportError, Det_ReportTransientFault, Det_ReportRuntimeError)应该转发通知DLT(Diagnostic Log and Trace)模块,与是否配置了Error_Hook无关。

[SWS_Det_00039] Det_ReportError, Det_ReportTransientFault, Det_ReportRuntimeError函数必须可重入。

Det_ReportError函数实际上是永远不退出的(return),所以这里谈重入似乎意义不大,不知是否以后标准/协议文档会修改。

[SWS_Det_00026] 为了确保运行时错误和瞬时错误得到立即执行以及避免DET模块递归调用,Det_ReportError函数应停止整个过程的执行。

这里可能不好理解,要弄清楚这条需求的含义,需要理解这几个函数的责任范围。Det_ReportError函数负责处理开发相关错误,开发错误通常包含以下类型:

  • 软件漏洞(Bugs)导致的错误。
  • 用户集成不当造成的错误。
  • 无效配置造成的错误。
  • 集成工具的漏掉导致的错误。

可以看到,上述这些错误大部分都是危险系数很高的,所以在这些错误发生时,Det_ReportError函数必须让代码停下来不要去执行后面的正常程序流,否则可能会导致程序异常/崩溃。

那么怎么让程序停下来?比如你可以通过一个无限循环或暂停语句或通过创建类似异常堆栈跟踪的方式来完成。一句话,这个函数永远不会返回(return)。

如果我们不这样做,继续让其执行,那么除了上述说的会导致程序异常/崩溃外,可能还会触发运行时错误或瞬时错误。

如果我们通过Error_Hook函数调用一个未初始化的模块,这种情况下可能会发生递归调用,大家应该都知道递归调用的弊端,尤其是在嵌入式MCU系统中,很容易造成堆栈溢出。

这里就引入了一个问题,如果在中断函数里面掉了这个函数怎么办? 这的确是一个问题,需要开发者特别考虑。其实另外两个函数也有这个问题,因为这些错误报告函数还会调用配置的各个Error_Hook,所以需要考虑执行效率。

5. 错误通知

[SWS_Det_00052]DET本模块只包含/会报告一个错误,那就是Det_GetVersionInfo函数参数是空指针时,会报DET_E_PARAM_POINTER/0X01的开发错误给所有配置的Error_Hooks。

关于DET模块暂时写这么多,基本上包含了DET模块主要的东西。其余部分,如API,配置章节内容,如有需要,后续更新。

你可能感兴趣的:(AUTOSAR)