shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
阅读:2526回复:8

pxa270唤醒后报错:ERROR: Power Handler function yield to low priority thread.

楼主#
更多 发布于:2008-08-31 19:56
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 中。
http://www.esdevelop.cn
hxmsin
驱动牛犊
驱动牛犊
  • 注册日期2005-02-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望83点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-09-01 06:21
好复杂。。。
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
板凳#
发布于:2008-09-01 09:24
用户被禁言,该主题自动屏蔽!
xinshine
驱动牛犊
驱动牛犊
  • 注册日期2003-11-12
  • 最后登录2011-01-28
  • 粉丝1
  • 关注0
  • 积分7分
  • 威望52点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-09-01 09:31
电源管理部分的代码用到同步事件?不懂为什么要这么做。
即使不报楼主提到的ERROR,用同步事件也打断了系统唤醒的序列。
只有等所有驱动都PowerUp了,系统才会去执行对应的应用程序,所以这个同步信号应该永远等不到。
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-09-01 11:17
感谢回复.现在是就算只加载display驱动和按键的驱动还是报这样的错,倒是把gwes.exe去掉就不会了/

特别注意了一下xxx_powerup/xxx_powerdown函数里面,都没有同步对象,sleep().但还是会出错.实在搞不懂了.是不是还是跟BSP是跟移植的4.0的有关系呢?

也想过用一个wince5的BSP包,但是要移植过来工程也是更加巨大了.
http://www.esdevelop.cn
tracera
禁止发言
禁止发言
  • 注册日期2006-01-09
  • 最后登录2018-09-25
  • 粉丝8
  • 关注0
  • 积分-5788分
  • 威望135321点
  • 贡献值0点
  • 好评度625点
  • 原创分1分
  • 专家分0分
  • 社区居民
5楼#
发布于:2008-09-01 15:55
用户被禁言,该主题自动屏蔽!
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-09-01 17:48
也想过问题是不是出在display驱动,试过网上一个MAINSTONEIII的display驱动,跑不起来,
由于是内核报出来的错,跟踪不到代码,就编译了一个debug版本的NK,也跑不起来.晕死了.MSDN上看的资料应该是唤醒过程xxx_PowerUp的时候release掉了时间片,而ce5.0以前的版本power handle线程的最高优先级是不允许被抢占的,但是5.0以后版本就没有这样的限制了,不知道内核里面这个地方是在哪里控制的.
http://www.esdevelop.cn
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-09-04 10:49
电源管理函数里面使用了api,不管是powerup和powerdown都不能使用api
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-09-04 13:37
引用第7楼ziyun于2008-09-04 10:49发表的  :
电源管理函数里面使用了api,不管是powerup和powerdown都不能使用api

为什么DEBUG版本的就可以呢?
http://www.esdevelop.cn
游客

返回顶部