1.软锁和硬锁是什么?
软死锁表示产生死锁的cpu上运行的任务超过了一定的时间限度导致无法进行内核线程调度。典型场景为某个cpu上一直在while死循环,导致该cpu无法调度运行他任务。
硬死锁表示产生死锁的cpu上在一定的时间限度上一直无法响应中断。典型场景为在同一个cpu上调用关中断的自选锁spin_lock_irqsave产生了死锁。
2. 响应动作:告警与故障处理
基础告警:检测到软死锁时,内核会打印堆栈跟踪(日志能看到进程调用链 ),方便定位是哪个任务 / 函数长期占用 CPU。
进阶配置:设置触发软死锁时直接让系统奔溃,或自动重启,避免系统长期僵死。
3.喂狗到底是个什么样的过程?
1. 固定服务序列模式
- 核心特点:喂狗的操作序列是固定不变的,每次服务都需要严格执行相同的步骤。
- 具体操作(来自原文):先通过配置寄存器(CR)的
SMD位选择固定模式(写入00b),然后按顺序向服务寄存器(SR)的WSC位写入两个固定值:A602h→ 再写入B480h。两次写入之间没有严格的时间要求,只要按顺序完成即可。 - 适用场景:适用于对安全性要求不高、需要简单直接喂狗逻辑的场景。因为序列固定,实现起来简单,但缺点是如果该固定序列被恶意获取,可能被非法模仿执行喂狗操作。
2. 密钥服务序列模式
- 核心特点:喂狗的序列是动态变化的,每次服务需要基于前一个 “密钥” 计算出下一个 “密钥”,序列不固定。
- 具体操作(来自原文):先通过配置寄存器(CR)的
SMD位选择密钥模式(写入01b),然后:① 从密钥寄存器(SK)的SK位读取初始服务密钥;② 用指定的公式计算出下一个服务密钥;③ 将计算出的密钥写入服务寄存器(SR)的WSC位;④ 重复①~③步骤一次(即完成两次密钥的读取、计算和写入)。 - 适用场景:适用于对安全性要求较高的场景。因为每次的服务密钥是动态计算的(依赖前一个密钥和特定算法),外人若不知道计算逻辑,无法伪造喂狗序列,能有效防止非法喂狗操作。
在代码层面喂狗的核心目的就是根据选择的服务序列模式(固定模式或密钥模式),执行对应的寄存器操作,最终达到”刷新SWT内部计数器“的目的,通过这种方式告诉SWT系统仍然是正常的,避免其因超时出发复位或者中断。
4.看门狗选择操作模式的中断模式和超时模式分别如何工作?

超时模式:配置超时方式,超时后系统重启

Swt_Ip_Init(0, &Swt_Ip_Cfg0);
Swt_Ip_Service(0);
中断模式:配置

Swt_Ip_Init(0, &Swt_Ip_Cfg0);
Swt_Ip_Service(0);
这个”首次超时触发中断“模式(CR[ITR] = 1)时,其超时行为分为两步:
1)首次超时:SWT内部计数器递减到0时,不会直接复位,而是先触发中断标志位IR[TIF],同时自动将计数器重新加载为配置的超时周期(让计数器再次开始递减)。
2)第二次超时:如果在首次超时后,系统没有及时执行“喂狗”操作(即未刷新计数器),导致计数器再次递减到0(第二次超时),此时SWT才会触发复位请求,强制系统重启。
可以通过使能看门狗中断,利用中断触发看门狗回调函数Swt_CallbackNotification0进行测试,参考Swt_Ip_Example_S32K344 RTD 实例:
在“IntCtrl_lp”选择“Interrupt Controller”勾选“SWT0_IRQn”使能

- 例程代码中首次超时触发中断后,中断服务程序(
Swt_Ip_Swt0_Isr)会被调用,进而执行回调函数(Swt_CallbackNotification0)。系统可以在回调中做一些紧急处理(比如记录错误、尝试恢复正常流程等)。 - 例程代码的测试逻辑中,每次 “喂狗”(
Swt_Ip_Service)后等待首次超时中断,正是为了验证这种模式下 “首次超时能正确触发中断” 的功能是否正常。

