各位大侠,我想让系统在每天的某个时间重启,环境是wince。不知道如何实现??
定时器——》控制一个GPIO——》控制 处理器的硬件复位开关通断===success
方法有很多种:
1.楼上所说的通过IO口复位,
2.软件复位,
3.通过别的控制器,例如外加一个单片机,通过发送一条命令让单片机给wince处理器复位,我们很多地方都是这么做的。
感谢回复,能不能说得详细点??
最好是软件复位的方法??
你是做AP还是系统的?
如果是AP,让做系统的给你提供接口就可以了,怎么实现有他们自己决定;
如果是系统,可以用上面的那些方法、也可以利用 看门狗 实现软复位
SetSystemPowerState(),如何调用,参考MSDN
我看网上有说可以通过改变COMS Setup设置来实现??
wince中如何进入COMS Setup呢??我的机器没法用键盘,只有鼠标~~~
#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;
}
这个问题需要系统的支持,也就是说看你的系统是如何设计的。一般要实现系统关闭之后的记忆功能,往往不单纯是使用ARM系统,它外部还用MCU系统。MCU系统负责历史记忆和定时,并且负责与外围的通信。现在的产品一般都会有一个MCU外围。如果没有MCU外围,是很难实现让系统在每天的某一个时间启动的。
引用: 引用 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 );? ?
}
我刚开始就是用的这个函数,没有反应~~
没有反应,说明你的系统本身没有支持,这个需要在底层实现了才会有效的。
引用: 引用 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所要做的是不同的。
引用: 引用 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定时调用就可以了!!
也谢谢大家的帮助!!