课堂实践2:
•micro2440开发板上,watchdog的驱动已经编译进内核,参照教材PP290-291页的程序,编写watchdog驱动的测试程序。
•看门狗驱动程序位于开发板内核源文件(仅供参考):
–Linux-2.6.29/drivers/watchdog/s3c2410_wdt.c
教材书使用的是2410的开发板,实验是用2440的开发板,因为2440的晶振比2410快了将近1倍,所以这边拿到2440上跑,喂狗线程函数,不能及时的喂狗,导致自动重启了。所以把线程函数里面的 sleep(20) 改成了sleep(10)即可。
主函数里面的 e 本来是想退出看门狗,测试没效果,还是会自动重启,所以就注释掉了。
#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 本来是想退出看门狗,测试没效果,还是会自动重启,所以就注释掉了。