s32k312 WDT(driver--swt_lp)---s32ds

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)报错(测试失败)。
  • 重置u32Timeoutu32NumOfNotifications,准备下一次测试。
  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值