1、linux内核模块喂狗方法:
#include
#include
#include
#include
#include
#include
#include
#include
#include
struct timer_list epc_watchdog;
void epc_feed_wdt(void)
{
gpio_direction_output(65, 0);
ndelay(2);
gpio_direction_output(65, 1);
}
EXPORT_SYMBOL(epc_feed_wdt);
static void epc_watchdog_timeout(unsigned long arg)
{
//printk("timer out!\n");
epc_feed_wdt();
mod_timer(&epc_watchdog, jiffies + 1*HZ/4);
}
static int epc_timer_init(void)
{
epc_feed_wdt();
printk("wdt feed timer start!!\n");
init_timer(&epc_watchdog);
epc_watchdog.function = &epc_watchdog_timeout;
epc_watchdog.expires = jiffies + 1*HZ/4;
add_timer(&epc_watchdog);
epc_feed_wdt();
return 0;
}
//static void epc_timer_exit(void)
//{
//printk(KERN_ALERT "Goodbye, cruel world\n");
//}
subsys_initcall(epc_timer_init);
//module_init(epc_timer_init);
//module_exit(epc_timer_exit);
MODULE_LICENSE("Dual BSD/GPL");
2、应用层喂狗方法:
M335x-T/A3352-T工控主板有一个可编程看门狗(/dev/watchdog),可用于监测应用程序的运行状况。看门狗有如下特点:
(1)默认超时时间为19秒,超时时间可设置(1~60秒);
(2)先向看门狗发送一个字符“V”后,可关闭看门狗。
设置看门狗时间
看门狗默认超时时间为19秒,用户可以将超时时间设置为需要的值,通过ioctl实现,具体命令为:WDIOC_SETTIMEOUT,需要一个参数,即超时时间。使用示例:
int timeout = 10;
ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout);
获取超时时间
通过ioctl以及WDIOC_GETTIMEOUT命令,可以获得看门狗的超时时间。使用示例:
timeout = 0;
ioctl(wdt_fd, WDIOC_GETTIMEOUT, &timeout);
printf("The timeout is %d seconds\n", timeout);
喂狗操作
看门狗被打开后,必须在超时时间内进行喂狗,最简单的喂狗办法就是向看门狗写一个字符(特殊字符除外)。
关闭看门狗
需先写入“V”,然后使用close关闭看门狗。使用示例:
write(wdt_fd, "V", 1);
close(wdt_fd);
范例
程序清单1 是一个非常简单的范例。打开看门狗后,将看门狗超时设置为10秒钟,然后在超时时间内周期性喂狗。运行该程序,系统不会复位。如果调整喂狗周期大于10秒,程序将会引起系统复位。
程序清单1 看门狗用法简单范例
#include
#include
#include
#include
#include
#include
#define WDT "/dev/watchdog"
int main(void)
{
int wdt_fd = -1;
int timeout;
wdt_fd = open(WDT, O_WRONLY);
if (wdt_fd == -1) {
printf("fail to open "WDT "!\n");
}
printf(WDT " is opened!\n");
timeout = 10;
ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout);
ioctl(wdt_fd, WDIOC_GETTIMEOUT, &timeout);
printf("The timeout was is %d seconds\n", timeout);
#if 1 // 循环喂狗
while(1) {
write(wdt_fd, "\0", 1);
sleep(9); // 喂狗时间为9秒,小于设定的10秒;如果喂// 狗时间大于超时时间,将会发生看门狗复位
}
#else // 关闭看门狗
write(wdt_fd, "V", 1);
close(wdt_fd);
printf( WDT " is cl