wince中如何定时重启??

wdwcymwjy   2010-1-28 19:47 楼主
各位大侠,我想让系统在每天的某个时间重启,环境是wince。不知道如何实现??

回复评论 (18)

定时器——》控制一个GPIO——》控制 处理器的硬件复位开关通断===success
点赞  2010-1-28 19:50
方法有很多种:
1.楼上所说的通过IO口复位,
2.软件复位,
3.通过别的控制器,例如外加一个单片机,通过发送一条命令让单片机给wince处理器复位,我们很多地方都是这么做的。
点赞  2010-1-28 20:05
感谢回复,能不能说得详细点??
最好是软件复位的方法??
点赞  2010-1-28 20:17
你是做AP还是系统的?
如果是AP,让做系统的给你提供接口就可以了,怎么实现有他们自己决定;
如果是系统,可以用上面的那些方法、也可以利用 看门狗 实现软复位
点赞  2010-1-28 22:31
做个watchdog就行了
点赞  2010-1-29 08:36
学习了  呵呵呵
点赞  2010-1-29 08:39
引用: 引用 3 楼 muyizhaoyang 的回复:
感谢回复,能不能说得详细点??
最好是软件复位的方法??


定时,调用系统API
点赞  2010-1-29 08:41
SetSystemPowerState(),如何调用,参考MSDN
点赞  2010-1-29 08:42
引用: 引用 4 楼 hahagoodhaha 的回复:
你是做AP还是系统的?
如果是AP,让做系统的给你提供接口就可以了,怎么实现有他们自己决定;
如果是系统,可以用上面的那些方法、也可以利用 看门狗 实现软复位


做系统
点赞  2010-1-29 08:57
我看网上有说可以通过改变COMS Setup设置来实现??
wince中如何进入COMS Setup呢??我的机器没法用键盘,只有鼠标~~~
点赞  2010-1-29 08:59
#ifndef POWER_STATE_RESET
#define POWER_STATE_RESET DWORD(0x00800000)
#endif

BOOL WINAPI RebootSystem()
{
    //return KernelIoControl(IOCTL_HAL_REBOOT,NULL, 0, NULL, 0, NULL);
        HINSTANCE hModule = LoadLibrary(TEXT("Coredll.dll"));
        SetSystemPowerStateFunction f = (SetSystemPowerStateFunction)::GetProcAddress(hModule, TEXT("SetSystemPowerState"));
    f(NULL, POWER_STATE_RESET, 0);
    ::FreeLibrary(hModule);
    return TRUE;
}
点赞  2010-1-29 08:59
引用: 引用 8 楼 91program 的回复:
SetSystemPowerState(),如何调用,参考MSDN


谢谢,我看看。
点赞  2010-1-29 08:59
可以通过定时器加软件重启实现
软件重启代码你可以参考一下:

  1. #define IOCTL_HAL_REBOOT    CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)

  2. extern "C" __declspec(dllimport) BOOL KernelIoControl( DWORD dwIoControlCode,         
  3.                                                                                                           LPVOID lpInBuf,         
  4.                                                                                                           DWORD nInBufSize,         
  5.                                                                                                           LPVOID lpOutBuf,         
  6.                                                                                                           DWORD nOutBufSize,         
  7.                                                                                                           LPDWORD lpBytesReturned);



  8. //        dwType = 1:     // for COLD_Boot
  9. //        dwType = 2:     // for WARM_Boot
  10. //        dwType = 3:     // for SOFT_Boot
  11. void  SysReboot( DWORD dwType )
  12. {
  13.         KernelIoControl( IOCTL_HAL_REBOOT, (LPVOID)&dwType, sizeof(DWORD), NULL, 0, NULL );       
  14. }
点赞  2010-1-29 09:03
这个问题需要系统的支持,也就是说看你的系统是如何设计的。一般要实现系统关闭之后的记忆功能,往往不单纯是使用ARM系统,它外部还用MCU系统。MCU系统负责历史记忆和定时,并且负责与外围的通信。现在的产品一般都会有一个MCU外围。如果没有MCU外围,是很难实现让系统在每天的某一个时间启动的。
点赞  2010-1-29 09:19
引用: 引用 13 楼 feihu521a 的回复:
可以通过定时器加软件重启实现
软件重启代码你可以参考一下:
C/C++ code#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);//    dwType = 1:// for COLD_Boot//    dwType = 2:// for WARM_Boot//    dwType = 3:// for SOFT_Bootvoid  SysReboot( DWORD dwType )
{
    KernelIoControl( IOCTL_HAL_REBOOT, (LPVOID)&dwType,sizeof(DWORD), NULL,0, NULL );   
}



我刚开始就是用的这个函数,没有反应~~
点赞  2010-1-29 10:03
引用: 引用 15 楼 muyizhaoyang 的回复:
引用 13 楼 feihu521a 的回复:
可以通过定时器加软件重启实现
软件重启代码你可以参考一下:
C/C++ code#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);//? ? dwType = 1:// for COLD_Boot//? ? dwType = 2:// for WARM_Boot//? ? dwType = 3:// for SOFT_Bootvoid? SysReboot( DWORD dwType )
{
? ? KernelIoControl( IOCTL_HAL_REBOOT, (LPVOID)&dwType,sizeof(DWORD), NULL,0, NULL );? ?
}



我刚开始就是用的这个函数,没有反应~~


没有反应,说明你的系统本身没有支持,这个需要在底层实现了才会有效的。
点赞  2010-1-29 10:05
引用: 引用 15 楼 muyizhaoyang 的回复:
引用 13 楼 feihu521a 的回复:
可以通过定时器加软件重启实现
软件重启代码你可以参考一下:
C/C++ code#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);//? ? dwType = 1:// for COLD_Boot//? ? dwType = 2:// for WARM_Boot//? ? dwType = 3:// for SOFT_Bootvoid? SysReboot( DWORD dwType )
{
? ? KernelIoControl( IOCTL_HAL_REBOOT, (LPVOID)&dwType,sizeof(DWORD), NULL,0, NULL );? ?
}



我刚开始就是用的这个函数,没有反应~~

要在OAL层添加相关的代码,不同的平台,reboot所要做的是不同的。
点赞  2010-1-29 10:15
引用: 引用 11 楼 qwqwqw408 的回复:
#ifndef POWER_STATE_RESET
#define POWER_STATE_RESET DWORD(0x00800000)
#endif

BOOL WINAPI RebootSystem()
{
? ? //return KernelIoControl(IOCTL_HAL_REBOOT,NULL, 0, NULL, 0, NULL);
HINSTANCE hModule = LoadLibrary(TEXT("Coredll.dll"));
SetSystemPowerStateFunction f = (SetSystemPowerStateFunction)::GetProcAddress(hModule, TEXT("SetSystemPowerState"));
? ? f(NULL, POWER_STATE_RESET, 0);
? ? ::FreeLibrary(hModule);
? ? return TRUE;
}


万分感谢!!你的代码可以用。我直接自己建了个小程序,用OnTimer定时调用就可以了!!
也谢谢大家的帮助!!
点赞  2010-1-29 10:51
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复