#include "IntCtrl_Ip.h"
#include "IntCtrl_Ip_Cfg.h"
#include "Swt_Ip_VS_0_PBcfg.h"
#include "Swt_Ip.h"
/* SWT instance used - 0 */
#define SWT_INST 0U
#define TIMEOUT_EXPIRED 0U
#define TIMEOUT 100000000U
#define NUM_OF_NOTIFICATIONS 5U
volatile uint32 u32NumOfNotifications = 0U;
/**
* @brief SWT notification
* @details Used for toggle led
*/
void Swt_CallbackNotification0(void)
{
u32NumOfNotifications++;
}
/**
* @brief SWT0 Interrupt handler
* @details Be used for calling Swt_Ip_IrqHandler defined in Swt_Ip.c
*/
extern void Swt_Ip_Swt0_Isr(void);
int main (void)
{
uint32 u32Count = 0U;
uint32 u32Timeout = TIMEOUT;
Clock_Ip_InitClock(&Clock_Ip_aClockConfig[0]);
/*Enable the SWT0 interrupt vector */
IntCtrl_Ip_Init(&IntCtrlConfig_0);
IntCtrl_Ip_InstallHandler(SWT0_IRQn, Swt_Ip_Swt0_Isr, NULL_PTR);
/*Initialize SWT */
Swt_Ip_Init(SWT_INST, &Swt_Ip_1_Cfg0);
for (u32Count = 0U; u32Count < NUM_OF_NOTIFICATIONS; u32Count ++)
{
/* Service SWT0 */
Swt_Ip_Service(SWT_INST);
while ((u32NumOfNotifications == 0U) && (u32Timeout--))
{
}
if (u32Timeout == TIMEOUT_EXPIRED)
{
/* Test is failed and the notification function has been called */
DevAssert(FALSE);
}
u32Timeout = TIMEOUT;
u32NumOfNotifications = 0U;
}
/* De-initialize SWT0 */
Swt_Ip_Deinit(SWT_INST);
/* Test passed without any error detected */
DevAssert(TRUE);
return 0;
}
例程代码验证 “喂狗后,SWT 超时会触发中断”,
-
整个程序的目的是测试 SWT0 在 “喂狗” 后能否正常触发中断,步骤如下:
Clock_Ip_InitClock:初始化系统时钟(SWT 等外设需要时钟才能工作)。IntCtrl_Ip_Init和IntCtrl_Ip_InstallHandler:初始化中断控制器,并为 SWT0 的中断线(SWT0_IRQn)注册中断处理函数(Swt_Ip_Swt0_Isr),确保 SWT 触发中断时能被 CPU 响应。Swt_Ip_Init:初始化 SWT0,使用配置结构体Swt_Ip_1_Cfg0(该配置中应包含 SWT 的关键参数,如超时时间、超时行为(首次超时触发中断)、服务模式等)。Swt_Ip_Service(SWT_INST):执行 “喂狗” 操作(根据 SWT 配置的服务模式,可能是固定序列或密钥序列),刷新 SWT 内部的递减计数器(避免立即超时)。while ((u32NumOfNotifications == 0U) && (u32Timeout--)):等待 SWT 超时触发中断。- 喂狗后,SWT 的计数器开始从超时时间递减,当减到 0(超时)时,若配置为 “首次超时触发中断”(对应之前文档中的
CR[ITR] = 1),会触发中断,调用Swt_CallbackNotification0,使u32NumOfNotifications变为 1,从而退出等待循环。 - 若
u32Timeout减到 0 仍未收到中断(u32NumOfNotifications还是 0),说明 SWT 中断功能异常,通过DevAssert(FALSE)报错(测试失败)。
- 喂狗后,SWT 的计数器开始从超时时间递减,当减到 0(超时)时,若配置为 “首次超时触发中断”(对应之前文档中的
- 重置
u32Timeout和u32NumOfNotifications,准备下一次测试。 - 5 次测试均通过后,调用
Swt_Ip_Deinit反初始化 SWT0。 DevAssert(TRUE)表示所有测试通过,程序正常结束。Swt_CallbackNotification0:SWT0 中断触发后的回调函数,功能是将u32NumOfNotifications加 1(用于主程序判断中断是否发生)。Swt_Ip_Swt0_Isr:SWT0 的中断服务程序(ISR),由中断控制器调用,内部会处理 SWT 的中断逻辑(如清除中断标志),并最终调用上面的回调函数。
原文链接:https://blog.youkuaiyun.com/xxt99/article/details/136175164
原文链接:https://blog.youkuaiyun.com/bcxwz669/article/details/148436987

被折叠的 条评论
为什么被折叠?



