公司的板子要求有看门狗,自己在驱动层做了一个,利用流驱动在系统加载这个驱动的时候就开启看门狗,在驱动中还开启了一个线程,定时喂狗。驱动很简单。主要函数是下面几个:
DWORD WTD_Init(DWORD dwContext) //驱动加载时候调用这个init函数,在这里开启看门狗
{
  HANDLE  hThread;
  SLEEP_TIME = 100;
  v_pWTDregs = (volatile WATCHreg *)WTD_RegAlloc((PVOID)WATCH_BASE, sizeof(WATCHreg));
  if (v_pWTDregs == NULL)
  {
     return 0;
  }
  else RETAILMSG(0,(TEXT("For v_pWTDregs: VirtualAlloc success!\r\n")));
  //设置watchdog并开启watchdog的程序
            v_pWTDregs->rWTCON=0x7F81;
              v_pWTDregs->rWTDAT=0x8000;
              v_pWTDregs->rWTCON|=1<<5;
    hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FeedDog,NULL,0,NULL);//开启喂狗线程 
  return TRUE;  
}
void  FeedDog(void)//喂狗函数
{
  while(1)
  {  Sleep(SLEEP_TIME);//设置喂狗间隔时间,需要根据自己的时钟频率计算
     v_pWTDregs->rWTCNT=0x8000;//更新看门狗计数器
   }
}
BOOL WTD_Deinit( DWORD hDeviceContext )
{
  v_pWTDregs->rWTCON &=0<<5;//关闭看门狗
 return TRUE;
}
这个程序也有一些问题,就是sleep函数定时并不准确,我在这里无法得到一个确切的时间间隔,所以更好的办法应该是自己再开启一个定时器,利用那个定时器来设置喂狗时间。