关于休眠和唤醒,我现在用按键做休眠和唤醒没有问题,但是如果我让系统自动休眠,则用按键唤醒回来就会出错。
经过对比串口信息,发现,系统自动的休眠并没有进入suspend状态,而是idle状态。而我在idle状态下按键唤醒,系统却认为我的按键的目的是要进入suspend,所以出错。
//系统自动进入idle状态
PWM: PBT_TRANSITION to system power state [Flags: 0x0]: 'systemidle'
PWM: Power State Flags:0x0
PWM: set backlight to D4
……………………………………
//执行OEMPowerOff
======+OEMPowerOff()!!======
……………………………………
======-XllpPmSleepCLevelProcessing()======
//按下唤醒按键
======+BSPPowerON()======
……………………
======PWB_PowerUp()======
PWM: PBT_TRANSITION to system power state [Flags: 0x200000]: 'suspend'
PWM: POWER_STATE_SUSPEND
PWM: Waiting for PM state transition notification
//出错,data abort
Data Abort: Thread=83f638ec Proc=8042f0a0 'device.exe'
AKY=00000005 PC=027d2b24(battdrvr.dll+0x00002b24) RA=027d24c8(battdrvr.dll+0x000024c8) BVA=06420000 FSR=000004f6
一开始以为是battery驱动的问题,但是如果用按键做休眠和唤醒就没有问题,是否说明battery驱动是OK呢?
请大家帮忙看看,如何让系统自动能够进入suspend状态?
谢谢!
7 个解决方案
#1
关于系统自动休眠的流程,请高手指点一下,非常感谢。
#2
问题可能并不像我一楼所说,但是我想知道如何让系统直接进入suspend,而不是sysidle。谢谢
#3
“系统却认为我的按键的目的是要进入suspend”,这个不是“系统认为”的,系统可没这么智能。
这是“睡眠唤醒”按键驱动中实现的,发现按下后,根据当前状态,判断需要进入什么状态,然后向系统提交相应的电源管理事件,系统才会照做。
也就是说,在这个驱动中,首先要判断当前处于什么状态下,然后再处理。只要处于非全速工作模式(RUN)下(suspend, idle),就唤醒。
这是“睡眠唤醒”按键驱动中实现的,发现按下后,根据当前状态,判断需要进入什么状态,然后向系统提交相应的电源管理事件,系统才会照做。
也就是说,在这个驱动中,首先要判断当前处于什么状态下,然后再处理。只要处于非全速工作模式(RUN)下(suspend, idle),就唤醒。
#4
除非你自己定制Power management,这样可以让系统直接进入Suspend,不然默认的系统先是进UserIdle,然后SystemIdle,然后才会进suspend
另外你把Power Button按下后处理的代码贴出来看看,调用不同的函数进suspend处理的过程是不一样的,现在一般是用SetSystemPowerState来做状态切换
另外你的Battery驱动应该是有问题的,不然不管怎么样状态切换,都不应该会出Data Abort的异常
另外你把Power Button按下后处理的代码贴出来看看,调用不同的函数进suspend处理的过程是不一样的,现在一般是用SetSystemPowerState来做状态切换
另外你的Battery驱动应该是有问题的,不然不管怎么样状态切换,都不应该会出Data Abort的异常
#5
我在按键按下的时候发送了SetSystemPowerState(NULL, POWER_STATE_SUSPEND, 0),所以系统知道我按下按键就会进入suspend状态。在wince的控制面板中的power页面,可以设置系统多长时间进入useridle,systemidle,和suspend状态,但是我设置之后,到时间后系统会进入useridle和systemidle状态,然后就会poweroff,并不会进入suspend状态。这是我感到比较奇怪的地方,不知道是哪里出了问题。
#6
你看一下你的BSP里面off.c文件里面的函数OEMPoweroff,看它最后调用的CPU进入的是什么状态?
我估计你进的是Deep Sleep Mode,而不是Sleep Mode?
另外你怎么判断系统是进了poweroff而不是suspend呢?量一下CPU的PWR_ENpin的电压
我估计你进的是Deep Sleep Mode,而不是Sleep Mode?
另外你怎么判断系统是进了poweroff而不是suspend呢?量一下CPU的PWR_ENpin的电压
#7
谢谢大家的回答,是我搞错了,系统应该是进入和suspend状态,出错是驱动的问题。非常感谢,此贴结贴。
#1
关于系统自动休眠的流程,请高手指点一下,非常感谢。
#2
问题可能并不像我一楼所说,但是我想知道如何让系统直接进入suspend,而不是sysidle。谢谢
#3
“系统却认为我的按键的目的是要进入suspend”,这个不是“系统认为”的,系统可没这么智能。
这是“睡眠唤醒”按键驱动中实现的,发现按下后,根据当前状态,判断需要进入什么状态,然后向系统提交相应的电源管理事件,系统才会照做。
也就是说,在这个驱动中,首先要判断当前处于什么状态下,然后再处理。只要处于非全速工作模式(RUN)下(suspend, idle),就唤醒。
这是“睡眠唤醒”按键驱动中实现的,发现按下后,根据当前状态,判断需要进入什么状态,然后向系统提交相应的电源管理事件,系统才会照做。
也就是说,在这个驱动中,首先要判断当前处于什么状态下,然后再处理。只要处于非全速工作模式(RUN)下(suspend, idle),就唤醒。
#4
除非你自己定制Power management,这样可以让系统直接进入Suspend,不然默认的系统先是进UserIdle,然后SystemIdle,然后才会进suspend
另外你把Power Button按下后处理的代码贴出来看看,调用不同的函数进suspend处理的过程是不一样的,现在一般是用SetSystemPowerState来做状态切换
另外你的Battery驱动应该是有问题的,不然不管怎么样状态切换,都不应该会出Data Abort的异常
另外你把Power Button按下后处理的代码贴出来看看,调用不同的函数进suspend处理的过程是不一样的,现在一般是用SetSystemPowerState来做状态切换
另外你的Battery驱动应该是有问题的,不然不管怎么样状态切换,都不应该会出Data Abort的异常
#5
我在按键按下的时候发送了SetSystemPowerState(NULL, POWER_STATE_SUSPEND, 0),所以系统知道我按下按键就会进入suspend状态。在wince的控制面板中的power页面,可以设置系统多长时间进入useridle,systemidle,和suspend状态,但是我设置之后,到时间后系统会进入useridle和systemidle状态,然后就会poweroff,并不会进入suspend状态。这是我感到比较奇怪的地方,不知道是哪里出了问题。
#6
你看一下你的BSP里面off.c文件里面的函数OEMPoweroff,看它最后调用的CPU进入的是什么状态?
我估计你进的是Deep Sleep Mode,而不是Sleep Mode?
另外你怎么判断系统是进了poweroff而不是suspend呢?量一下CPU的PWR_ENpin的电压
我估计你进的是Deep Sleep Mode,而不是Sleep Mode?
另外你怎么判断系统是进了poweroff而不是suspend呢?量一下CPU的PWR_ENpin的电压
#7
谢谢大家的回答,是我搞错了,系统应该是进入和suspend状态,出错是驱动的问题。非常感谢,此贴结贴。