WINCE重新启动

因为要在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);
        }
    }  

 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值