因为要在WINCE上面开发一个系统,监测数据。长时间运行下去容易导致死机。所以设定定时重启。认真分析与查阅相关资料后,发现下面几种方法:
一、使用SetSystemPowerState,通过测试后发现该方法重启的效果并不理想,有点像WINDOWS的注销而不是断电重启。
- #Ifndef POWER_STATE_RESET
- #define POWER_STATE_RESET DWORD(0x00800000)
- #Endif
- typedef BOOL (*SetSystemPowerState)(
- LPCWSTR psState,
- DWORD StateFlags,
- DWORD Options
- );
- //在函数中调用如下:
- HINSTANCE hModule = LoadLibrary(_T("Coredll.dll"));
- SetSystemPowerState f = (SetSystemPowerState)::GetProcAddress
- (hModule, TEXT("SetSystemPowerState"));
- f(NULL, POWER_STATE_RESET, 0);
- ::FreeLibrary(hModule);
二、使用看门狗,因为看门狗必须定时喂食,所以我在调用时不给它喂食就会造成系统重启。我用的EMD9263的板子,重启代码如下:
- #define AT91SAM9263_ENABLE_WATCHDOG 2400
- #define AT91SAM9263_DISABLE_WATCHDOG 2401
- #define AT91SAM9263_CLEAR_WATCHDOG 2402
- #define FILE_DEVICE_DATALINK 0x00000005
- #define METHOD_BUFFERED 0
- #define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe
- #define CTL_CODE( DeviceType, Function, Method, Access ) ( \
- ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
- )
- #define IOCTL_ENABLE_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, \
- AT91SAM9263_ENABLE_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)
- #define IOCTL_DISABLE_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, \
- AT91SAM9263_DISABLE_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)
- #define IOCTL_CLEAR_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, \
- AT91SAM9263_CLEAR_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)
- //调用如下:
- HANDLE hFileWatchdog= CreateFile(_T("DOG1:"),
- GENERIC_READ | GENERIC_WRITE,
- 0,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (hFileWatchdog != INVALID_HANDLE_VALUE)
- {
- DWORD dwReturn;
- BOOL ret=::DeviceIoControl(hFileWatchdog,
- IOCTL_ENABLE_WATCHDOG,NULL,0,NULL,0,&dwReturn,NULL);
- if(ret!=TRUE)
- {
- ::CloseHandle(hFileWatchdog);
- }
- }
在实际运用中,我用的是第二种方法。第一种方法可以适当使用。
补充,第三种方法可以调用KernelIoControl。但在WinCE6.0中,应用程序调用KernelIoControl,会有一些限制。
EVC调KernelIoControl实现热重启
- #Include
- #Include
- #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, \
- METHOD_BUFFERED, FILE_ANY_ACCESS)
- extern "C" __declspec(dllimport) BOOL KernelIoControl(
- DWORD dwIoControlCode,
- LPVOID lpInBuf,
- DWORD nInBufSize,
- LPVOID lpOutBuf,
- DWORD nOutBufSize,
- LPDWORD lpBytesReturned);
- BOOL ResetPocketPC()
- {
- return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);