用uc/OS-2操作系統(tǒng)實現(xiàn)省電模式
摘 要:本文介紹了基于ARM7內(nèi)核的Philips lpc2214 MCU在uc/OS-2實時多任務操作系統(tǒng)中的低功耗設計與實現(xiàn),該方法可以推廣到其它的嵌入式系統(tǒng)應用中。
關鍵詞: 低功耗;uc/OS-2 RTOS;Philips lpc2214
引言
嵌入式系統(tǒng)的低功耗設計越來越成為人們關心的焦點。一般的嵌入式MCU都有空閑和掉電兩種省電模式,但如何在嵌入式操作系統(tǒng)中實現(xiàn)這兩種模式則是開發(fā)者面臨的一個難題。本文將給出這個問題的一種解決方案,它使用Philips lpc2214 MCU作為處理器構建硬件平臺,并在其上運行uc/OS-2實時操作系統(tǒng),通過合理地設置處理器的相關寄存器和在uc/OS-2上建立相應的任務,來實現(xiàn)MCU的掉電模式。
lpc2214簡介
lpc2214是Philips公司的一款嵌入式微控制器(MCU),它采用ARM7TDMI內(nèi)核,片上資源十分豐富,擁有16K RAM,256K Flash,兩個標準串行端口,兩個SPI端口,一個I2C端口,內(nèi)部實時時鐘,看門狗,A/D轉換,外部存儲器接口(最大支持64M)等。這樣,只需一片lpc2214,加上少許外圍電路,就可以輕松地組成一個嵌入式系統(tǒng)。
lpc2214具備兩種省電模式:空閑(IDLE)和掉電(POWER-DOWN)。通過配置相應的寄存器,就可以使其進入相應的省電模式。空閑模式時,系統(tǒng)時鐘一直有效,處理器,存儲器系統(tǒng)和相關控制器及內(nèi)部總線不再消耗功率,可通過中斷使處理器恢復運行;掉電模式時,振蕩器關閉,片內(nèi)外設不再消耗功率,復位或者外部中斷可以喚醒掉電模式。典型條件下,MCU的工作電流大概在60mA,而掉電模式下的靜態(tài)電流只有10uA左右。
uc/OS-2簡介
uc/OS-2屬實時多任務操作系統(tǒng),用ANSI C編寫,含小部分匯編代碼,可通過移植用于不同架構的微處理器。至今,從8位到64位,uc/OS-2已在超過40種不同架構的微處理器上運行,其應用領域廣泛。
uc/OS-2是可搶占的實時操作系統(tǒng),即當前正在運行的任務會被后來進入就緒態(tài)下的更高優(yōu)先級的任務所搶占。這項工作是由調(diào)度器(scheduler)完成的。每當正在運行的任務結束自己對CPU的占用,或者一個新的任務建立時,調(diào)度器都會進行一次新的調(diào)度保證當前任務及就緒態(tài)任務中的最高優(yōu)先級任務獲得到CPU的使用權。
在操作系統(tǒng)中實現(xiàn)掉電功能
空閑和掉電這兩種省電模式的實現(xiàn)方法幾乎是相同的,只有寄存器和喚醒方式的不同,故本文只介紹掉電模式的實現(xiàn)。
lpc2214中的相關寄存器
lpc2214中控制MCU進入空閑模式和掉電模式相關的寄存器是:
PCON:功率控制寄存器;
PCONP:外設功率控制寄存器;
掉電模式的喚醒是通過外部中斷實現(xiàn)的,與外部中斷相關的寄存器是:
EXTINT: 外部中斷標志寄存器;
EXTWAKE: 外部中斷喚醒寄存器;
EXTMODE: 外部中斷方式寄存器;
EXTPOLAR:外部中斷極性寄存器
lpc2214掉電功能的具體實現(xiàn)
在這里通過一個簡單的例子說明:系統(tǒng)復位后創(chuàng)建一個任務TaskStart(),它負責初始化與外部中斷相關的寄存器,同時在該任務中建立N個用戶任務Task1(), Task2(),...TaskN()和1個用于進入掉電模式的任務Task_Powerdown()。 uc/OS-2開始運行后,Task1()至TaskN()模擬N個實際任務的運行,Task_Powerdown()則負責在N個任務都空閑時將處理器切換進掉電模式。當有外部中斷時,則在中斷服務程序中將處理器喚醒。要說明的是,Task1()至TaskN()的優(yōu)先級都必須高于Task_Powerdown()的優(yōu)先級,且N+1不應大于系統(tǒng)最大任務數(shù)。主要代碼及注釋如下:
int main (void) //主函數(shù),系統(tǒng)執(zhí)行入口
{
OSInit(); //初始化uc/OS-2操作系統(tǒng)
OSTaskCreate(TaskStart,(void*)0, &TaskStartStk[TASK_STK_SIZE-1],0);
//建立第一個任務,優(yōu)先級最高為0
OSStart(); //開始運行uc/OS-2
return 0; //其實永遠不會返回
}
void TaskStart(void *pdata) //創(chuàng)建N個用戶任務和1個掉電任務
{
pdata = pdata;
OSTaskCreate(Task1,(void*)0,&TaskStk1[TASK_STK_SIZE - 1], 1); //創(chuàng)建任務Task1()
OSTaskCreate(Task2,(void*)0,&TaskStk2[TASK_STK_SIZE - 1], 2);//創(chuàng)建任務Task2()
... ...
OSTaskCreate(TaskN,(void*)0,&TaskStkN[TASK_STK_SIZE - 1], N);//創(chuàng)建任務TaskN()
OSTaskCreate(Task_Powerdown,(void*)0, &TaskStk[TASK_STK_SIZE - 1], N+1);
//創(chuàng)建掉電任務Task_Powerdown()
PCONP = 0x0000;//禁止所有片內(nèi)外設
... ... //設置外部中斷的相應寄存器
for(;;)
{
... ...
//任務代碼,結束后釋放CPU的使用權
}
void Task1(void *pdata) //用戶任務1
{
pdata = pdata;
for(;;)
{
... ... //任務代碼
}
}
void Task_Powerdown (void *pdata) //MCU掉電任務,等待外部中斷喚醒
{
pdata = pdata;
for(;;)
{
PCON = 2; //使MCU進入掉電模式
... ... //外部中斷喚醒后,CPU交給用戶任務
}
}
void __irq IRQ_EINT1(void) //外部中斷的中斷處理程序
{
while((EXTINT & 0x02)!=0) //清除中斷標志
{
EXTINT = 0x02;
}
VICVectAddr = 0x00; //中斷處理結束
}
流程圖見圖1
圖1 掉電模式流程圖
結語
本文介紹了在lpc2214微控制器上運行uc/OS-2操作系統(tǒng)實現(xiàn)掉電的方法,簡單明了。從中不難看出,這種方法有普遍意義,可以廣泛地應用于各種嵌入式系統(tǒng)設計中。
參考文獻:
1. 邵貝貝譯,‘嵌入式實時操作系統(tǒng)uc/OS-2’(第2版),北京航空航天大學出版社,2004.5.
2. 周立功等,‘ARM嵌入式系統(tǒng)實驗教程’,北京航空航天大學出版社,2004.12.
3. lpc2212/lpc2214 Product Data, Philips Inc.,2004.
評論