友善官方提供的看门狗长时间运行后,会造成内存泄漏,从而导致系统重启,给应用开发人员带来了一些麻烦。
我重新写了一下看门狗的驱动,很简单。就是把原有的每次喂狗时分配内存改为初始化时分配。
volatile WATCHreg *s2440WDT = 0; static BOOL FeedIt() { s2440WDT->rWTCON = 0x8021; // Init Value s2440WDT->rWTDAT = s2440WDT->rWTCNT = 0xFEA9; s2440WDT->rWTCON = ( 1 << 0) | (0x03 << 3 ) | (1 << 5) | (0x5A << 8); RETAILMSG(1,(TEXT("WDT: feed ok\r\n"))); return TRUE; } BOOL WINAPI DllEntry(HANDLE hinstDLL, DWORD dwReason, LPVOID Reserved/* lpvReserved */) { switch(dwReason) { case DLL_PROCESS_ATTACH: DEBUGREGISTER((HINSTANCE)hinstDLL); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; #ifdef UNDER_CE case DLL_PROCESS_EXITING: break; case DLL_SYSTEM_STARTED: break; #endif } return TRUE; } BOOL WDT_Deinit(DWORD hDeviceContext) { return TRUE; } BOOL WDT_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { return 0; } void WDT_PowerDown(DWORD hDeviceContext) { } void WDT_PowerUp(DWORD hDeviceContext) { } DWORD WDT_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { return 0; } DWORD WDT_Seek(DWORD hOpenContext, long Amount, DWORD Type) { return 0; } DWORD WDT_Init(DWORD dwContext) { do { s2440WDT = (volatile WATCHreg *) VirtualAlloc(0,sizeof(WATCHreg),MEM_RESERVE, PAGE_NOACCESS); if (s2440WDT == 0) { break; } if (!VirtualCopy((PVOID)s2440WDT,(PVOID)(WATCH_BASE),sizeof(WATCHreg),PAGE_READWRITE | PAGE_NOCACHE )) { break; } //ret = TRUE; RETAILMSG(1,(TEXT("WDT: VirtualAlloc ok\r\n"))); } while (0); RETAILMSG(1,(TEXT("WDT: Init\r\n"))); return TRUE; } BOOL WDT_Close(DWORD hOpenContext) { if (s2440WDT) { VirtualFree((void*)s2440WDT, sizeof(WATCHreg), MEM_RELEASE); s2440WDT = 0; RETAILMSG(1,(TEXT("WDT: VirtualFree ok\r\n"))); } RETAILMSG(1,(TEXT("WDT: Close\r\n"))); return TRUE; } // Beaf is here DWORD WDT_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { RETAILMSG(1,(TEXT("WDT: Open\r\n"))); FeedIt(); return TRUE; } DWORD WDT_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes) { RETAILMSG(1,(TEXT("WDT: Write\r\n"))); FeedIt(); return TRUE; }