阅读:2526回复:8
pxa270唤醒后报错:ERROR: Power Handler function yield to low priority thread.
pxa270唤醒后报错:ERROR: Power Handler function yield to low priority thread.
现在加载的驱动加有touch,LCD,button,backlight了,都特别注意了xxx_powerup,xxx_pwerdown里面没有使用同步对象,但是依然报这个错出来。 况且我的PB是5.0的,不过BSP包是4.0上面移植过来的。不知道有没有原因。 实在没办法了。希望有高人指点一下。 在网上找了一些资料: System Resume from Suspend(PowerOff) ,有時候會出現:ERROR: Power Handler function yield to low priority thread.,google的結果都指向同一個人( Steve Maillet)的回答: In V5.0 MS added a power down thread so that power down handlers are called on a thread instead of in the former no-thread kernel context. The documented idea is that you can now handle synch objects in powerdown code. (There are still limits to synch objects so CloseHandle is still off limits.) Unfortunately, they implemented this in a way that generates the error mentioned if the driver's powerdown function blocks on a thread of lower priority, which would be normal for an application that called into the driver and has acquired a lock on the synch object in question. So the upshot is that you are supposed to be able to do synch stuff in power handlers and under light testing might even seem to work but it is virtually guaranteed to fail at some point in the future, usually well after product release. So don't do that. 所以我知道是因為我修改了backlight powerdown function 中呼叫了有使用Sleep( )的function。 我把那個function 中的Sleep( )改成for( ) delay 後,error message就沒有出現了 (該sleep 是在polling hardware state,所以可以這樣改)。 但是,剛剛的回答的意思,到底在CE 5.0 中,Power Handler (XXX_PowerUp/PowerDown)可不可以使用 系統同步物件(event, semaphore, mutex....) ? Ask Robert,他說在CE 4.0 中的確是不行的,雖然compile可以過,但是實際執行,在call Win32 function 時會出現 complain message。 但是CE 5.0 後就沒有出現這個message了。 看看source code.. SC_PowerOffSystem( ) SetThreadPriority (CurThread, 0); SetThreadQuantum (CurThread, 0); .... CallPowerProc (GwesPowerProc....)); CallPowerProc (PowerProc.......)); Call (CallOEMPowerOff); CallPowerProc (PowerProc.......)); CallPowerProc (GwesPowerProc....)); .... SetThreadQuantum (CurThread, Quantum); SetThreadPriority (CurThread, Prio);可以看到整個poweroff 的動作是對稱的.. 先設定將目前thread的priority 為最高,timeslice 為"永遠" 呼叫GWES driver的power off function 呼叫PowerProc,會一一呼叫各device driver的PowerDown( ) 硬體 poweroff ---- suspend,直到有人power - resume 呼叫PowerProc,會一一呼叫各device driver的PowerUp( ) 呼叫GWES driver的Power on function 將目前的thread設回原來的TimeSlice & Priority Device Driver 的PowerUp/Down function 就是在PowerProc( )呼叫的,也就是run 在priority 最高,no timeslice consume 的狀態。 除非該driver funciton 自行release 控制全,否則不會被task switch 掉。 但是因為不知道call 這個function 的Process是誰,所以無法知道是Kernel fork 的Thread 還是屬於呼叫的User Application 中。 |
|
|
沙发#
发布于:2008-09-01 06:21
好复杂。。。
|
|
板凳#
发布于:2008-09-01 09:24
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2008-09-01 09:31
电源管理部分的代码用到同步事件?不懂为什么要这么做。
即使不报楼主提到的ERROR,用同步事件也打断了系统唤醒的序列。 只有等所有驱动都PowerUp了,系统才会去执行对应的应用程序,所以这个同步信号应该永远等不到。 |
|
地下室#
发布于:2008-09-01 11:17
感谢回复.现在是就算只加载display驱动和按键的驱动还是报这样的错,倒是把gwes.exe去掉就不会了/
特别注意了一下xxx_powerup/xxx_powerdown函数里面,都没有同步对象,sleep().但还是会出错.实在搞不懂了.是不是还是跟BSP是跟移植的4.0的有关系呢? 也想过用一个wince5的BSP包,但是要移植过来工程也是更加巨大了. |
|
|
5楼#
发布于:2008-09-01 15:55
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于:2008-09-01 17:48
也想过问题是不是出在display驱动,试过网上一个MAINSTONEIII的display驱动,跑不起来,
由于是内核报出来的错,跟踪不到代码,就编译了一个debug版本的NK,也跑不起来.晕死了.MSDN上看的资料应该是唤醒过程xxx_PowerUp的时候release掉了时间片,而ce5.0以前的版本power handle线程的最高优先级是不允许被抢占的,但是5.0以后版本就没有这样的限制了,不知道内核里面这个地方是在哪里控制的. |
|
|
7楼#
发布于:2008-09-04 10:49
电源管理函数里面使用了api,不管是powerup和powerdown都不能使用api
|
|
8楼#
发布于:2008-09-04 13:37
引用第7楼ziyun于2008-09-04 10:49发表的 : 为什么DEBUG版本的就可以呢? |
|
|