WINCE实现重新启动的几种方法

因为要在WINCE上面开发一个系统,监测数据。长时间运行下去容易导致死机。所以设定定时重启。认真分析与查阅相关资料后,发现下面几种方法:

一、使用SetSystemPowerState,通过测试后发现该方法重启的效果并不理想,有点像WINDOWS的注销而不是断电重启。

  1. #Ifndef POWER_STATE_RESET    
  2.  
  3. #define POWER_STATE_RESET DWORD(0x00800000)    
  4.  
  5. #Endif    
  6.  
  7. typedef BOOL (*SetSystemPowerState)(       
  8.  
  9.                                     LPCWSTR psState,    
  10.  
  11.                                     DWORD StateFlags,    
  12.  
  13.                                     DWORD Options    
  14.  
  15.                                     );    
  16.    
  17.  
  18. //在函数中调用如下:    
  19.  
  20. HINSTANCE hModule = LoadLibrary(_T("Coredll.dll"));    
  21.  
  22. SetSystemPowerState f = (SetSystemPowerState)::GetProcAddress
  23. (hModule, TEXT("SetSystemPowerState"));    
  24.  
  25. f(NULL, POWER_STATE_RESET, 0);    
  26.  
  27. ::FreeLibrary(hModule);  

二、使用看门狗,因为看门狗必须定时喂食,所以我在调用时不给它喂食就会造成系统重启。我用的EMD9263的板子,重启代码如下:

  1. #define AT91SAM9263_ENABLE_WATCHDOG         2400    
  2.  
  3. #define AT91SAM9263_DISABLE_WATCHDOG        2401    
  4.  
  5. #define AT91SAM9263_CLEAR_WATCHDOG          2402    
  6.  
  7. #define FILE_DEVICE_DATALINK            0x00000005    
  8.  
  9. #define METHOD_BUFFERED                 0    
  10.  
  11. #define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe    
  12.  
  13. #define CTL_CODE( DeviceType, Function, Method, Access ) (                 \    
  14.  
  15.     ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \    
  16.  
  17.     )    
  18.  
  19.  
  20. #define IOCTL_ENABLE_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, \
  21. AT91SAM9263_ENABLE_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)    
  22.  
  23. #define IOCTL_DISABLE_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, \
  24. AT91SAM9263_DISABLE_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)    
  25.  
  26. #define IOCTL_CLEAR_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, \
  27. AT91SAM9263_CLEAR_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)    
  28.  
  29.      
  30.  
  31. //调用如下:    
  32.  
  33.  HANDLE  hFileWatchdog= CreateFile(_T("DOG1:"),     
  34.  
  35.                                        GENERIC_READ | GENERIC_WRITE,    
  36.  
  37.                                         0,    
  38.  
  39.                                         NULL,     
  40.  
  41.                                         OPEN_EXISTING,    
  42.  
  43.                                         FILE_ATTRIBUTE_NORMAL,    
  44.  
  45.                                         NULL);    
  46.  
  47.     if (hFileWatchdog != INVALID_HANDLE_VALUE)    
  48.  
  49.     {    
  50.  
  51.         DWORD dwReturn;    
  52.  
  53.         BOOL ret=::DeviceIoControl(hFileWatchdog,
  54. IOCTL_ENABLE_WATCHDOG,NULL,0,NULL,0,&dwReturn,NULL);    
  55.  
  56.         if(ret!=TRUE)    
  57.  
  58.         {    
  59.  
  60.             ::CloseHandle(hFileWatchdog);    
  61.  
  62.         }    
  63.  
  64.     }  

在实际运用中,我用的是第二种方法。第一种方法可以适当使用。

补充,第三种方法可以调用KernelIoControl。但在WinCE6.0中,应用程序调用KernelIoControl,会有一些限制。

EVC调KernelIoControl实现热重启

  1. #Include   
  2. #Include   
  3.  
  4.  
  5. #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, \
  6. METHOD_BUFFERED, FILE_ANY_ACCESS)  
  7. extern "C" __declspec(dllimport) BOOL KernelIoControl(  
  8. DWORD dwIoControlCode,   
  9. LPVOID lpInBuf,   
  10. DWORD nInBufSize,   
  11. LPVOID lpOutBuf,   
  12. DWORD nOutBufSize,   
  13. LPDWORD lpBytesReturned);  
  14.  
  15. BOOL ResetPocketPC()  
  16. {  
  17. return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值