[其他产品] 嵌入式开发定时器与中断看门狗没有配合好时出现的问题分享

[复制链接]
1482|2
 楼主| meiyaolei 发表于 2025-5-26 11:03 | 显示全部楼层 |阅读模式
“嵌入式开发遇上诡异Bug,你咋翻盘的?”
嵌入式开发里,Bug总冒得莫名其妙,栈溢出、指针跑飞啥都有。你们碰过啥玄学Bug?是靠打印日志磨出来的,还是调试器硬刚?快来吹吹你的翻盘神技,或者吐槽哪次Bug整得想退行!


其实在嵌入式里开发会遇到很多的BUG,而且还是那种找不到原因或者很难排查的现象,下面我来分享一下,我曾经遇到过的嵌入式开发遇到的一下比较不好弄的BUG和处理办法。

现象:产品是扫地机,设备运行一段时间后突然死机,重启后又能正常工作一段时间,但问题会反复出现,而且有时不会出现,有时会出现。


想到的解决的办法
1、一开始以为是代码逻辑问题,疯狂加日志,拼命的打断点,想看看程序到底卡在哪一步。结果发现,每次崩溃前,日志里都有一个定时器超时的记录,但这个定时器明明设置了合理的超时时间。
2、使用灯来查看现象在哪一步出现问题时,对应 的灯哪个就会亮。


仔细检查了定时器的配置代码,发现没有问题。当我用调试器单步跟踪时,发现定时器的中断服务函数里竟然有一个耗时很长的操作,然后一直在累加,而且有时还影响看门狗工作,而且中断里的时间蛮长。


后面经过自己的分析嵌入式系统的中断服务函数应该尽量简短,不能有耗时操作。因为中断服务函数会阻塞其他中断,如果处理时间过长,就可能导致系统崩溃。这个Bug就是因为定时器中断服务函数工作时间很长,导致系统响应不及时,最终崩溃,导致有时来不及清狗。


最后把看门狗在进行定时器和中断时先清,然后把中断里的配置精简,没有必要的就移到外面,最终解决了问题。


代码
  1. // 全局变量与宏定义
  2. volatile uint8_t timer_flag = 0;  // 中断触发标志
  3. #define WDT_TIMEOUT_MS 1000       // 看门狗超时时间
  4. #define TASK_INTERVAL_MS 100      // 主任务执行间隔

  5. // 精简后的定时器中断服务函数
  6. void TIM2_IRQHandler(void) {
  7.   if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET) {
  8.     __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);  // 清除中断标志
  9.    
  10.     // 仅做必要操作:设置标志位,耗时操作移至主循环
  11.     timer_flag = 1;  
  12.    
  13.     // 在中断中安全清狗(需确保清狗时间 < WDT超时时间)
  14.     HAL_IWDG_Refresh(&hiwdg);  
  15.   }
  16. }

  17. // 主循环任务处理
  18. void process_main_tasks(void) {
  19.   static uint32_t last_task_time = 0;
  20.   uint32_t now = HAL_GetTick();
  21.   
  22.   if (timer_flag) {
  23.     timer_flag = 0;
  24.    
  25.     // 执行实际耗时操作(原中断中的内容)
  26.     // 例如:传感器数据采集、复杂计算等
  27.     // ...
  28.   }
  29.   
  30.   // 主循环清狗(双重保护)
  31.   if (now - last_task_time >= TASK_INTERVAL_MS) {
  32.     HAL_IWDG_Refresh(&hiwdg);
  33.     last_task_time = now;
  34.   }
  35. }

  36. // 初始化函数
  37. void system_init(void) {
  38.   HAL_Init();
  39.   MX_TIM2_Init();    // 初始化定时器(1ms中断)
  40.   MX_IWDG_Init();    // 初始化独立看门狗(超时1s)
  41.   HAL_TIM_Base_Start_IT(&htim2);
  42.   HAL_NVIC_EnableIRQ(TIM2_IRQn);
  43. }


解释一下
定时器周期​​:
根据需求调整定时器中断周期,1ms用于高频控制,10ms用于数据采集。
​​看门狗超时​​:
保证 ​​看门狗大于主循环最大可能阻塞时间多少MS的任务周期。
​​中断优先级​​:
设置定时器中断优先级高于其他非关键中断,但低于看门狗的优先级。

玛尼玛尼哄 发表于 2025-5-27 07:06 | 显示全部楼层
如果有阻塞,会复位的。
雨下纪事 发表于 2025-9-15 14:50 | 显示全部楼层
嵌入式开发中定时器与中断看门狗配合不佳,易出现两类问题:一是定时器中断频繁触发,抢占看门狗喂狗时机,导致看门狗误判系统死机而复位;二是定时器周期过长,看门狗未及时被喂狗,引发不必要的系统重启。此外,中断优先级配置不当,可能使看门狗中断被定时器中断阻塞,无法正常响应,最终造成系统稳定性下降、功能异常甚至频繁宕机。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

263

主题

836

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部