zoukankan      html  css  js  c++  java
  • mini2440 看门狗驱动 WatchDog Driver

    友善官方提供的看门狗长时间运行后,会造成内存泄漏,从而导致系统重启,给应用开发人员带来了一些麻烦。

    我重新写了一下看门狗的驱动,很简单。就是把原有的每次喂狗时分配内存改为初始化时分配。

    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;
    }
    
    

  • 相关阅读:
    现代C++学习笔记之二入门篇2,数据转换
    现代C++学习笔记之二入门篇1
    现代C++学习笔记之一资料篇(C++ 11)
    OSG3.2+Qt5.2.1+VS2012+OSGEarth 2.5编译问题记录
    无法解析的外部符号 _WinMain@16(原)
    qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用(转)
    一些webGL地球的网址
    Windows7下使用sphinx生成开源文档(原)
    VC解决方案,项目,开发一段时间启动调试很慢,半天才开始链接
    SQL笔记
  • 原文地址:https://www.cnblogs.com/yubaolee/p/1827106.html
Copyright © 2011-2022 走看看