嵌入式喂狗

什么是watchdog:在一般公司的板子下面,有个字符设备,/dev/watchdog,如果程序员写了一个应用程序,在此程序中open看门狗,然后每隔几秒向看门狗(此时就是个文件)里写任何数据,如果程序意外崩溃了,就不能向看门狗写数据了,等待了30秒或者1分钟,系统就会reboot。(所以看门狗是用来在程序意外崩溃时重启系统的,使崩溃的程序继续运行)。

有一篇一看就懂的文章:http://blog.csdn.net/liigo/article/details/9227205

Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开 /dev/watchdog 设备(俗称“开门放狗”),就会导致在内核中启动一个1分钟的定时器(系统默认时间),此后,用户空间程序需要保证在1分钟之内向这个设备写入数据(俗称“定期喂狗”),每次写操作会导致重新设定定时器。如果用户空间程序在1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作(“狗咬人了”呵呵)。通过这种机制,我们可以保证系统核心进程大部分时间都处于运行状态,即使特定情形下进程崩溃,因无法正常定时“喂狗”,linux系统在看门狗作用下重新启动(reboot),核心进程又运行起来了。多用于嵌入式系统。

打开 /dev/watchdog 设备(“开门放狗”):

  1. int fd_watchdog = open("/dev/watchdog", O_WRONLY);
  2. if(fd_watchdog == -1) {
  3. int err = errno;
  4. printf("\n!!! FAILED to open /dev/watchdog, errno: %d, %s\n", err, strerror(err));
  5. syslog(LOG_WARNING, "FAILED to open /dev/watchdog, errno: %d, %s", err, strerror(err));
  6. }

每隔一段时间向 /dev/watchdog 设备写入数据(“定期喂狗”):

  1. //feed the watchdog
  2. if(fd_watchdog >= 0) {
  3. static unsigned char food = 0;
  4. ssize_t eaten = write(fd_watchdog, &food, 1);
  5. if(eaten != 1) {
  6. puts("\n!!! FAILED feeding watchdog");
  7. syslog(LOG_WARNING, "FAILED feeding watchdog");
  8. }
  9. }

关闭 /dev/watchdog 设备,通常不需要这个步骤:

  1. close(fd_watchdog);

所需头文件:

    1. #include <unistd.h>
    2. #include <sys/stat.h>
    3. #include <syslog.h>
    4. #include <errno.h>
时间: 2024-10-06 07:32:43

嵌入式喂狗的相关文章

linux 嵌入式看门狗使用

linux看门狗使用很简单,在应用层使用,只需要ioctl设置一下溢出时间,既可以使用看门狗,定时喂狗即可 前提是kernel支持看门狗 Device Drivers ─> [*] Watchdog Timer Support  ---> 配置好好后,即可make 应用层的使用,直接上代码 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h&

cortex_m3_stm32嵌入式学习笔记(五):独立看门狗实验(IWDG)

单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生.看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) . 感觉是是自动复位功能,就是在一定时间内你应该去喂它而如果程序中途进入了死循环(就是喂不了了)这个MCU就挂了..但如果没开IWDG ,你不知道它挂没挂(虽然个人认为也是可以手动按复位键的嘛..)(上面那段话抄自某论坛) IWDG初始化步骤: 1)取消寄存器写保

cortex_m3_stm32嵌入式学习笔记(六):窗口看门狗实验(WWDG)

窗口看门狗( WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障. 简单来说,和IWDG的区别就是IWDG要靠手动去喂狗,而WWDG有内置中断,所以可以利用设置中断服务函数去喂狗 首先还是设置WWDG (记得往工程里面添加头文件)大致设置步骤如下: 1)使能 WWDG 时钟(系统内部时钟) 2)设置窗口值和分频数 3)开启 WWDG 中断并分组 4) 设置计数器初始值并使能看门狗 5) 编写中断服务函数 wwdg.c #include "led

cortex_m3_stm32嵌入式学习笔记(七):独立看门狗&amp;窗口看门狗

总结一下这两种狗吧... 1)独立看门狗没有中断,窗口看门狗有中断 2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制 3)独立看门狗只有下限,窗口看门狗又下限和上限 4)独立看门狗是12位递减的.窗口看门狗是7位递减的 5)独立看门狗是用的内部的大约40KHZ RC振荡器(不受系统时钟限制,即使系统时钟坏了也能工作),窗口看门狗是用的系统时钟APB1ENR(系统时钟要是挂了就完了) 独立看门狗Iwdg--独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器.主要用于监视硬件错误.

基于S3C2440的嵌入式Linux驱动——看门狗(watchdog)驱动解读

本文将介绍看门狗驱动的实现. 目标平台:TQ2440 CPU:s3c2440 内核版本:2.6.30 1. 看门狗概述 看门狗其实就是一个定时器,当该定时器溢出前必须对看门狗进行"喂狗",如果不这样做,定时器溢出后则将复位CPU. 因此,看门狗通常用于对处于异常状态的CPU进行复位. 具体的概念请自行百度. 2. S3C2440看门狗 s3c2440的看门狗的原理框图如下: 可以看出,看门狗定时器的频率由PCLK提供,其预分频器最大取值为255+1:另外,通过MUX,可以进一步降低频率

嵌入式 02 STM32 09 独立/窗口看门狗实验

一.独立看门狗和窗口看门狗 看门狗:单片机系统在外界的干扰下会出现程序跑飞的现象导致死循环,或者崩溃,看门狗电路就是为了避免这种情况的发生,看门狗的作用就是在一定的事件内(通过计数器实现)若没有收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号) 独立看门狗IWDG:独立于系统之外,因为有独立时钟30-60KHz,所以是不受系统影响的系统故障检测器,主要用于监视硬件错误. 窗口看门狗WWDG:系统内部的故障探测器,时钟与系统相同.如果系统时钟不走了,这个狗也就失去了作用

嵌入式学习笔记101-uboot_1.1.6移植(1)

根据前篇博文(嵌入式学习笔记100-uboot1.1.6初体验)最后的结论,现在开始将其实现: a. 修改makefile的CROSS_COMPILE指定编译器 arm-linux-gcc -v –> gcc version 3.4.5 CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux- chmod -R 777 u-boot-1.1.6/

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

第二章 Android系统与嵌入式开发

第二章 Android系统与嵌入式开发 第二章首先要先了解Android和嵌入式Lnux系统有什么区别和联系,嵌入式Linux系统是在嵌入式设备中运行Linux系统:Android系统是在嵌入式设备中运行Android系统. 其区别就是Android系统和Linux系统的区别.Android系统的底层是Linux的内核,上面跑的是Android的java虚拟机.Android系统的UI做的比Lnux好很多. 首先我们应该先了解一下什么是嵌入式,对于嵌入式来说,它是一种“完全嵌入受控器件内部,为特