0%

AUTOSAR Wdg Stack 架构

Wdg 功能

看门狗/Wdg模块是一个独立的定时器,它的作用是提供安全功能以确保软件按计划执行,并且CPU不会陷入无限循环或执行意外的代码。如果Wdg模块在一定时间内未被触发/刷新/喂狗,它将复位MCU。

看门狗功能对于关键安全系统是必须的,对于非关键安全系统也是很有必要的。

对于汽车上使用的诸多零部件,鉴于汽车环境的恶劣,各类ECU中的软件均有可能遭受如外部电磁干扰,高温等环境因素的影响,从而导致程序“跑飞”或者“死机”现象,此时如果有看门狗的存在,便可以主动触发系统复位机制保证能够再次正常使用。

硬件看门狗

硬件看门狗依赖自身定时器来完成看门狗功能,俗称“硬狗”。常见的硬件看门狗比如MCU内部自带的看门狗、外部的独立看门狗。至于选用何种的硬件看门狗,取决于自身系统设计需要。

在使用硬件看门狗的时候需要特别考虑以下:

  • 该硬件看门狗的最大超时时间能否满足系统设计需求,如果该超时时间过小,就会导致整个系统的不稳定性,误触发看门狗。
  • 该硬件看门狗是否可以进行关闭,对于关键安全系统,一般都要求看门狗一旦打开将不允许被关闭。
  • 该硬件看门狗系统上电后默认处于开狗还是关狗状态,如果是默认开狗,那么对于软件而言,需考虑芯片上电后便要进行喂狗或者重置看门狗行为,同时设计一种在刷软件或者调试软件前的物理关狗动作。
  • 该硬件看门狗是采用哪种方式进行喂狗,如通过GPIO,IIC或SPI等通讯方式来喂狗。

UJA1078A手册:

img

img

软件看门狗

属于通过软件定时器的方式来实现看门狗功能,俗称“软狗”。软件看门狗的时基本质上也需要依赖硬件定时器。

比如常见的用systick作时基,通过一个task运行软狗监控的定时器不断递减,其他task程序则是重置软狗定时器,如果软狗监控的某个定时器归零,那么此时可以便可以判断其他task并没有被正常的执行,此时便可以通过主动复位的方式来实现看门狗功能。

以上可实现软狗对多个task的监控,这是硬狗没有的功能。软狗除了实现硬狗timeout和window的两种模式,还可以实现其他模式,取决于软件,监控的花样更多。

一般而言,运行软狗的主任务的优先级不应设置比被监控的任务优先级低,所以软狗无法检测Hardfault中卡死的问题。软狗跟硬狗搭配在一起使用,可以解决硬狗监控模式单一、软狗执行优先级没被监控任务高的问题。

AUTOSAR Wdg 架构

内部分层

img

Watchdog Driver:用于实现针对硬件看门狗的寄存器操作与控制,可以分为MCU内部看门狗(Internal Watchdog)与外部看门狗(External Watchdog),该外部看门狗可以通过GPIO、IIC或SPI来实现喂狗。

Watchdog Interface:其主要功能则是为了实现上层Watchdog Manager与底层Watchdog Driver的连接,当然其连接的底层Watchdog Driver可以存在多个。

Watchdog Manager:作为整个看门狗协议栈中的服务层,主体功能就是为了负责整个程序执行的正确性,并触发相应的硬件看门狗的喂狗动作,扮演了整个监控的核心角色。

WdgM 依赖

img

img

AUTOSAR Wdg 基础知识

三种模式

在AUTOSAR架构中,针对Watchdog Driver而言,定义了看门狗控制模式存在如下三种模式:

  • Off Mode:表示看门狗关闭状态,对于关键安全系统,一般不能将其切换至Off状态,即一旦打开,将不能被关闭。
  • Slow Mode:表示看门狗的一个长时间喂狗窗口,该模式一般用于系统启动初始化过程中。
  • Fast Mode:表示看门狗的正常喂狗模式,该模式运用在系统正常运行的过程中。

AUTOSAR Wdg 各层功能

Wdg

Wdg通常有两种,一种是芯片内部自带的片内看门狗;还有一种是在芯片外部通过SPI这种接口连接的片外看门狗。MCAL只负责第一种片内看门狗,片内看门狗的特点是Wdg模块是直接访问相关硬件寄存器。片外看门狗属于板级设备抽象层负责,通常需要使用MCAL提供的其他模块(比如SPI等)来访问/控制外扩看门狗芯片,这种不能直接访问硬件寄存器。

部分flash不能在写的时候读取,所以该模块代码可以在RAM里面运行。比如在刷写Flash时,Wdg模块可能作为二进制文件里面的一部分在RAM上运行。(到底哪些部分需要放RAM?)

