嵌入式C语言--WatchDog最全概念

嵌入式C语言–WatchDog最全概念

一. 什么是Watchdog

Watchdog,又称watchdog timer,它是计算机可靠性(dependability)领域中一个极为简单同时非常有效的检测(detection)工具。
WatchDog硬件的逻辑就是,其硬件上有个记录超时功能,然后要求用户需要每隔一段时间(此时间可以根据自己需求而配置)去对其进行一定操作,比如往里面写一些固定的值,俗称“喂狗”,发现超时了,即过了这么长时间还不给狗喂食,那么偶就认为你系统是死机了,出问题了,狗狗就帮你重启系统。说白了就是弄个看家狗Dog,你要定期给它喂食,如果超时不喂食,那么狗就认为你,他的主人,你的系统,死机了,就帮你reset重启系统。
Softwere Watchdog Timeout,顾名思义就是软件超时监控狗。

1)什么是“被狗咬”

当看门狗启动后,计数器开始自动计数,经过一定时间,如果没有被复位,计数器溢出就会对CPU产生一个复位信号使系统重启。
简单理解就是当不喂狗时,狗就要来咬你了,这个时候就系统重启了。

2)什么是喂狗

系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零,从而不让复位信号产生。
如果系统不出问题,程序保证按时“喂狗”,一旦程序跑飞,没有“喂狗”,系统“被咬”复位。
这就好比你的身边有一只时刻饥饿的狗,你不按时给它肉吃,它就会吃你的肉,被狗咬…然后挂了,投胎转世,彻底重新做人。

二. 基本思想

WatchDog的基本思想是针对被监视的目标设置一个计数器和一个阈值,WatchDog会自己增加计数值,并等待被监视的目标周期性地重置计数值。一旦目标发生错误,没来得及重置计数值,watchdog会检测到计数值溢出,并采取恢复措施(通常情况下是重启)。
总结一下就是计数——溢出——触发。
一个正常运行的系统,它的执行流应该是可预测的,因此可以在它正常执行路径上设置一些周期性重置watchdog的点;但如果系统发生故障,它可能执行不到下一个重置watchdog的点,此时故障将被watchdog捕捉到。看到这儿,您应该知道watchdog对于检测死循环或死锁这类故障非常有效。

三. 作用

watchdog 一般是一个硬件模块(也可以软件实现),其作用是在嵌入式操作系统中,很多应用情况是系统长期运行且无人看守,所以难免或者怕万一出现系统死机,那就狗屁了,这时,watchdog就会自动帮你重启系统来完成初始化。
它的工作方式是事件触发的,它可以对任何合理的事件计数(如CPU指令)。其中时间事件(timeout)最常使用,这也是为什么watchdog又叫做watchdog timer。Watchdog系统起到非常重要的作用,相当于系统警察,当系统发生严重错误(如程序进入死循环等)不能恢复的时候,WatchDog能够让系统重启。WatchDog的应用主要是在嵌入式操作系统中,避免了系统在无人干预时长时间挂起的情况。
总结:保证系统在出现不可恢复错误时,能够自动让系统重启。

四. 监视目标

Watchdog是一种检测手段,它监视的目标可以是一个进程也可以是整个操作系统。

1) 监视一个进程

如果监视目标只是一个进程,那么利用操作系统提供的定时功能即可实现一个Watchdog。

2)监视一个操作系统

如果要监视操作系统,就得使用操作系统之外的工具,通常是一个附加的计数器。现代Intel CPU都包含的performance counter也可以提供这样的功能,从而不需要额外的设备就能实现监视操作系统的watchdog。

五. 系统初始化时关闭watchdog的原因

如果不禁用watchdog,那么就要单独写程序去定期“喂狗”。bootloader的作用是初始化必要的硬件资源和系统资源,保证产品软件能够正常启动。bootloader不必长期留在内存中,所以用不到这个watchdog的机制。

六. WATCHDOG模块

在比较高档的嵌入式硬件都有一个WATCHDOG模块。如果在MCUMPU是没有集成WATCHDOG,一般会在此嵌入式系统中加一个专门的WATCHDOG芯片来实现WATCHDOG机制。
此模块主要的功能包括:

  1. 提供WATCHDOG控制寄存器和配置寄存器,供软件开发人员根据系统需要进行灵活配置。
  2. 提供一接口,使应用软件能够定时给WATCHDOG“喂狗”。
  3. 提供WATCHDOG机制,当系统进入不可恢复错误时,能产生一个不可屏蔽中断来通知系统自动重启(一般这样,也有改变为其他处理方式的),只有相应的复位信号才能清除它。

七. WatchDog总结

  1. 看门狗 (Watch Dog)在嵌入式系统中很常见,常用于保证系统的可靠性。看门狗有软件与硬件两种,有的MCU,本身有看门狗定时器,可以借助【外部独立的看门狗芯片】,实现程序【监控】功能。
  2. 看门狗是一个独立的【定时器模块】,有独立的定时器控制器,程序可以设置定时器的超时时间,时间到了,会进入看门狗定时器中断,并触发系统【复位】
  3. 当系统异常,如程序跑飞后,由于无法确保按时【喂狗】,也就是不能及时的【重置看门狗定时器】,造成看门狗超时,触发系统【复位】而重新运行程序
  4. 使用看门狗完成重启能够解决大部分的嵌入式系统的问题。因为出现错误重启系统,能够解决大部分的问题。
  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要编写一个 watchdog 程序,你需要使用系统调用来设置定时器并检查进程的状态。以下是一个简单的 C 代码示例,可以在 Linux 系统上实现 watchdog: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #define WATCHDOG_TIMEOUT 30 // 监视器超时时间为30秒 void handle_signal(int signal) { printf("Watchdog: Process is running\n"); } int main(int argc, char *argv[]) { pid_t pid; int fd; char buf[256]; if(argc < 2) { fprintf(stderr, "Usage: %s <program to watch>\n", argv[0]); return EXIT_FAILURE; } pid = fork(); if (pid < 0) { perror("fork"); return EXIT_FAILURE; } else if (pid == 0) { /* 子进程 */ execvp(argv[1], &argv[1]); perror("execvp"); return EXIT_FAILURE; } /* 父进程 */ fd = open("/dev/watchdog", O_WRONLY); if (fd == -1) { perror("open"); return EXIT_FAILURE; } printf("Watchdog: Starting %s with pid %d\n", argv[1], pid); while (1) { signal(SIGUSR1, handle_signal); // 捕捉 SIGUSR1 信号 write(fd, "a", 1); // 向 watchdog 设备发送信号 sleep(WATCHDOG_TIMEOUT); // 等待 watchdog 超时 if (kill(pid, 0) == -1) { // 检查进程是否存在 printf("Watchdog: Process %d is not running, exiting\n", pid); break; } } close(fd); return EXIT_SUCCESS; } ``` 在这个示例中,watchdog 程序使用 fork() 创建一个子进程来运行需要监视的程序,然后使用 open() 函数打开 watchdog 设备文件 "/dev/watchdog"。程序进入一个无限循环,使用 write() 函数向 watchdog 设备发送信号并等待 watchdog 超时。如果进程被杀死或崩溃,那么在下一次检查时 kill() 函数将返回 -1,程序将退出。 你可以将这个程序编译成可执行文件并在终端上运行: ``` $ gcc -o watchdog watchdog.c $ ./watchdog my_program ``` 这将监视 "my_program" 进程并在进程崩溃或被杀死时重新启动它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值