【秋招】嵌入式面试八股文 - 看门狗 篇

【秋招】嵌入式面试八股文 - 最全专栏

一、基本概念

1. 什么是看门狗?

  • 看门狗是一个独立的定时器,用于监测系统是否正常运行
  • 当系统运行异常时,看门狗会自动复位系统,使其恢复正常状态
  • 看门狗通常由独立的时钟源驱动,与主系统时钟相互独立

2. 看门狗的基本工作原理

// 看门狗基本工作流程
void WDT_Process(void) {
    // 初始化看门狗
    WDT_Init();
    
    while(1) {
        // 执行正常任务
        DoNormalTask();
        
        // 喂狗(重置看门狗计数器)
        WDT_Feed();
        
        // 如果系统死机,无法执行到这里
        // 看门狗计数器溢出,系统将被复位
    }
}


二、看门狗类型

1. 独立看门狗(IWDG)

  • 由独立的低速时钟源(LSI)驱动
  • 完全独立于主时钟系统
  • 即使主时钟失效也能正常工作
  • 适用于对可靠性要求高的场合
// STM32独立看门狗配置示例
void IWDG_Config(uint8_t prescaler, uint16_t reload) {
    // 使能对IWDG寄存器的访问
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    
    // 设置IWDG预分频值
    IWDG_SetPrescaler(prescaler);
    
    // 设置IWDG重装载值
    IWDG_SetReload(reload);
    
    // 重载IWDG计数器
    IWDG_ReloadCounter();
    
    // 使能IWDG
    IWDG_Enable();
}

// 喂狗函数
void IWDG_Feed(void) {
    IWDG_ReloadCounter();
}


2. 窗口看门狗(WWDG)

  • 具有可配置的时间窗口
  • 必须在特定时间窗口内喂狗,过早或过晚都会导致复位
  • 可以检测程序执行时序是否正常
  • 适用于需要严格控制程序执行时序的场合
// STM32窗口看门狗配置示例
void WWDG_Config(uint8_t counter, uint8_t window) {
    // 配置WWDG时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
    
    // 设置WWDG预分频值
    WWDG_SetPrescaler(WWDG_Prescaler_8);
    
    // 设置窗口值
    WWDG_SetWindowValue(window);
    
    // 设置计数器值
    WWDG_Enable(counter);
    
    // 清除早期唤醒中断标志
    WWDG_ClearFlag();
    
    // 使能WWDG中断
    WWDG_EnableIT();
}

// 窗口看门狗喂狗函数
void WWDG_Feed(uint8_t counter) {
    // 确保当前计数值在窗口内
    if((WWDG_GetCounter() < WWDG_WINDOW_VALUE) && 
       (WWDG_GetCounter() > WWDG_CR_T)) {
        WWDG_SetCounter(counter);
    }
}


3. 软件看门狗

  • 由软件定时器实现
  • 依赖于系统时钟和中断系统
  • 实现简单,灵活性高
  • 可靠性较低,不适用于关键系统
// 软件看门狗实现示例
typedef struct {
    uint32_t timeout;
    uint32_t counter;
    bool enabled;
} SoftWDT_TypeDef;

SoftWDT_TypeDef SoftWDT;

// 初始化软件看门狗
void SoftWDT_Init(uint32_t timeout) {
    SoftWDT.timeout = timeout;
    SoftWDT.counter = 0;
    SoftWDT.enabled = true;
}

// 在系统滴答定时器中调用
void SoftWDT_Update(void) {
    if(SoftWDT.enabled) {
        SoftWDT.counter++;
        if(SoftWDT.counter >= SoftWDT.timeout) {
            // 看门狗超时,执行复位
            NVIC_SystemReset();
        }
    }
}

// 喂狗函数
void SoftWDT_Feed(void) {
    SoftWDT.counter = 0;
}


三、常见面试题与解答

1. 为什么需要使用看门狗?

解答:使用看门狗的主要原因:

  1. 防止系统死机:当程序因为各种原因(如死循环、硬件故障等)导致系统无响应时,看门狗可以自动复位系统
  2. 抵抗电磁干扰:在强电磁环境下,MCU可能会受到干扰导致程序跑飞,看门狗可以使系统恢复正常
  3. 处理软件异常:对于未预见的软件异常(如栈溢出、野指针等),看门狗提供了最后的保护机制
  4. 提高系统可靠性:在无人值守的嵌入式系统中,看门狗是保证系统长期稳定运行的重要手段

2. 如何正确设置看门狗超时时间?

解答:设置看门狗超时时间需要考虑以下因素:

  1. 任务执行时间:超时时间应大于系统中最长任务的执行时间
  2. 系统启动时间:确保超时时间大于系统启动所需时间
  3. 外部设备响应时间:如果系统依赖外部设备(如Flash、网络设备等),需考虑其最大响应时间
  4. 安全裕度:通常设置为正常执行时间的2-3倍,既不能太短(误触发),也不能太长(影响恢复时间)

3. 如何在多任务系统中正确使用看门狗?

解答:多任务系统中使用看门狗的策略:

  1. 集中式喂狗
  2. 分散式喂狗
  3. 任务监控机制

4. 看门狗复位和其他复位方式有什么区别?如何区

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

双非本,211硕。本硕均为机械工程,自学嵌入式,在校招过程中拿到小米、格力、美的、比亚迪、海信、海康、大华、江波龙等offer。八股文本质是需要大家理解,因此里面的内容一定要详细、深刻!这个专栏是我个人的学习笔记总结,是对很多面试问题进行的知识点分析,专栏保证高质量,让大家可以高效率理解与吸收里面的知识点!掌握这里面的知识,面试绝对无障碍!

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务