Linux内核中喂狗,m3352linux内核中看门狗喂狗和应用层喂狗方法

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 worldn");

//}

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 secondsn", 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 secondsn", timeout);

#if 1 // 循环喂狗

while(1) {

write(wdt_fd, " ", 1);

sleep(9); // 喂狗时间为9秒,小于设定的10秒;如果喂// 狗时间大于超时时间,将会发生看门狗复位

}

#else // 关闭看门狗

write(wdt_fd, "V", 1);

close(wdt_fd);

printf( WDT " is closeed!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值