看门狗驱动程序 Wdg 通过四个同步服务控制看门狗硬件:Wdg_Init、Wdg_SetMode、Wdg_SetTriggerCondition 和 Wdg_GetVersionInfo([SWS_Wdg_00106] , [SWS_Wdg_00107] , [SWS_Wdg_00155] , [SWS_Wdg_00109] )。EcuM 调用 Wdg_Init。Watchdog Manager 仅通过 Watchdog Interface 访问驱动程序,后者通过 DeviceIndex 选择实例(SWS WdgIf 第17页 )。内部实例直接访问硬件,外部实例通过 SPI 或 DIO 访问([SWS_Wdg_00161] , [SWS_Wdg_00076] )。两者提供相同的 API [SWS_Wdg_00077] 。
kontext
cluster_wdg
Wdg-Instanzen (Namen je Instanz erweitert)
EcuM
EcuM
(ECU State Manager)
WdgInt
Wdg
(interner Watchdog)
EcuM->WdgInt
Wdg_Init
WdgExt
Wdg
(externer Watchdog)
EcuM->WdgExt
Wdg_Init
WdgM
WdgM
(Watchdog Manager)
WdgIf
WdgIf
(Watchdog Interface)
Auswahl per DeviceIndex
WdgM->WdgIf
WdgIf_SetMode
WdgIf_SetTriggerCondition
WdgIf->WdgInt
Wdg_SetMode
Wdg_SetTriggerCondition
WdgIf->WdgExt
Wdg_SetMode
Wdg_SetTriggerCondition
HwInt
interne
Watchdog-Hardware
WdgInt->HwInt
direkter Zugriff
Det
Det
(optional)
WdgInt->Det
Det_ReportError
Dem
Dem
(可选)
WdgInt->Dem
Dem_SetEventStatus
SpiDio
Spi / Dio
(处理程序或驱动程序)
WdgExt->SpiDio
处理程序/驱动程序的 API
WdgExt->Det
Det_ReportError
WdgExt->Dem
Dem_SetEventStatus
HwExt
externe
Watchdog-Hardware
SpiDio->HwExt
总线或引脚访问
上下文图:EcuM 初始化 Wdg 实例,WdgM 通过 WdgIf 对其进行控制。外部实例通过 Spi/Dio 访问硬件。来源:[SWS_Wdg_00076] , [SWS_Wdg_00161] , SWS WdgM 第86页
该模块的核心是触发条件。它被视为在接下来的 n 毫秒内对看门狗进行服务的许可。只要它有效,驱动程序就会自行触发;此后看门狗将超时溢出 [SWS_Wdg_00144] 。Wdg_SetTriggerCondition 重置计数器,并根据模式将毫秒转换为计数器值([SWS_Wdg_00136] , [SWS_Wdg_00139] )。内部服务例程在计数器大于零时进行触发并递减。计数器为零时不再触发([SWS_Wdg_00134] , [SWS_Wdg_00135] )。超时时间为 0 会强制执行(近乎)立即的复位,且已过期的计数器无法重新加载 [SWS_Wdg_00140] 。
通过触发条件解耦触发 WdgM WdgIf Wdg Timer-Hardware Watchdog-Hardware Use Case: Triggerbedingung erneuern WdgIf_SetTriggerCondition(DeviceIndex, Timeout) Wdg_SetTriggerCondition(timeout) 重置触发计数器 返回 返回 Use Case: 驱动中的服务处理 loop je Timer-Interrupt Interrupt alt 触发计数器 > 0 递减触发计数器 Hardware triggern (必要时附带激活码) 触发计数器 = 0 未触发:看门狗超时 并复位 ECU
时序图:WdgM 仅重新加载计数器,触发操作由驱动程序中的定时器中断发起。当计数器值为 0 时,看门狗超时溢出。来源:SWS Wdg 图 9.2 第31页 , [SWS_Wdg_00134] , [SWS_Wdg_00135]
Wdg_Init 从配置集 Wdg_ConfigType [SWS_Wdg_00001] 中设置默认模式和超时周期。Wdg_SetMode 在 WDGIF_OFF_MODE、WDGIF_SLOW_MODE 和 WDGIF_FAST_MODE 之间切换,并且仅在完全切换时返回 E_OK([SWS_Wdg_00160] , [SWS_Wdg_00103] )。不存在去初始化操作。关闭通过 OFF 模式 [SWS_Wdg_00031] 进行,且仅在 WdgDisableAllowed 允许时才能执行 [SWS_Wdg_00025] 。
出现错误时,Wdg 会报告开发错误 WDG_E_DRIVER_STATE、WDG_E_PARAM_MODE、WDG_E_PARAM_CONFIG 和 WDG_E_PARAM_TIMEOUT [SWS_Wdg_00010] 。此外还有生产错误 WDG_E_MODE_FAILED 和 WDG_E_DISABLE_REJECTED([SWS_Wdg_00016] , [SWS_Wdg_00179] )。推测这些生产错误通过 Dem_SetEventStatus 报告 [SWS_Wdg_00111] 。 问题 Q-f0ec41b842ebbdc9 (未决)
更多 ›
在看门狗协议栈中的角色:自行负责触发操作的驱动程序
看门狗驱动程序 Wdg 通过包含四个服务的紧凑同步 API 控制看门狗硬件,这些服务均可通过 Wdg.h 获得:Wdg_Init(服务 ID 0x00)、Wdg_SetMode(0x01)、Wdg_SetTriggerCondition(0x03)和 Wdg_GetVersionInfo(0x04)。仅 Wdg_GetVersionInfo 是可重入的([SWS_Wdg_00106] , [SWS_Wdg_00107] , [SWS_Wdg_00155] , [SWS_Wdg_00109] )。特意未提供用于去初始化的接口。如果硬件和环境允许关闭,则通过带有 OFF 模式的 Wdg_SetMode [SWS_Wdg_00031] 来执行。
这些服务由基础软件调用。ECU State Manager 调用 Wdg_Init(SWS EcuM 第34页 )。Watchdog Manager 需要 WdgIf_SetMode 和 WdgIf_SetTriggerCondition(SWS WdgM 第86页 )。Watchdog Interface 将这些调用映射到驱动程序,并通过基于零的 uint8 类型的 DeviceIndex 选择实例。如果仅配置了一个驱动程序,则此映射不得引起运行时开销,例如通过宏实现(SWS WdgIf 第17页 )。时间触发完全位于驱动程序中。Watchdog Manager 仅设置触发条件(SWS WdgM 第56页 ;[SWS_Wdg_00144] )。
面向硬件端,各实例有所不同。用于内部看门狗的实例直接访问硬件 [SWS_Wdg_00161] 。用于外部看门狗的实例使用处理程序或驱动程序的 API,例如 SPI 或 DIO [SWS_Wdg_00076] 。可选地,Wdg 将 Det_ReportError 用于开发错误,并将 Dem_SetEventStatus 用于监控状态 [SWS_Wdg_00111] 。
kontext
cluster_wdg
Wdg-Instanzen (Namen je Instanz erweitert)
EcuM
EcuM
(ECU State Manager)
WdgInt
Wdg
(interner Watchdog)
EcuM->WdgInt
Wdg_Init
WdgExt
Wdg
(externer Watchdog)
EcuM->WdgExt
Wdg_Init
WdgM
WdgM
(Watchdog Manager)
WdgIf
WdgIf
(Watchdog Interface)
Auswahl per DeviceIndex
WdgM->WdgIf
WdgIf_SetMode
WdgIf_SetTriggerCondition
WdgIf->WdgInt
Wdg_SetMode
Wdg_SetTriggerCondition
WdgIf->WdgExt
Wdg_SetMode
Wdg_SetTriggerCondition
HwInt
interne
Watchdog-Hardware
WdgInt->HwInt
direkter Zugriff
Det
Det
(optional)
WdgInt->Det
Det_ReportError
Dem
Dem
(可选)
WdgInt->Dem
Dem_SetEventStatus
SpiDio
Spi / Dio
(处理程序或驱动程序)
WdgExt->SpiDio
处理程序/驱动程序的 API
WdgExt->Det
Det_ReportError
WdgExt->Dem
Dem_SetEventStatus
HwExt
externe
Watchdog-Hardware
SpiDio->HwExt
总线或引脚访问
上下文图:Wdg 由 EcuM 初始化,且仅由 WdgM 通过 WdgIf 间接控制。内部实例直接访问硬件,外部实例通过 Spi/Dio 访问。来源:[SWS_Wdg_00076] , [SWS_Wdg_00161] , [SWS_Wdg_00111] , SWS WdgM 第86页
从系统启动到受监控运行
Wdg_Init 接收指向类型为 Wdg_ConfigType 的配置集的指针。该结构是硬件相关的([SWS_Wdg_00106] , [SWS_Wdg_00171] )。该函数初始化驱动程序和硬件,并从该集合中设置默认模式和超时周期 [SWS_Wdg_00001] 。此外,它还初始化所有全局变量 [SWS_Wdg_00100] 。它仅写入既不影响其他硬件模块、也不依赖于其他硬件模块的控制器寄存器。共享寄存器由上层系统模块初始化 [SWS_Wdg_00101] 。在启用开发错误检测的情况下,初始化成功后内部状态从 WDG_UNINIT 切换到 WDG_IDLE [SWS_Wdg_00019] 。
规范的图 9.1 展示了分工:EcuM 直接初始化 Wdg,此后 WdgM 通过 WdgIf 控制触发条件和模式(SWS Wdg 图 9.1 第34页 )。对集成商而言重要的是:自 Wdg_Init 起,配置的默认模式和初始超时周期生效 [SWS_Wdg_00001] 。如果此模式不是 OFF,控制实例必须在时间窗口内刷新触发条件,否则看门狗将超时溢出 [SWS_Wdg_00144] 。
初始化、触发条件和模式切换 EcuM WdgM WdgIf Wdg Use Case: Initialisierung Wdg_Init(ConfigPtr) 初始化全局变量和寄存器 设置默认模式和超时周期 带开发错误检测: WDG_UNINIT -> WDG_IDLE 返回 Use Case: Triggerbedingung setzen loop 在时间窗口到期前更新 WdgIf_SetTriggerCondition(DeviceIndex, Timeout) Wdg_SetTriggerCondition(timeout) 将 ms 换算为计数器值 (考虑当前模式) 返回 返回 Use Case: Moduswechsel WdgIf_SetMode(DeviceIndex, WdgMode) Wdg_SetMode(Mode) E_OK / E_NOT_OK Wdg_SetMode 的返回值
时序图:在 EcuM 初始化之后,由 WdgM 通过 WdgIf 设置触发条件并切换模式。来源:SWS Wdg 图 9.1 第34页 , [SWS_Wdg_00001] , [SWS_Wdg_00019] , [SWS_Wdg_00139] , SWS WdgIf 第18页
触发条件:有时间限制的服务许可
硬件不会通过来自外部的单个触发调用进行服务。取而代之的是采用触发条件:只要它有效,驱动程序就会自行对硬件进行服务。如果它失效,驱动程序将停止触发,看门狗超时溢出 [SWS_Wdg_00144] 。规范将该条件描述为“在接下来的 n 毫秒内对看门狗进行服务的许可”。控制实例必须在此窗口内对其进行刷新 [SWS_Wdg_00144] 。
Wdg_SetTriggerCondition(uint16 timeout) 根据传入的值重置超时计数器([SWS_Wdg_00155] , [SWS_Wdg_00136] )。该值被解释为毫秒。驱动程序在内部将其转换为计数器值 [SWS_Wdg_00138] ,并在此过程中考虑当前模式 [SWS_Wdg_00139] 。值 0 是允许的:它会(近乎)立即终止触发,从而引发(近乎)立即的看门狗复位。如果保存的计数器已处于 0,该函数将忽略任何新值 [SWS_Wdg_00140] 。因此,已过期的计数器无法再重新加载。
实际的触发操作由驱动程序内部服务例程完成。如果触发计数器大于零,它将对计数器递减并触发硬件 [SWS_Wdg_00134] 。当计数器归零时,它不执行任何操作,看门狗超时溢出 [SWS_Wdg_00135] 。如果服务例程实现为中断例程,则中断框架属于 Wdg_Irq.c [SWS_Wdg_00079] 。图 9.2 展示了一个定时器中断,该中断在时间上独立于经由 WdgIf 的调用来触发看门狗(SWS Wdg 图 9.2 第31页 )。
通过触发条件解耦触发 WdgM WdgIf Wdg Timer-Hardware Watchdog-Hardware Use Case: Triggerbedingung erneuern WdgIf_SetTriggerCondition(DeviceIndex, Timeout) Wdg_SetTriggerCondition(timeout) 重置触发计数器 返回 返回 Use Case: 驱动中的服务处理 loop je Timer-Interrupt Interrupt alt 触发计数器 > 0 递减触发计数器 Hardware triggern (必要时附带激活码) 触发计数器 = 0 未触发:看门狗超时 并复位 ECU
时序图:WdgM 仅重新加载触发计数器,触发本身由驱动程序中的定时器中断发起。计数器值为 0 时不进行触发,看门狗超时溢出。来源:SWS Wdg 图 9.2 第31页 , [SWS_Wdg_00134] , [SWS_Wdg_00135] , [SWS_Wdg_00136] , [SWS_Wdg_00093]
triggerbedingung
start
Wdg_SetTriggerCondition(timeout)
pruefMax
开发错误检测已激活
且 timeout > WdgMaxTimeout?
start->pruefMax
fehler
报告 WDG_E_PARAM_TIMEOUT
不重新加载计数器
pruefMax->fehler
是
pruefNull
存储的计数器 = 0?
pruefMax->pruefNull
不
ende
返回调用方
fehler->ende
ignorieren
不执行任何操作
(忽略传入的值)
pruefNull->ignorieren
是
umrechnen
将毫秒换算为计数器值
(考虑当前模式)
pruefNull->umrechnen
不
ignorieren->ende
laden
重置超时计数器
umrechnen->laden
pruefT0
timeout = 0?
laden->pruefT0
reset
触发(几乎)立即终止
-> ECU 看门狗复位
pruefT0->reset
是
weiter
服务例程持续触发,
只要计数器 > 0
pruefT0->weiter
不
reset->ende
weiter->ende
活动图:Wdg_SetTriggerCondition 丢弃过大的超时时间,在计数器已过期时忽略新值,否则根据模式转换为计数器值。解释:规范未定义这两个检查的顺序。来源:[SWS_Wdg_00146] , [SWS_Wdg_00140] , [SWS_Wdg_00138] , [SWS_Wdg_00139] , SWS Wdg 第29页
运行模式 OFF、SLOW 和 FAST
Wdg_SetMode 将驱动程序和硬件从当前模式切换到 WDGIF_OFF_MODE、WDGIF_SLOW_MODE 或 WDGIF_FAST_MODE。每种模式对应于静态配置的设置,例如具有不同超时周期的翻转或窗口式看门狗 [SWS_Wdg_00160] 。每种模式的硬件特定参数包含在传递给 Wdg_Init 的配置集中 [SWS_Wdg_00051] 。Wdg 从 WdgIf.h 导入类型 WdgIf_ModeType [SWS_Wdg_00105] 。较早的配置模型为此展示了容器 WdgSettingsFast、WdgSettingsSlow 和 WdgSettingsOff 以及 WdgDefaultMode(ECUC-Parameter 图 5.21 第377页 )。
Wdg_SetMode 仅在切换完全执行且驱动程序和硬件的所有参数均具有新值时才返回 E_OK [SWS_Wdg_00103] 。WdgIf 不做修改地透传此返回值(SWS WdgIf 第18页 )。预编译参数 WdgDisableAllowed 决定是否允许关闭看门狗。如果其设置为 OFF,则带有关闭默认模式的初始化将被拒绝 [SWS_Wdg_00025] 。根据其描述,错误 WDG_E_DISABLE_REJECTED 也涵盖了相应的模式切换 [SWS_Wdg_00179] 。
modi
start
OFF
WDGIF_OFF_MODE
start->OFF
Wdg_Init(默认模式)
仅当 WdgDisableAllowed != OFF 时
SLOW
WDGIF_SLOW_MODE
start->SLOW
Wdg_Init
(Standardmodus)
FAST
WDGIF_FAST_MODE
start->FAST
Wdg_Init
(Standardmodus)
OFF->SLOW
Wdg_SetMode
OFF->FAST
Wdg_SetMode
SLOW->OFF
Wdg_SetMode
仅当允许关闭时
SLOW->FAST
Wdg_SetMode
FAST->OFF
Wdg_SetMode
仅当允许关闭时
FAST->SLOW
Wdg_SetMode
状态图:Wdg_Init 设置配置的默认模式,随后 Wdg_SetMode 在三种模式之间切换。仅当 WdgDisableAllowed 允许时才能达到 OFF 模式。来源:[SWS_Wdg_00160] , [SWS_Wdg_00001] , [SWS_Wdg_00025] , [SWS_Wdg_00179] , [SWS_Wdg_00031]
内部状态、互斥区和激活代码
在启用开发错误检测时,Wdg 维护一个内部状态:在成功初始化之前为 WDG_UNINIT,之后为 WDG_IDLE [SWS_Wdg_00019] 。Wdg_SetMode 和服务例程在执行期间设置 WDG_BUSY。作为返回前的最后一个操作,它们再次设置 WDG_IDLE([SWS_Wdg_00018] , [SWS_Wdg_00052] )。两者在此之前都会检查状态是否为 WDG_IDLE。否则,模式切换或触发将不予执行,并报告 WDG_E_DRIVER_STATE([SWS_Wdg_00017] , [SWS_Wdg_00035] )。通过这种方式可以检测到初始化前的调用,以及模式切换与触发之间的交叉重叠。
如果为了数据一致性必须禁止中断(例如在模式切换期间或在触发例程中),则应尽可能通过 BSW 调度器的互斥区来实现。内部驱动程序作为 MCAL 模块也可以直接禁止中断 [SWS_Wdg_00040] 。BSW 分布指南解释了背景原因:在 MCAL 驱动程序中,Main Function、服务 API 和 ISR 可以在各自的执行上下文中访问共享的外设寄存器(BSW Distribution Guide 第36页 )。
某些硬件需要可配置或可变的激活代码。此时 Wdg 在内部管理该代码并分别传递正确的值。硬件随后使用下一个期望的代码更新内部变量 [SWS_Wdg_00093] 。必须选择适当的触发周期,以确保该更新能够可靠进行 [SWS_Wdg_00094] 。可配置的初始代码属于配置集。如果代码由硬件固定指定,则不需要此要求 [SWS_Wdg_00095] 。
zustaende
start
UNINIT
WDG_UNINIT
start->UNINIT
UNINIT->UNINIT
Wdg_SetMode / Bedienroutine:
WDG_E_DRIVER_STATE
IDLE
WDG_IDLE
UNINIT->IDLE
Wdg_Init erfolgreich
BUSY
WDG_BUSY
IDLE->BUSY
Wdg_SetMode 或
服务例程开始
BUSY->IDLE
返回前的
最后一个操作
BUSY->BUSY
weiterer Aufruf:
WDG_E_DRIVER_STATE,
kein Wechsel/kein Triggern
状态图:启用开发错误检测时,状态 WDG_UNINIT、WDG_IDLE 和 WDG_BUSY 有效。在 WDG_IDLE 之外的调用将被以 WDG_E_DRIVER_STATE 拒绝。来源:[SWS_Wdg_00019] , [SWS_Wdg_00017] , [SWS_Wdg_00018] , [SWS_Wdg_00035] , [SWS_Wdg_00052]
内部和外部看门狗:实例、文件、配置
一个ECU可以拥有多个Wdg实例,例如一个用于内部看门狗,另一个用于外部看门狗。此时,API名称与实例特定类型名称[SWS_Wdg_00172] 以及代码和头文件名称将根据SRS_BSW_00347进行扩展([SWS_Wdg_00169] 、[SWS_Wdg_00170] )。图1显示了包含Wdg<xxx>.h和Wdg_<xxx>PBcfg.c等占位符的文件结构(SWS Wdg 图 1 第11页 )。外部Wdg必须提供与内部看门狗相同的完整功能集以及语义相同的API [SWS_Wdg_00077] 。其源代码必须独立于微控制器平台[SWS_Wdg_00055] 。安全领域的一个示例是通过SPI连接的外部窗口看门狗(EXP SafetyUseCase 图 4.1 第20页 )。
代码文件结构未作完全规定。需要时,它包括用于链接时参数的Wdg_Lcfg.c以及用于构建后参数的Wdg_PBcfg.c [SWS_Wdg_00079] 。Wdg最迟在编译时静态检查配置[SWS_Wdg_00086] 。代码是从ROM还是RAM运行由静态配置决定[SWS_Wdg_00168] 。对于外部硬件,Wdg将访问参数(例如SPI通道或DIO端口)纳入其已发布的参数和配置参数中[SWS_Wdg_00078] 。较新的Release将其建模为对DIO通道组、SPI序列或I2C序列的选择引用WdgExternalContainerRef。I2C在R20-11中未明确提及(SWS Wdg 第40页 )。Wdg_SetTriggerCondition对照最大值WdgMaxTimeout进行检查[SWS_Wdg_00146] 。此外,已发布信息模型还包含WdgMinTimeout和WdgResolution(ECUC-Parameter 图 5.22 第380页 )。
发生错误时的行为
Wdg将主要仅在启用开发错误检测时才进行检查的开发错误与扩展生产错误区分开来。错误代码已固定[SWS_Wdg_00010] :
WDG_E_DRIVER_STATE (0x10)
WDG_E_PARAM_MODE (0x11)
WDG_E_PARAM_CONFIG (0x12)
WDG_E_PARAM_TIMEOUT (0x13)
WDG_E_PARAM_POINTER (0x14)
WDG_E_INIT_FAILED(0x15,配置集选择无效)
对于开发错误,Wdg可选择请求Det_ReportError [SWS_Wdg_00111] 。各个服务的错误情况如下:
生产错误WDG_E_MODE_FAILED和WDG_E_DISABLE_REJECTED涉及初始化与模式切换。其监控频率取决于上层([SWS_Wdg_00178] 、[SWS_Wdg_00179] )。若设置或关闭模式失败,则报告FAILED;若成功,则报告PASSED([SWS_Wdg_00180] 、[SWS_Wdg_00181] 、[SWS_Wdg_00182] 、[SWS_Wdg_00183] )。这些报告很可能通过可选请求的Dem_SetEventStatus进行[SWS_Wdg_00111] 。 问题 (未决) 最严重的情况故意不表现为返回值:若触发条件未执行或被设为0,看门狗将超时,且ECU会被复位([SWS_Wdg_00135] 、[SWS_Wdg_00140] )。
setmode
start
Wdg_SetMode(Mode)
pruefZustand
Entwicklungsfehlererkennung aktiv:
Zustand = WDG_IDLE?
start->pruefZustand
fehlerZustand
WDG_E_DRIVER_STATE melden
kein Wechsel, E_NOT_OK
pruefZustand->fehlerZustand
不
pruefMode
模式是否在允许范围内?
pruefZustand->pruefMode
是
ende
返回调用方
fehlerZustand->ende
pruefGrenzen
该模式的硬件设置
是否在限制范围内?
pruefMode->pruefGrenzen
是
fehlerMode
WDG_E_PARAM_MODE melden
kein Wechsel, E_NOT_OK
pruefMode->fehlerMode
不
pruefGrenzen->fehlerMode
不
busy
Zustand WDG_BUSY
pruefGrenzen->busy
是
fehlerMode->ende
umschalten
将驱动和硬件
切换到新模式
busy->umschalten
pruefErfolg
切换是否完整
且成功?
umschalten->pruefErfolg
ok
WDG_E_MODE_FAILED: PASSED
返回 E_OK
pruefErfolg->ok
是
nok
WDG_E_MODE_FAILED: FAILED
返回 E_NOT_OK
pruefErfolg->nok
不
idle
Zustand WDG_IDLE
(letzte Operation)
ok->idle
nok->idle
idle->ende
活动图:Wdg_SetMode检查状态、模式和硬件限制,进行切换并通过返回值和WDG_E_MODE_FAILED报告结果。Interpretation:检查顺序未作规范性规定。来源:[SWS_Wdg_00017] 、[SWS_Wdg_00091] 、[SWS_Wdg_00092] 、[SWS_Wdg_00016] 、[SWS_Wdg_00103] 、[SWS_Wdg_00018] 、[SWS_Wdg_00180] 、[SWS_Wdg_00181]
进一步详细证据
基于AUTOSAR Classic R20-11规范摘录的AI生成模块指南。仅链接的Requirement具有规范效力;标记为Interpretation的表述未被源文档直接覆盖。
gemini-3.8-flash-low· 2026-10-13 · 德文原文