关闭

Watchdog驱动测试程序

593人阅读 评论(0) 收藏 举报
分类:

课堂实践2:

micro2440开发板上,watchdog的驱动已经编译进内核,参照教材PP290-291页的程序,编写watchdog驱动的测试程序。

看门狗驱动程序位于开发板内核源文件(仅供参考):
Linux-2.6.29/drivers/watchdog/s3c2410_wdt.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>	//UNIX标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>	//文件控制定义
#include <termios.h>	//PPSIX终端控制定义
#include <errno.h>	//错误号定义
#include <pthread.h>

int watchdogfd;

void* feeddogthread()
{
	int feeddogvalue;
	int returnval;
	
	feeddogvalue = 65535;
	
	while (1) {
		//每隔20秒,将重载看门狗计数寄存器的值
		printf("feed dog\n");
		returnval = write(watchdogfd, &feeddogvalue, sizeof(int));
		sleep(10);
	}
}

int main()
{
	pthread_t watchdogThd;
	//int watchdogfd;
	int returnval;
	char ch;
	
	//打开看门狗设备
	if ((watchdogfd = open("/dev/watchdog", O_RDWR|O_NONBLOCK)) < 0) {
		printf("cannot open the watchdog device\n");
		exit(0);
	}
	
	//创建喂狗线程
	returnval = pthread_create(&watchdogThd, NULL, feeddogthread, NULL);
	if (returnval < 0)
		printf("cannot create feeddog thread\n");
		
	while (1) {
		printf("If you want to quit, please press 'e' character!\n");
		ch = getchar();
		
		/* BUG
		if (ch == 'e') {
			printf("Close watchdog an exit safety!\n");
			close(watchdogfd);
			break;
		}
		*/
		
		if (ch == 'r') {
			printf("we don't close watchdog. The machine will reboot in a few seconds!\n");
			printf("wait......\n");
			break;
		}
	}
	
	return 0;
}

教材书使用的是2410的开发板,实验是用2440的开发板,因为2440的晶振比2410快了将近1倍,所以这边拿到2440上跑,喂狗线程函数,不能及时的喂狗,导致自动重启了。所以把线程函数里面的  sleep(20) 改成了sleep(10)即可。

主函数里面的  e  本来是想退出看门狗,测试没效果,还是会自动重启,所以就注释掉了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:164911次
    • 积分:3005
    • 等级:
    • 排名:第11722名
    • 原创:135篇
    • 转载:62篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论