Wdg API

Wdg 驱动层,主要接口就三个,调用方式如下图:

img

  • wdg初始化:通过EcuM模块调用函数Wdg_Init来完成Watchdog的初始化配置。
  • 触发wdg喂狗:通过WdgM模块调用WdgIf模块提供的函数WdgIf_SetTriggerCondition来触发底层驱动进行喂狗(不是wdg真正的喂狗操作),并设置下次看门狗timeout时间。
  • 改变wdg模式:通过WdgM模块调用WdgIf模块提供的函数WdgIf_SetMode来实现看门狗模式的改变。

喂狗

在AUTOSAR之前的版本中,看门狗服务是由上层软件来调用,会导致一些问题:

  1. 很难保证针对窗口式看门狗严格的时间约束。新版对这部分做了优化,优化的基本思想是将用于维护看门狗硬件时序的服务与逻辑控制分开,触发看门狗的时基可以通过系统时钟(systick)来提供,而控制看门狗硬件的程序可直接在硬件定时器的中断函数里面实现,这样可确保满足窗口式看门狗的喂狗时间准确。
  2. 很难处理了快和慢两种模式。Wdg模块3种模式其中两种是Slow,Fast模式。很多时候应用层可能并不需要那么严格的时间监控,可能秒级的周期即可。但由于喂狗周期都是固定的且比较短,应用层不断去喂狗会导致性能下降,而且需要到处穿插喂狗函数。
  3. 应用软件频繁修改硬狗寄存器不安全。现在AUTOSAR实现方式,应用层调用喂狗函数(Wdg_SetTriggerCondition)并不是直接去操作硬件看门狗寄存器的,而是去喂软狗。真正喂硬狗靠硬件定时器,在定时器中断回调中判断软狗没问题才去操作硬狗寄存器。

看门狗驱动程序和硬狗操作之间的调用方式如下图:

img

WdgIf

和NvM下的MemIf功能相同,可以通过DeviceIndex区分要调用哪个Wdg Driver,可以用宏或函数实现,接口如下:

1
2
Std_ReturnType WdgIf_SetMode(uint8 DeviceIndex, WdgIf_ModeType WdgMode);
void WdgIf_SetTriggerCondition(uint8 DeviceIndex, uint16 Timeout);

WdgM

Watchdog Manager可以理解为一种应用层软狗机制,该软件机制监控的对象被称为监控实体(SupervisedEntity, SE),通过在每个监控实体中打上对应的检查点(Checkpoint, CP)监控程序是否正常。

WdgM中可以创建一个或多个SE,每个SE都有对应的SEID。
每个SE可以创建一个或多个CP,每个CP都有对应的CheckpointID。
每个SE可以选择一个监控方式,这个取决于具体的需求,监控方式可以分为如下三种:

  1. Alive Supervision: 用于监控周期性任务是否周期性运行。
  2. Deadline Supervision:用于监控事件型任务的运行时间是否超时。
  3. Logical Supervision: 用于监控任务的执行逻辑/时序是否正确。

每一个监控实体可以基于上述三种监控方式计算得出监控结果,被称为Local Status
当每一个监控实体的状态得到确定,那么整个MCU的监控结果便可以最终确定,这个最终确定的状态被称为Global Status

WdgM API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void WdgM_Init(const WdgM_ConfigType *ConfigPtr);

void WdgM_DeInit(void);

#if (WDGM_VERSION_INFO_API == STD_ON)
#define WdgM_GetVersionInfo(_vi) STD_GET_VERSION_INFO(_vi,WDGM)
#endif

Std_ReturnType WdgM_SetMode(WdgM_ModeType Mode);

Std_ReturnType WdgM_GetMode(WdgM_ModeType *Mode);

Std_ReturnType WdgM_CheckpointReached(WdgM_SupervisedEntityIdType SEID, WdgM_CheckpointIdType CheckpointID);

Std_ReturnType WdgM_GetLocalStatus(WdgM_SupervisedEntityIdType SEID, WdgM_LocalStatusType *Status);

Std_ReturnType WdgM_GetGlobalStatus(WdgM_GlobalStatusType *Status);

void WdgM_PerformReset(void);

Std_ReturnType WdgM_GetFirstExpiredSEID(WdgM_SupervisedEntityIdType *SEID);

void WdgM_MainFunction(void);

状态转移图

Figure 2: Local Supervision Status:

img

在从其他状态切换至WDGM_LOCAL_STATUS_EXPIRED状态时,Watchdog Manager提供一定的时间保留机制能够允许做一些特别的操作,如设置看门狗模式或者写入NvM数据,复位原因等。

Figure 3: Global Supervision Status:

img