對(duì)于手持式、便攜式等移動(dòng)設(shè)備來(lái)講,為了讓設(shè)備有更長(zhǎng)的待機(jī)和工作時(shí)間,系統(tǒng)必需具備完善的電源管理功能。英創(chuàng)公司針對(duì)手持式、電池供電設(shè)備應(yīng)用而推出的嵌入式核心主板EM9283,預(yù)裝了Windows CE6.0操作系統(tǒng),提供了完善的電源管理支持。在與EM9283配套的通用開(kāi)發(fā)評(píng)估底板上測(cè)得的EM9283在各個(gè)電源狀態(tài)下的功耗指標(biāo)為:
? 系統(tǒng)正常運(yùn)行:110mA
? 系統(tǒng)掛起:8mA。通過(guò)PSwitch鍵,可在1S內(nèi)恢復(fù)到正常運(yùn)行狀態(tài)
? 系統(tǒng)關(guān)機(jī):<15uA。系統(tǒng)僅維持實(shí)時(shí)時(shí)鐘的供電,系統(tǒng)重新啟動(dòng)時(shí)間小于10S
本文將以EM9283為例,介紹用戶應(yīng)用程序如何實(shí)現(xiàn)電源管理,以減少整機(jī)功耗,延長(zhǎng)設(shè)備工作時(shí)間。在這之前,有必要先對(duì)Windows CE系統(tǒng)的電源管理功能做一個(gè)了解。所以我們將先介紹WinCE系統(tǒng)的電源狀態(tài),然后是設(shè)備的電源狀態(tài),接著才是應(yīng)用程序電源管理。文檔的最后是一個(gè)實(shí)際的電源管理例子:LCD背光的電源管理。
1、系統(tǒng)電源狀態(tài)
上面提到了EM9283的運(yùn)行,掛起和關(guān)機(jī)三種直觀電源狀態(tài)下的功耗指示,而至Windows CE.NET 4.2版本以后的系統(tǒng)具有的高級(jí)電源管理組件:WinCE電源管理器,為系統(tǒng)定義的電源狀態(tài)如表1:
系統(tǒng)電源狀態(tài) | 簡(jiǎn)要描述 |
On | 用戶與系統(tǒng)交互的常規(guī)運(yùn)行狀態(tài) |
UserIdle | 用戶與設(shè)備停止交互,但仍可能使用設(shè)備 |
SystemIdle | 經(jīng)過(guò)一段時(shí)間UserIdle后進(jìn)入此狀態(tài),但驅(qū)動(dòng)和系統(tǒng)仍然活動(dòng) |
SystemIdle | 掛起狀態(tài),系統(tǒng)大部分外設(shè)關(guān)閉,僅RAM外于自刷新?tīng)顟B(tài) |
WinCE電源管理器維護(hù)了一個(gè)監(jiān)控用戶活動(dòng)的定時(shí)器,通過(guò)監(jiān)控這個(gè)定時(shí)器的超時(shí)來(lái)使系統(tǒng)進(jìn)入用戶空閑模式、系統(tǒng)空閑模式,最終掛起系統(tǒng)。基本的電源管理功能所采用的節(jié)能方法是使系統(tǒng)適時(shí)的進(jìn)入掛起狀態(tài),此時(shí)系統(tǒng)RAM處于自刷新?tīng)顟B(tài),整機(jī)功耗降到了較
低的水平,同時(shí)又能快速恢復(fù)到正常運(yùn)行狀態(tài)。下面的幾種方法都可以讓系統(tǒng)進(jìn)入Suspend狀態(tài):
1、監(jiān)控的用戶活動(dòng)定時(shí)器超時(shí)。通過(guò)控制面板里的電源屬性項(xiàng)設(shè)置超時(shí)時(shí)間。如圖1
圖1中設(shè)置的意圖是:在電池供電情況下,當(dāng)用戶停止操作1分鐘后,系統(tǒng)電源管理器將控制系統(tǒng)進(jìn)入用戶空閑模式,如果2分鐘后用戶仍然沒(méi)有操作,系統(tǒng)進(jìn)入系統(tǒng)空閑狀態(tài),系統(tǒng)空閑3分鐘后還是沒(méi)有用戶操作,系統(tǒng)掛起。
在用戶的最終產(chǎn)品中,由于種種原因,可能不能通過(guò)控制面板來(lái)直接設(shè)置系統(tǒng)超時(shí),或者用戶希望自己設(shè)計(jì)設(shè)置系統(tǒng)超時(shí)的界面,此時(shí)用戶應(yīng)用程序可以通過(guò)修改系統(tǒng)注冊(cè)表來(lái)實(shí)現(xiàn)與通過(guò)控制面板設(shè)置一樣的功能。具體的做法是修改[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Power\Timeouts]下面的超時(shí)時(shí)間。通過(guò)控制面板設(shè)置后的注冊(cè)表如圖2所示。
可以看到,在注冊(cè)中超時(shí)時(shí)間的單位是秒。應(yīng)用程序要利用系統(tǒng)的電源管理器,除了在控制面板中做了上述設(shè)置外,還需要在應(yīng)用程序啟動(dòng)時(shí)設(shè)置系統(tǒng)的'PowerManager/ReloadActivityTimeouts'自動(dòng)事件為有信號(hào)狀態(tài),電源管理器才會(huì)正常工作。當(dāng)在應(yīng)用程序中直接修改了對(duì)應(yīng)的Timeouts注冊(cè)表項(xiàng)后,也需要打開(kāi)(或創(chuàng)建)'PowerManager/ReloadActivityTimeouts'的自動(dòng)重置事件,并SetEvent置這個(gè)事件為有信號(hào)狀態(tài),這樣可以使電源管理器再次從注冊(cè)表中讀取狀態(tài)切換定時(shí)器的設(shè)置。
HANDLE hReloadActivityTimeouts;
hReloadActivityTimeouts = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T('PowerManager/ReloadActivityTimeouts'));
if(hReloadActivityTimeouts)
{
SetEvent(hReloadActivityTimeouts);
CloseHandle(hReloadActivityTimeouts);
}
2、應(yīng)用程序調(diào)用API。除了通過(guò)超時(shí)讓系統(tǒng)自動(dòng)進(jìn)入掛起狀態(tài)外,應(yīng)用程序還可以調(diào)用API函數(shù)讓系統(tǒng)掛起:SetSystemPowerState(NULL,POWER_STATE_SUSPEND,0);
3、EM9283提供了一鍵開(kāi)關(guān)機(jī)PSwitch鍵。所以最直接的方法是通過(guò)PSwitch按鍵讓系統(tǒng)在掛起狀態(tài)和運(yùn)行狀態(tài)之間切換。
通過(guò)上面的三種方法讓可以讓系統(tǒng)掛起,而當(dāng)下面的一種事件發(fā)生時(shí),系統(tǒng)將退出掛起狀態(tài):
1、用戶再次按下PSwitch鍵。
2、發(fā)生某個(gè)警告事件,如時(shí)間定時(shí)器到時(shí)提醒。
3、發(fā)生某個(gè)喚醒事件。
2、設(shè)備電源狀態(tài)
雖然通過(guò)用戶操作、應(yīng)用程序或者外設(shè)都可以使系統(tǒng)進(jìn)入或退出掛起狀態(tài),但基本的電源管理功能所能控制的粒度過(guò)大,整個(gè)系統(tǒng)只有三種狀態(tài),On,Idle和Suspend,對(duì)應(yīng)于所有外設(shè)只有On和Suspend兩種狀態(tài)。加入了電源管理組件的Windows CE具有高級(jí)的電源管理功能,它允許每個(gè)外設(shè)具有自己的電源狀態(tài)——設(shè)備電源狀態(tài)。應(yīng)用程序有能力單獨(dú)設(shè)置外設(shè)的電源狀態(tài),比如在保持串口通訊時(shí),關(guān)閉顯示和背光。Wince通常對(duì)設(shè)備電源狀態(tài)的描述如表2:
設(shè)備電源狀態(tài) | 注冊(cè)表鍵值 | 描述 |
Full on | D0 | 此狀態(tài)表示設(shè)備已開(kāi)啟或正在運(yùn)行,設(shè)備將以系統(tǒng)允許的最在功耗及最高性能運(yùn)行 |
Low on | D1 | 此狀態(tài)表示設(shè)備已開(kāi)啟或正在運(yùn)行,但以低于D0狀態(tài)的功耗及性能運(yùn)行。D1狀態(tài)適用于設(shè)備已經(jīng)被使用,但以較低的性能運(yùn)行即可 |
Standby | D2 | 此狀態(tài)表示設(shè)備被部份供電 |
Sleep | D3 | 睡眠狀態(tài)。保證喚醒的最小供電,在需要時(shí)能自動(dòng)喚醒并初始化 |
off | D4 | 關(guān)閉狀態(tài),不供電 |
物理設(shè)備并不需要支持上面所有的設(shè)備電源狀態(tài),但所有設(shè)備必需要支持D0電源狀態(tài),EM9283上的各種外設(shè),如背光、顯示等至少支持D0和D4兩種狀態(tài),也就是說(shuō)應(yīng)用程序在能力決定是否單獨(dú)給某個(gè)設(shè)備供電,以盡可能降低整機(jī)功耗。
3、應(yīng)用程序電源管理
上面所提的系統(tǒng)電源狀態(tài)和設(shè)備電源狀態(tài)都是系統(tǒng)或驅(qū)動(dòng)一級(jí)對(duì)電源管理的支持,對(duì)使用英創(chuàng)公司工控主板的用戶來(lái)講,這些功能都是由英創(chuàng)公司直接提供并維護(hù)的,用戶如果知道如何利用系統(tǒng)提供的這些功能,就能輕松實(shí)現(xiàn)適用于自己設(shè)備的電源管理策略。
電源管理器提供了一組接口供應(yīng)用程序參與到電源管理的活動(dòng)中,應(yīng)用程序可以通過(guò)RequestPowerNotifications函數(shù)請(qǐng)求電源管理器向其發(fā)送電源相關(guān)的通知,也可以通過(guò)SetPowerRequirement通知電源管理器將設(shè)備設(shè)置在特殊的電源狀態(tài)下。這樣,指定設(shè)備的電源狀態(tài)就不會(huì)隨系統(tǒng)電源狀態(tài)的改變而改變。
3.1 電源通知機(jī)制
電源相關(guān)的通知通過(guò)消息隊(duì)列傳遞給應(yīng)用程序,通常應(yīng)用程序新建一個(gè)消息隊(duì)列,并通過(guò)RequestPowerNotifications將這個(gè)消息隊(duì)列的句柄傳遞給電源管理器,同時(shí)創(chuàng)建一個(gè)線程偵聽(tīng)來(lái)自這個(gè)隊(duì)列的消息。電源管理器定義了如下幾種通知:
? PBT_RESUME:當(dāng)系統(tǒng)從休眠狀態(tài)被喚醒是產(chǎn)生;
? PBT_POWERSTATUSCHANGE:當(dāng)系統(tǒng)接入或者斷開(kāi)外部電源時(shí)產(chǎn)生;
? PBT_TRANSITION:當(dāng)電源管理器執(zhí)行系統(tǒng)電源狀態(tài)轉(zhuǎn)換時(shí)發(fā)生;
? PBT_POWERINFOCHANGE:當(dāng)電池信息更新時(shí)發(fā)生。
下面的代碼演示了應(yīng)用程序如何偵聽(tīng)電源管理器發(fā)出的通知。
// 1.新建一個(gè)消息隊(duì)列
ghPowerNotifications= CreateMsgQueue(NULL, &msgOptions);
if (!ghPowerNotifications) {
DWORD dwErr = GetLastError();
RETAILMSG(1, (TEXT('%s:CreateMessageQueue ERROR:%d\n'), pszFname, dwErr));
goto _Exit;
}
// 2.請(qǐng)求得到電源通知
hNotifications = RequestPowerNotifications(ghPowerNotifications, POWER_NOTIFY_ALL);
if (!hNotifications) {
DWORD dwErr = GetLastError();
RETAILMSG(TRUE, (TEXT('%s:RequestPowerNotifications ERROR:%d\n'), pszFname, dwErr));
goto _Exit;
}
// 3.創(chuàng)建偵聽(tīng)線程
ht = CreateThread(NULL, 0, ProcessPowerNotification, NULL, 0, NULL);
// 4.電源通知消息偵聽(tīng)線程
void ProcessPowerNotification(HANDLE hMsgQ)
{
……
if (ReadMsgQueue(hMsgQ, buf, QUEUE_SIZE, (LPDWORD)&dwSize, 0, &dwStatus))
{……} // 5.電源通知消息處理
3.2 電源請(qǐng)求機(jī)制
電源請(qǐng)求機(jī)制為應(yīng)用程序提供了強(qiáng)大的能力控制電源管理器調(diào)整設(shè)備的電源等級(jí),與其他所有的電源設(shè)置相比,它具有很高的優(yōu)先級(jí)。舉例來(lái)說(shuō),假設(shè)有一個(gè)條形碼閱讀器連接在COM3端口,并且COM3只有在最高電源等級(jí)(D0)時(shí)才能驅(qū)動(dòng)這個(gè)條形碼閱讀器。為了使其正常工作,應(yīng)用程序?qū)⒄{(diào)用SetPowerRequirement把COM3指定為D0狀態(tài)。假設(shè)之后串口驅(qū)動(dòng)自身決定降低一個(gè)電源等級(jí),驅(qū)動(dòng)程序調(diào)用DevicePowerNotify通知電源管理器它期望的設(shè)備電源狀態(tài)D1,實(shí)際上驅(qū)動(dòng)程序的這個(gè)請(qǐng)求將不起作用,直到應(yīng)用程序調(diào)用ReleasePowerRequirement為止。繼續(xù)這個(gè)例子,假設(shè)這時(shí)的系統(tǒng)電源狀態(tài)轉(zhuǎn)換為低能耗等級(jí),雖然與系統(tǒng)電源狀態(tài)對(duì)應(yīng)的COM3電源等級(jí)為D2,由于應(yīng)用程序的電源請(qǐng)求,COM3仍將繼續(xù)維持在D0狀態(tài)。
在調(diào)用SetPowerRequirement函數(shù)時(shí),指定POWER_FORCE標(biāo)志將強(qiáng)制設(shè)備不進(jìn)入休眠狀態(tài),即使這時(shí)系統(tǒng)已處于休眠狀態(tài)。
3.3 設(shè)置電源狀態(tài)
在某些應(yīng)用的場(chǎng)合下,應(yīng)用程序可能需要改變系統(tǒng)的電源狀態(tài)。 應(yīng)用程序可以通過(guò)GetSystemPowerState返回當(dāng)前系統(tǒng)電源狀態(tài)的名稱,也可以通過(guò)SetSystemPowerState改變系統(tǒng)的電源狀態(tài)。同樣的,如果應(yīng)用程序需要改變某個(gè)設(shè)備的電源狀態(tài),可以通過(guò)GetDevicePower返回設(shè)備當(dāng)前的電源狀態(tài),也可以通過(guò)SetDevicePower改變?cè)O(shè)備的電源狀態(tài)。
4、電源管理實(shí)例——LCD背光控制
上面依次描述了系統(tǒng)電源狀態(tài),設(shè)備電源狀態(tài)以及電源管理器的應(yīng)用程序接口,但對(duì)于沒(méi)有此類經(jīng)驗(yàn)的用戶來(lái)講,可能仍不清楚如何在自己的設(shè)備中實(shí)現(xiàn)所謂的電源管理,本節(jié)將以控制LCD背光為例,介紹實(shí)現(xiàn)對(duì)背光進(jìn)行電源管理的方法。
4.1 背光控制方法一
對(duì)背光的電源控制有很多方法,設(shè)備電源狀態(tài)的定義是在驅(qū)動(dòng)程序中實(shí)現(xiàn)的,電源管理器通過(guò)DeviceIoCtrol與設(shè)備驅(qū)動(dòng)程序交互,實(shí)現(xiàn)對(duì)設(shè)備的電源管理,同樣,應(yīng)用程序也可以通過(guò)DeviceIoCtrol實(shí)現(xiàn)對(duì)設(shè)備電源直接的控制。
// 1.打開(kāi)背光句柄
HANDLE hBLK = CreateFile(L'BKL1:', // name of device
GENERIC_READ|GENERIC_WRITE, // desired access
FILE_SHARE_READ|FILE_SHARE_WRITE, // sharing mode
NULL, // security attributes (ignored)
OPEN_EXISTING, // creation disposition
FILE_FLAG_RANDOM_ACCESS, // flags/attributes
NULL);
// 2.通過(guò)DeviceIoCtrol關(guān)閉LCD背光
CEDEVICE_POWER_STATE stPower;
stPower = D4;
DWORD dwReturn;
bResult = DeviceIoControl(hBLK,
IOCTL_POWER_SET,
NULL,
0,
& stPower,
sizeof(CEDEVICE_POWER_STATE),
&dwReturn,
NULL);
// 3.通過(guò)DeviceIoCtrol打開(kāi)LCD背光
stPower = D0;
bResult = DeviceIoControl(hBLK,
IOCTL_POWER_SET,
NULL,
0,
& stPower,
sizeof(CEDEVICE_POWER_STATE),
&dwReturn,
NULL);
4.2 背光控制方法二
方法一僅適用于系統(tǒng)沒(méi)有電源管理器的情況下使用,如果使能了系統(tǒng)的電源管理功能,則應(yīng)禁止使用上面的方法來(lái)控制背光。用戶可以將第2節(jié)提到的設(shè)備電源狀態(tài)和第1節(jié)的系統(tǒng)電源狀態(tài)做一個(gè)映射,當(dāng)系統(tǒng)在不同的電源狀態(tài)間切換時(shí),設(shè)備電源狀態(tài)隨之改變。系統(tǒng)電源狀態(tài)與設(shè)備電源狀態(tài)的映射是通過(guò)系統(tǒng)注冊(cè)表來(lái)實(shí)現(xiàn)的。如用戶希望在系統(tǒng)On狀態(tài)時(shí),背光最亮,系統(tǒng)電源狀態(tài)切換到UserIdel時(shí),背光變暗一點(diǎn),系統(tǒng)處于SystemIdel和Suspend時(shí),背光滅,則注冊(cè)表配置如下:
[HKEY_LOCAL_MACHINE\System\ CurrentControlSet \Power\State\On]
“Default” =dword:0 ;D0 當(dāng)系統(tǒng)為On狀態(tài)時(shí),所有設(shè)備默認(rèn)在D0狀態(tài)
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Power\State\UserIdle]
“Default” =dword:1 ;D1所有設(shè)備默認(rèn)在D1狀態(tài),包括LCD背光
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Power\State\SystemIdle]
“Default” =dword:0 ;D2所有設(shè)備默認(rèn)在D2狀態(tài)
“bkl1:”=dword:4 ;D4 背光處于D4關(guān)閉狀態(tài)
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Power\State\Suspend]
“Default” =dword:3 ;D3所有設(shè)備默認(rèn)在D3狀態(tài),如果設(shè)備不支持D3,自動(dòng)進(jìn)入D4狀態(tài)
上面的第1、2、4條注冊(cè)表使用的是系統(tǒng)默認(rèn)值,所以實(shí)際上只需要在SystemIdle狀態(tài)下增加一項(xiàng)就可以了,如圖3:
這里必需使用小寫(xiě)字母的設(shè)備名稱,電源管理器才能識(shí)別。注冊(cè)表設(shè)置好后,用戶再通過(guò)控制面板\電源屬性設(shè)置好系統(tǒng)超時(shí),背光就能隨系統(tǒng)電源狀態(tài)的變化而自動(dòng)切換了。
如果系統(tǒng)使能了電源管理器,而應(yīng)用程序又想直接修改背光的電源狀態(tài)應(yīng)該怎樣做呢?
首先肯定不能使用DeviceIoCtrol的方法,也不推薦使用SetDevicePower函數(shù),而應(yīng)調(diào)用較為溫和的DevicePowerNotify。DevicePowerNotify會(huì)與系統(tǒng)電源管理器商量改變背光的電源狀態(tài),電源管理器最終決定并實(shí)施背光狀態(tài)的改變。
4.3 背光控制方法三
實(shí)際上,在手持設(shè)備或便攜式等移動(dòng)設(shè)備中,背光功耗在整個(gè)設(shè)備功耗中占很大一部份,對(duì)背光電源的靈活控制十分必要,EM9283的控制面板\顯示屬性中有專門(mén)對(duì)背光進(jìn)行管理的選項(xiàng),如圖4。
背景光的高級(jí)選項(xiàng)可以分別設(shè)置EM9283在電池供電或適配器供電情況下LCD背光的亮度,如圖5。EM9283 LCD背光的亮度調(diào)節(jié)范圍是5%~100%。
與通過(guò)控制面板設(shè)置系統(tǒng)超時(shí)一樣,如果應(yīng)用程序希望直接設(shè)置背光的點(diǎn)亮?xí)r間和背光亮度,可以通過(guò)修改注冊(cè)表來(lái)實(shí)現(xiàn)。與圖4,圖5對(duì)應(yīng)的注冊(cè)表設(shè)置如下:
[HKEY_CURRENT_USER\ControlPanel\BackLight]
“UserExt” =dword:1 ;允許在適配器供電情況下對(duì)背光進(jìn)行控制
“UseBattery:”=dword:1 ;允許在電池供電情況下對(duì)背光進(jìn)行控制
“ACTimeout”=dword:60 ;適配器供電情況下用戶停止操作60秒后關(guān)閉背光
“BatteryTimout”=dword:15 ;電池供電情況下用戶停止操作15秒后關(guān)閉背光
如果應(yīng)用程序修改了背光亮度相關(guān)的注冊(cè)表項(xiàng),需要?jiǎng)?chuàng)建名為BackLightLevelChangeEvent的事件,并置為有信號(hào)狀態(tài),相應(yīng)的驅(qū)動(dòng)程序就會(huì)自動(dòng)更新剛剛的設(shè)置,使設(shè)置生效。
Handel hBackLightLevelChange=
CreateEvent(NULL, FALSE, FALSE, L'BackLightLevelChangeEvent' );
SetEvent(hBackLightLevelChange);
同樣,如果應(yīng)用程序修改了背光點(diǎn)亮?xí)r間,需要?jiǎng)?chuàng)建名為BackLightChangeEvent的事件,并置為有信號(hào)狀態(tài)使設(shè)置生效。
Handel hBackLightChange=
CreateEvent(NULL, FALSE, FALSE, L'BackLightChangeEvent' ) ;
SetEvent(hBackLightChange);
在控制面板系統(tǒng)電源屬性設(shè)置和背景光設(shè)置中,都講到當(dāng)用戶停止操作某某長(zhǎng)時(shí)間后,系統(tǒng)會(huì)怎樣怎樣。Windows CE和桌面Windows系統(tǒng)一樣,將沒(méi)有鼠標(biāo)和鍵盤(pán)輸入定義為用戶停止操作,但用戶停止操作并不意味著用戶已經(jīng)停止使用設(shè)備。比如用戶正打開(kāi)一個(gè)串口,查看串口收到的數(shù)據(jù),查看過(guò)程中用戶沒(méi)有使用鍵盤(pán),也沒(méi)有移動(dòng)鼠標(biāo),系統(tǒng)認(rèn)為用戶已經(jīng)停止操作設(shè)備,并在一段時(shí)間后關(guān)閉了LCD背光,顯示這不是用戶所希望的。在這種情況下,用戶只能周期性的移動(dòng)鼠標(biāo)或使用一下鍵盤(pán)來(lái)提醒設(shè)備,我還在使用你。
如果應(yīng)用程序能夠確定當(dāng)自己被打開(kāi)時(shí),用戶需要屏幕和背光一直點(diǎn)亮(比如動(dòng)畫(huà)播放程序),那么應(yīng)用程序可以自己來(lái)提醒操作系統(tǒng)的電源管理:用戶還在使用設(shè)備,而不需要用戶去頻繁的移動(dòng)鼠標(biāo)。應(yīng)用程序可以創(chuàng)建或打開(kāi)名為PowerManager/ActivityTimer/UserActivity事件,并以合適的時(shí)間,周期性的置這個(gè)事件有信號(hào)來(lái)達(dá)到提供電源管理器的目的。
Handle hUserActivity = OpenEvent( EVENT_ALL_ACCESS ,
FALSE,
L'PowerManager/ActivityTimer/UserActivity');
SetEvent( hUserActivity );
背光控制的方法三,對(duì)用戶來(lái)講是獨(dú)立于電源管理器的,也就是說(shuō)無(wú)論用戶是否通過(guò)控制面板使能了系統(tǒng)電源超時(shí)切換功能,都可以通過(guò)此方法單獨(dú)控制系統(tǒng)背景光。
5、電源管理實(shí)例——系統(tǒng)屏保
上述三種方法能實(shí)現(xiàn)對(duì)系統(tǒng)背光的靈活控制,當(dāng)系統(tǒng)關(guān)閉背光時(shí),EM9283會(huì)將背光控制引腳LCD_BKLIGHT置低,控制外部電路關(guān)閉背光,但實(shí)際上這時(shí)候EM9283的顯示信號(hào)仍在輸出,如果EM9283外接的是VGA顯示或其它獨(dú)立背光的顯示設(shè)備,就會(huì)看到顯示界面,而我們所期望的是系統(tǒng)空閑一段時(shí)間后,LCD屏的背光和顯示都關(guān)閉,即通常說(shuō)的屏保。
以VGA顯示器為例,當(dāng)沒(méi)有檢測(cè)到輸入信號(hào)時(shí),顯示器會(huì)自動(dòng)關(guān)閉背光并進(jìn)入低功耗模式,此時(shí)EM9283控制LCD_BKLIGHT是不行的,而需要將輸出的顯示信號(hào)關(guān)閉,我們同樣可以利用WinCE的電源管理器來(lái)實(shí)現(xiàn)屏保功能。比如讓系統(tǒng)空閑10分鐘后屏保的設(shè)置如下:
設(shè)備系統(tǒng)10分鐘后關(guān)閉顯示器
系統(tǒng)空閑10分鐘后會(huì)關(guān)閉背光和顯示輸出,控制原理已經(jīng)在第1節(jié)中進(jìn)行了描述,同時(shí)需要注意對(duì)系統(tǒng)事件'PowerManager/ReloadActivityTimeouts'進(jìn)行合適的設(shè)置,屏保功能才會(huì)正常啟用。
6、結(jié)束語(yǔ)
本文主要從應(yīng)用的角度出發(fā),結(jié)合英創(chuàng)工控主板EM9283,介紹了WinCE系統(tǒng)電源管理的實(shí)現(xiàn)過(guò)程。從背光的電源管理可以看到,有多種方法對(duì)系統(tǒng)設(shè)備的電源進(jìn)行控制管理,但應(yīng)該注意,盡量避免使用不同的方法同時(shí)管理一個(gè)設(shè)備的電源,以免造成用戶甚至應(yīng)用程序開(kāi)發(fā)者本身的混亂。
本文中涉及到的API函數(shù)、事件、注冊(cè)表等,用戶可以參考微軟的MSDN,對(duì)Windows CE電源管理更全面、更權(quán)威的描述,也請(qǐng)參考MSDN。對(duì)于文中使用的程序片段,感興趣的用戶可以聯(lián)系英創(chuàng)索要完整的測(cè)試代碼。
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3567瀏覽量
89146 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35539
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論