亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

嵌入式系統(tǒng)中降低cpu功耗的實(shí)現(xiàn)方法

文檔序號(hào):6469340閱讀:264來源:國知局
專利名稱:嵌入式系統(tǒng)中降低cpu功耗的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域
本發(fā)明涉及嵌入式系統(tǒng)領(lǐng)域,特別涉及嵌入式系統(tǒng)功耗控制技術(shù)領(lǐng)域,具體是指 一種嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法。
背景技術(shù)
嵌入式系統(tǒng)尤其是消費(fèi)類電子系統(tǒng)對(duì)功耗有嚴(yán)格的要求,隨著能源的日益緊張, 以前不重視功耗的個(gè)人計(jì)算機(jī)系統(tǒng)現(xiàn)在也逐漸考慮功耗了 。 通常的嵌入式系統(tǒng)中一旦系統(tǒng)起來后CPU—直供電,在大多數(shù)系統(tǒng)中程序執(zhí)行占 比較小的時(shí)間,大多數(shù)時(shí)間系統(tǒng)處在空閑狀態(tài),而空閑狀態(tài)下CPU仍然在運(yùn)行,CPU的功耗 占片上系統(tǒng)(SOC, System on Chip)上功耗比較大的部分,而片上系統(tǒng)一般就是在單個(gè)芯片 上集成了 CPU、UART, USB等多個(gè)模塊。為了降低SOC的功耗,在現(xiàn)有技術(shù)中,普遍的實(shí)現(xiàn)方 法是當(dāng)系統(tǒng)空閑時(shí)把CPU頻率降低或者停止CPU的執(zhí)行,這兩種方式雖然可以大大降低系 統(tǒng)功耗,但前兩種方式系統(tǒng)仍然在給CPU供電,CPU雖然不執(zhí)行指令了,但本身還是要消耗 部分電流的。 —般來說,嵌入式系統(tǒng)都是由中斷驅(qū)動(dòng)的,當(dāng)外部中斷發(fā)生時(shí)SOC需要把中斷信 號(hào)送給CPU,在早期的設(shè)計(jì)方案中,系統(tǒng)啟動(dòng)起來后CPU —直處于運(yùn)行態(tài),這樣一旦中斷到 來,SOC馬上就把中斷送給CPU,而CPU很快響應(yīng)中斷(假設(shè)中斷沒有被CPU自己鎖定),但 這種方案的弊端是CPU —直處在運(yùn)行態(tài),系統(tǒng)平均功耗很大(這里的平均功耗是在一段較 長的時(shí)間內(nèi)系統(tǒng)平均耗電量);后來人們對(duì)這種方案做了改進(jìn),當(dāng)系統(tǒng)有一段時(shí)間空閑時(shí), 讓CPU進(jìn)入休眠態(tài),這樣當(dāng)中斷到來時(shí)SOC只需要給CPU提供穩(wěn)定的時(shí)鐘(Clock) , CPU就 被喚醒了,然后CPU響應(yīng)中斷,這種方案因?yàn)镃PU不是處在運(yùn)行態(tài)就處在休眠態(tài),永遠(yuǎn)到不 了停止態(tài),雖然相對(duì)前一種方法功耗降低了很多,但CPU功耗還是較高,同時(shí)為了能夠適應(yīng) 當(dāng)今對(duì)嵌入式設(shè)備電源功耗管理的更高要求,也有必要對(duì)CPU功耗進(jìn)一步降低。

發(fā)明內(nèi)容
本發(fā)明的目的是克服了上述現(xiàn)有技術(shù)中的缺點(diǎn),提供一種能夠有效降低嵌入式系 統(tǒng)的平均功耗、過程簡單快捷、工作性能穩(wěn)定可靠、適用范圍較為廣泛的嵌入式系統(tǒng)中降低 CPU功耗的實(shí)現(xiàn)方法。 為了實(shí)現(xiàn)上述的目的,本發(fā)明的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法如下
該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,所述的嵌入式系統(tǒng)包括片上系統(tǒng)、 CPU、存儲(chǔ)模塊(Memory)和電源模塊,其主要特點(diǎn)是,所述的方法包括將CPU由運(yùn)行態(tài)進(jìn)入 停止態(tài)的處理操作和將CPU由停止態(tài)進(jìn)入運(yùn)行態(tài)的處理操作,所述的將CPU由運(yùn)行態(tài)進(jìn)入 停止態(tài)的處理操作包括以下步驟 (Al)片上系統(tǒng)在系統(tǒng)沒有程序需要執(zhí)行的時(shí)候?qū)PU的中斷關(guān)閉; (A2)片上系統(tǒng)將CPU現(xiàn)場恢復(fù)運(yùn)行代碼拷貝到存儲(chǔ)模塊中的以CPU上電首先執(zhí)行
的地址為起始地址的存儲(chǔ)區(qū)中;
(A3)片上系統(tǒng)將當(dāng)前的CPU現(xiàn)場運(yùn)行狀態(tài)信息保存到存儲(chǔ)模塊中; (A4)片上系統(tǒng)對(duì)存儲(chǔ)模塊中保存的CPU現(xiàn)場運(yùn)行狀態(tài)信息進(jìn)行調(diào)整操作; (A5)片上系統(tǒng)驅(qū)動(dòng)電源系統(tǒng)將CPU關(guān)閉進(jìn)入停止?fàn)顟B(tài); 所述的將CPU由停止態(tài)進(jìn)入運(yùn)行態(tài)的處理操作包括以下步驟 (Bl)片上系統(tǒng)在系統(tǒng)中斷到來的時(shí)候驅(qū)動(dòng)電源系統(tǒng)對(duì)CPU重新提供電源; (B2)片上系統(tǒng)對(duì)CPU重新提供穩(wěn)定時(shí)鐘信號(hào); (B3) CPU執(zhí)行所述的CPU現(xiàn)場恢復(fù)運(yùn)行代碼,從存儲(chǔ)模塊中讀取所述的CPU現(xiàn)場運(yùn) 行狀態(tài)信息; (B4)片上系統(tǒng)將復(fù)位運(yùn)行代碼拷貝到存儲(chǔ)模塊中的以CPU上電首先執(zhí)行的地址
為起始地址的存儲(chǔ)區(qū)中; (B5)片上系統(tǒng)將CPU的中斷打開。 該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法中的將CPU的中斷關(guān)閉,具體為
片上系統(tǒng)通過對(duì)CPU的狀態(tài)寄存器的設(shè)置關(guān)閉CPU的中斷。
該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法中的將CPU的中斷打開,具體為
片上系統(tǒng)通過對(duì)CPU的狀態(tài)寄存器的設(shè)置打開CPU的中斷。 該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法中的CPU上電首先執(zhí)行的地址為0x00 地址。 該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法中的CPU現(xiàn)場運(yùn)行狀態(tài)信息包括存儲(chǔ)器 管理單元(匪U,Memory Management Unit)的狀態(tài)值、高速緩存(Cache)的狀態(tài)值和CPU中 所有寄存器的狀態(tài)值。 該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法中的對(duì)存儲(chǔ)模塊中保存的CPU現(xiàn)場運(yùn)行 狀態(tài)信息進(jìn)行調(diào)整操作,具體為 將PC指針的值指向CPU所執(zhí)行的指令的下一條指令。 該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法中的將CPU關(guān)閉進(jìn)入停止?fàn)顟B(tài),具體 為 片上系統(tǒng)通過配置硬件寄存器相應(yīng)的狀態(tài)值關(guān)閉CPU。 采用了該發(fā)明的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,由于通過對(duì)片上系統(tǒng)進(jìn) 行特別設(shè)計(jì)加上系統(tǒng)軟件的配合,當(dāng)系統(tǒng)空閑時(shí)(即沒有程序需要執(zhí)行)通過硬件配置把 CPU推入停止態(tài),中斷來時(shí)如果CPU處于運(yùn)行態(tài),SOC直接把中斷送給CPU,如果中斷來時(shí) CPU處在停止態(tài),SOC首先給CPU供電,然后給CPU提供時(shí)鐘信號(hào),從而CPU就被喚醒了 ,緊 接著系統(tǒng)軟件對(duì)CPU做相應(yīng)配置和場景恢復(fù),然后CPU響應(yīng)中斷,從而不再需要CPU始終處 于運(yùn)行態(tài),程序變成了一個(gè)單獨(dú)的主體,當(dāng)需要運(yùn)行的時(shí)候程序把自己拿到CPU上去執(zhí)行, 執(zhí)行完后關(guān)閉CPU,實(shí)現(xiàn)了在系統(tǒng)忙時(shí)打開CPU,系統(tǒng)空閑時(shí)徹底關(guān)閉CPU的效果,使得系統(tǒng)
的平均功耗進(jìn)一步降低,而且實(shí)現(xiàn)過程簡單快捷,工作性能穩(wěn)定可靠,適用范圍較為廣泛。


圖1為本發(fā)明的嵌入式系統(tǒng)中的片上系統(tǒng)結(jié)構(gòu)示意圖。 圖2為本發(fā)明的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法的將CPU由運(yùn)行態(tài)進(jìn)入停 止態(tài)的處理操作流程圖。
圖3為本發(fā)明的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法的將CPU由停止態(tài)進(jìn)入運(yùn) 行態(tài)的處理操作流程圖。 圖4為本發(fā)明的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法中CPU狀態(tài)遷移示意圖。
具體實(shí)施例方式
為了能夠更清楚地理解本發(fā)明的技術(shù)內(nèi)容,特舉以下實(shí)施例詳細(xì)說明。 首先定義CPU在系統(tǒng)運(yùn)行中處于的三種狀態(tài),運(yùn)行態(tài)、停止態(tài)、休眠態(tài)。
(1)運(yùn)行態(tài)——表示CPU目前有供電,能正常的執(zhí)行指令,當(dāng)然這時(shí)候肯定有穩(wěn)定
的Clock提供給CPU,相對(duì)其他兩種狀態(tài)這時(shí)候CPU功耗最大。 (2)停止態(tài)——CPU完全被斷電了 ,既沒有Clock又沒有供電,相對(duì)其他兩種狀態(tài) 這時(shí)候CPU功耗最小,這時(shí)候CPU斷電前的場景全部丟失,重新啟動(dòng)后需要對(duì)以前的場景進(jìn) 行恢復(fù)。 (3)休眠態(tài)——SOC還在給CPU供電,但沒有給CPU送Clock。這種狀態(tài)下的CPU 功耗比運(yùn)行態(tài)下的CPU功耗小,比停止態(tài)下CPU功耗大,但這時(shí)候CPU停止Clock前的場景 繼續(xù)保存,一旦有Clock, CPU在原來的場景上繼續(xù)執(zhí)行。 請(qǐng)參閱圖1至圖4所示,該嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,所述的嵌入式 系統(tǒng)包括片上系統(tǒng)、CPU、存儲(chǔ)模塊和電源模塊,其中,所述的方法包括將CPU由運(yùn)行態(tài)進(jìn)入 停止態(tài)的處理操作和將CPU由停止態(tài)進(jìn)入運(yùn)行態(tài)的處理操作,所述的將CPU由運(yùn)行態(tài)進(jìn)入 停止態(tài)的處理操作包括以下步驟 (Al)片上系統(tǒng)在系統(tǒng)沒有程序需要執(zhí)行的時(shí)候?qū)PU的中斷關(guān)閉,具體為
片上系統(tǒng)通過對(duì)CPU的狀態(tài)寄存器的設(shè)置關(guān)閉CPU的中斷;
也可以采用其它任何與CPU所匹配的相應(yīng)方式; (A2)片上系統(tǒng)將CPU現(xiàn)場恢復(fù)運(yùn)行代碼拷貝到存儲(chǔ)模塊中的以CPU上電首先執(zhí)行 的地址為起始地址的存儲(chǔ)區(qū)中;該CPU上電首先執(zhí)行的地址可以為OxOO地址,也可以根據(jù) 所具體使用的CPU芯片所規(guī)定的其它任何地址; (A3)片上系統(tǒng)將當(dāng)前的CPU現(xiàn)場運(yùn)行狀態(tài)信息保存到存儲(chǔ)模塊中;該CPU現(xiàn)場運(yùn) 行狀態(tài)信息包括存儲(chǔ)器管理單元的狀態(tài)值、高速緩存的狀態(tài)值和CPU中所有寄存器的狀態(tài) 值,還可以包括其它任何需要存儲(chǔ)的信息; (A4)片上系統(tǒng)對(duì)存儲(chǔ)模塊中保存的CPU現(xiàn)場運(yùn)行狀態(tài)信息進(jìn)行調(diào)整操作,具體 為 將PC指針的值指向CPU所執(zhí)行的指令的下一條指令; (A5)片上系統(tǒng)驅(qū)動(dòng)電源系統(tǒng)將CPU關(guān)閉進(jìn)入停止?fàn)顟B(tài),具體為 片上系統(tǒng)通過配置硬件寄存器相應(yīng)的狀態(tài)值關(guān)閉CPU ; 也可以采用其它任何與CPU所匹配的相應(yīng)方式; 所述的將CPU由停止態(tài)進(jìn)入運(yùn)行態(tài)的處理操作包括以下步驟 (Bl)片上系統(tǒng)在系統(tǒng)中斷到來的時(shí)候驅(qū)動(dòng)電源系統(tǒng)對(duì)CPU重新提供電源; (B2)片上系統(tǒng)對(duì)CPU重新提供穩(wěn)定時(shí)鐘信號(hào); (B3) CPU執(zhí)行所述的CPU現(xiàn)場恢復(fù)運(yùn)行代碼,從存儲(chǔ)模塊中讀取所述的CPU現(xiàn)場運(yùn) 行狀態(tài)信息;
(B4)片上系統(tǒng)將復(fù)位運(yùn)行代碼拷貝到存儲(chǔ)模塊中的以CPU上電首先執(zhí)行的地址 為起始地址的存儲(chǔ)區(qū)中; (B5)片上系統(tǒng)將CPU的中斷打開,具體為 片上系統(tǒng)通過對(duì)CPU的狀態(tài)寄存器的設(shè)置打開CPU的中斷。 也可以采用其它任何與CPU所匹配的相應(yīng)方式; 在實(shí)際使用當(dāng)中,本發(fā)明的方法的基本思想是當(dāng)系統(tǒng)空閑時(shí),即沒有程序需要執(zhí) 行時(shí),通過一些硬件配置把CPU推入停止態(tài),中斷來時(shí)如果CPU處于運(yùn)行態(tài)(CPU在運(yùn)行的 過程中也有可能來中斷),SOC直接把中斷送給CPU,如果中斷來時(shí)CPU處在停止態(tài),SOC首 先給CPU供電,然后給CPU提供Clock,這樣CPU就被喚醒了 ,緊接著系統(tǒng)軟件對(duì)CPU做相 應(yīng)配置和場景恢復(fù),然后CPU響應(yīng)中斷,因?yàn)镃PU斷電后再起來一般中斷是被關(guān)閉的,匪u、 Cache也是被關(guān)閉的,一旦斷電后再喚醒需要軟件做些配置,恢復(fù)上次進(jìn)入停止態(tài)之前的 CPU現(xiàn)場(例如中斷是否關(guān)閉,匪U是否啟動(dòng),Cache是否啟動(dòng),各個(gè)寄存器的值等)。這樣, 在本設(shè)計(jì)中程序不再需要CPU始終處于運(yùn)行態(tài),程序變成了一個(gè)單獨(dú)的主體,當(dāng)需要運(yùn)行 的時(shí)候程序把自己拿到CPU上去執(zhí)行,執(zhí)行完后關(guān)閉CPU。在進(jìn)一步的設(shè)計(jì)中CPU就可以 變成一個(gè)共享資源,多個(gè)應(yīng)用程序可以申請(qǐng)CPU, —旦申請(qǐng)到CPU就把自己拿到CPU上去執(zhí) 行,執(zhí)行完后交出CPU的控制權(quán),以便其他應(yīng)用程序可以使用CPU。當(dāng)全部應(yīng)用程序都不使 用CPU時(shí)通過系統(tǒng)配置關(guān)閉CPU。 要實(shí)現(xiàn)該方案,需要SOC和系統(tǒng)軟件的雙重支持。 1、 SOC硬件的支持——基于以上基本思想,本發(fā)明首先需要SOC做相應(yīng)的以下支 持 (l)SOC要能夠提供關(guān)閉CPU的機(jī)制,注意在這里只是關(guān)閉CPU,關(guān)閉CPU不能影響 其他外圍模塊的狀態(tài),例如Memory,因?yàn)槌绦蚴且蕾囉贛emory存在的,如果關(guān)閉CPU同時(shí)也 關(guān)閉了 Memory,如果用斷電易失性Memory,下次CPU起來后程序狀態(tài)將不可恢復(fù),CPU斷電 后其他模塊如DMA、 USB、 RF、 UART等的狀態(tài)還要繼續(xù)保持。 (2)在中斷到來時(shí)SOC需要做判斷,如果CPU處在停止態(tài),那么首先需要給CPU提 供電源,然后給CPU提供穩(wěn)定的Clock,讓CPU進(jìn)入運(yùn)行態(tài)。上面只是提供了基本的設(shè)計(jì)思 想,并沒有涉及具體的硬件實(shí)現(xiàn),具體實(shí)現(xiàn)因SOC不同可以不同,但需要實(shí)現(xiàn)本專利的低功 耗方案,必須提供上述兩項(xiàng)支持。 2、系統(tǒng)軟件的支持——基于以上基本思想和SOC硬件的支持,本發(fā)明給出了系統(tǒng) 軟件的設(shè)計(jì)流程。這里假設(shè)CPU每次上電后從0x00地址開始執(zhí)行。當(dāng)所有程序都不需要 執(zhí)行,也就是系統(tǒng)進(jìn)入空閑狀態(tài)了,這時(shí)候我們就可以開始讓CPU進(jìn)入停止模式,這里給出 讓CPU進(jìn)入停止模式和喚醒CPU要做的工作。
首先是由運(yùn)行態(tài)進(jìn)入停止態(tài) (1)關(guān)閉中斷,關(guān)閉中斷的方法因CPU的不同而不同,在ARM芯片上可以通過把狀 態(tài)寄存器的第6和第7位置為1而關(guān)閉中斷,而對(duì)于其它類型的CPU可以參考相關(guān)CPU的 指令手冊(cè)以進(jìn)行相應(yīng)的配置,這些都屬于本領(lǐng)域技術(shù)人員的公知常識(shí)。
(2)把現(xiàn)場恢復(fù)的代碼拷貝到0x00為起始地址的內(nèi)存中,因?yàn)槊看紊想姸际菑?OxOO地址開始執(zhí)行,系統(tǒng)復(fù)位(reset)后應(yīng)該執(zhí)行復(fù)位代碼(reset code),當(dāng)系統(tǒng)進(jìn)入停 止態(tài)再喚醒需要執(zhí)行的是現(xiàn)場恢復(fù)code,而不是reset code,第一次系統(tǒng)上電屬于reset,0x00地址上裝的是reset code,進(jìn)入停止?fàn)顟B(tài)前應(yīng)該把0x00地址上的code替換成現(xiàn)場恢 復(fù)cocbo (3)保存當(dāng)前CPU現(xiàn)場到Memory (包括匪U、 Cache、所有寄存器的狀態(tài))。
(4)調(diào)整Memory中保存的CPU現(xiàn)場的某些值,例如pc指針的值,讓pc指針的值指 向下一條指令,這樣現(xiàn)場恢復(fù)后CPU就跳過關(guān)閉CPU的指令,從關(guān)閉CPU指令的下一條指令 開始執(zhí)行。 (5)關(guān)閉CPU讓CPU進(jìn)入停止?fàn)顟B(tài),通過寫特定的硬件寄存器而關(guān)閉CPU,具體的 關(guān)閉方法因硬件實(shí)現(xiàn)的不同而不同,在實(shí)現(xiàn)上需要參考相關(guān)的硬件手冊(cè),這些都屬于本領(lǐng) 域技術(shù)人員的公知常識(shí)。 至此CPU已經(jīng)進(jìn)入停止態(tài),系統(tǒng)處在低功耗模式下,如果有中斷來CPU會(huì)被喚醒。
接下來是由停止態(tài)進(jìn)入運(yùn)行態(tài),當(dāng)中斷來時(shí)CPU被S0C喚醒,從0x00地址開始執(zhí) 行現(xiàn)場恢復(fù)代碼,以下是現(xiàn)場恢復(fù)的工作過程 (1)從Memory中恢復(fù)CPU現(xiàn)場?,F(xiàn)場恢復(fù)后CPU開始執(zhí)行讓CPU進(jìn)入停止?fàn)顟B(tài)的 下一條指令。 (2)把reset code copy到0x00為起始地址的Memory中。 (3)打開中斷,這個(gè)因CPU的不同而不同,ARM上把狀態(tài)寄存器的6,7兩位清零便 可打開中斷,其他CPU請(qǐng)參考相關(guān)的指令文檔。 至此CPU完全恢復(fù)了進(jìn)入停止?fàn)顟B(tài)前的場景,開始響應(yīng)中斷。 下面給出一個(gè)CPU是ARM926EJS芯片的S0C的軟件設(shè)計(jì)的實(shí)際例子。 假設(shè)0x01000000是一個(gè)32位寄存器地址,把這個(gè)寄存器寫成0x0000000A, S0C
就會(huì)把ARM926EJS芯片關(guān)掉,ARM926EJS芯片進(jìn)入停止?fàn)顟B(tài)前的場景保存在0x00010000為
起始地址,長度為32個(gè)32bit的Memory中,原始的reset code保存在0x00020000為起始
地址,長度為32個(gè)32bit的Memory中,原始的wakeup code保存在0x00300000為起始地
址長度為32個(gè)32bit的Memory中,斷電后ARM926EJS芯片從0x00000000地址開始執(zhí)行,
在這里我們用arm匯編實(shí)現(xiàn)ARM926EJS芯片進(jìn)入停止?fàn)顟B(tài)的場景保存和ARM926EJS芯片被
喚醒后的場景恢復(fù)工作。 將ARM926EJS芯片進(jìn)入停止態(tài) (1)鎖定中斷,在此過程中不能響應(yīng)中斷。 (2) {呆存r4、r5、r6、r6、r7、r8、r9、rl0、rll、r12、 lr至lj當(dāng)前棧。{呆存svc牛莫式的 cpsr至U當(dāng)前棧。 (3)拷貝現(xiàn)場恢復(fù)代碼(wake up code)到0x00地址。 (4)R0賦值為0x00010000+256,此處將以棧的形式從高往低增長保存數(shù)據(jù)。 (5)保存當(dāng)前sp指針到R0所指的位置。 (6)切換到f i q模式,以遞減棧的形式保存f i q模式的r8 、 r9 、 r 10 、 r 11 、 r 12 、 r 13 、 lr、 Spsr至lj r0所指的Memory。 (7)切換到irp模式以遞減棧的形式保存irp模式的rl3、rl4、spsr、到r0所指的 Memory。 (8)切換到undef ine模式,以遞減棧的形式保存undef ine模式的r13、 r14、 spsr 至U r0所指的Memory 。0087] (9)切換到abort模式,以遞減棧的形式保存abort模式的rl3、lr、spsr到r0所 指的Memory中。
0088] (10)切換到user模式,以遞減棧的形式保存user模式的r13、 lr、 spsr到r0所 指的Memory中。
0089] (11)切換到svc模式,以遞減棧的形式保存協(xié)處理器cpl5的cl、 c2、 c3、 c5、 c6、 c7、 c13至lj r0所指的Memory中。
0090] (12) RestoreCpuContext標(biāo)號(hào)的值以遞減棧的形式保存在r0所指的Memory中,把 r0的值保存在0x00010000處,下次CPU被喚醒后wake up code將取出r0,并以r0作為棧 地址恢復(fù)CPU的場景。RestoreCpuContext是程序中的一個(gè)標(biāo)號(hào),具體見以下源代碼。 0091] (13)通過配置外部寄存器讓CPU進(jìn)入停止態(tài)(stop mode)。 0092] 實(shí)現(xiàn)以上步驟的具體的源代碼如下 0093] . globl PushCpuToStopMode 0094] PushCpuToStopMode 0095] ;lock interrupt
0096] MRS r0, CPSR
0RR r0, r0, #0x000000C0 MSR CPSR—cxsf, rO
;save CPU context to current stack, current mode must be svc mode STMDB sp ! , {r4, r5, r6, r7, r8, r9, r10, rll, rl2, lr} ;store svc mode cpsr MRS rl, cpsr STMDB sp ! , {rl}
;copy wake up code to 0x0000 address, ;wakeup code size is 32words (one word is 32bit); ;original wakeup code is stored from address 0x00030000 LDR r9, = 0x00030000
0097] 0098] 0099] 0100] 0101] 0102] 0103] 0104] 0105] 0106] 0107] 0108] 0109] 0110] 0111 ] 0112] 0113] 0114] 0115] 0116] 0117] 0118] 0119]
LDRr8,=0x0
LDMIAr9,{r0--r7}
STMIAr8,{r0--r7}
LDMIAr9,{r0--r7}
STMIAr8,{r0--r7}
LDMIAr9,{r0--r7}
STMIAr8,{r0--r7}
LDMIAr9,{r0--r7}
STMIAr8,{rO--r7}
;before push CPU to stop mode, CPU context
;is stored to Memory 0x00010000, length is 256bytes ;
LDR r0, = 0x00010000
0120]ADD r0, r0, #256:0121] ; store svc sp
:0122] STMDB r0 ! , {sp}
:0123] ;change to fiq mode
:0124] MRS rl,CPSR
:0125] BIC rl,rl,#0xlF
:0126] ORR r2,rl,糾x11
:0127] MSR CPSR_cxsf,r2
:0128] ;store fiq mode r8_rl4
:0129] STMDBrO ! , {r8, r9, r10, rll, rl2, rl3, lr}
:0130] ;store fiq mode spsr
:0131] MRS rl, spsr
:0132] STMDB rO ! , {rl}
:0133] ;change to irq mode
:0134] MRS rl,CPSR
:0135] BIC rl,rl,#0xlF
:0136] ORR r2,rl,#0xl2
:0137] MSR CPSR—cxsf ,r2
:0138] ;store irq mode rl3, rl4
:0139] STMDB rO ! , {rl3, lr}
:0140] ;store irq mode spsr MRS rl, spsr STMDB rO ! , {rl} ;chanqe to皿dfine mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xlB MSR CPSR—cxsf ,r2 ;store undfine mode rl3,rl4 STMDBrO ! , {rl3, lr} ;store undfine mode spsr MRS rl, spsr STMDB rO ! , {rl} ;change to abort mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl7 MSR CPSR_cxsf,r2 ;store abort mode rl3, rl4 STMDB rO ! , {rl3, lr}
9
;store abort mode spsrMRS rl, spsrSTMDB r0 ! , {rl};change to user modeMRS rl,CPSRBIC rl,rl,#0xlF0RR r2,rl,#0xl0MSR CPSR—cxsf, r2;store user mode rl3, rl4STMDB rO ! , {rl3, lr};change to svc modeMRS rl,CPSRBIC rl,rl,#0xlFORR r2,rl,#0xl3MSR CPSR—cxsf, r2;save cpl5 register, cl, c2, c3, c5, c6, c7, cl3MRC p15,0, rl, cl, cO,OMRC p15,0, r2, c2, cO,OMRC p15,0, r3, c3, cO,OMRC pl5,0, r4, c5, cO,OMRC pl5,0, r5, c6, cO,OMRC p15,0, r6, c7, cO,OMRC p15,0,r7,c13,cO,OSTMDB rO ! , {rl, r2, r3, r4, r5, r6, r7}LDR rl, = RestoreCpuContextSTMDB rO ! , {rl};save rO value to address 0x00010000 ;LDR rl,= 0x00010000 ;STR rO, [rl];;we have already saved all CPU context;follow we could push A固926EJS to stop stateLDR rl, = 0x0000000ALDR rO, = 0x01000000STR rl, [rO]NOPNOPNOPNOPNOP
NOP NOP ;here ARM926EJS have been closed. ;after next CPU next wake, wak印u code will jump to here. ;here ARM926EJS under SVC mode RestoreCpuContext LDR rl, = 0x00010000 LDR r0, [rl] LDMIA r0 ! , {rl} ;this is not used, only叩stack. ;restore cpl5 register cl, c2, c3, c5, c6, c7, cl3 U)MIA r0 ! , {rl, r2, r3, r4, r5, r6, r7}; MCR pl5,0, rl, cl, c0,0 MCR p15,0, r2, c2, c0,0 MCR pl5,0, r3, c3, cO,O MCR pl5,0, r4, c5, cO,O MCR p15,0, r5, c6, cO,O MCR p15,0, r6, c7, cO,O MCR p15,0, r7, c13, cO,O ; change to user mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl0 MSR CPSR_cxsf,r2 ;restore user mode rl3, rl4 LDMIA r0 ! , {rl3, lr}; ; change to abort mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl7 MSR CPSR—cxsf , r2 .,restore abort mode spsr LDMIA r0 ! , {r3}; MSR SPSR,r3 ;restore abort mode rl3, rl4 LDMIA r0 ! , {r3, lr}; ; change to undfine mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xlB
MSR CPSR—cxsf , r2 ;restore undefine mode spsr LDMIA rO ! , {r3}; MSR SPSR,r3 ;restore undefine mode rl3, rl4 LDMIA rO ! , {r3, lr}; ; change to irq mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl2 MSR CPSR_cxsf , r2 ;restore irq mode spsr LDMIA rO ! , {r3}; MSR SPSR,r3 ;restore irq mode rl3, rl4 LDMIA rO ! , {r3, lr}; ;change to fi qmode MRS rl,CPSR BIC rl,rl,糾xlF ORR r2,rl,#0xll MSR CPSR—cxsf , r2 ;restore fiq mode spsr LDMIA rO ! , {r3}; MSR SPSR,r3 ;restore fiq mode r8-rl4 LDMIA rO ! , {r8, r9, r10, rll, rl2, rl3, lr} ; change to svc mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl3 MSR CPSR—cxsf, r2 ;resotre svc mode sp LDMIA rO ! , {sp} ;copy reset code to 0x0000 address, ;reset code size is 32words (one word is 32 bit); ;oriqinal reset code is stored from address 0x00020000 LDR r9, = 0x00020000 LDR r8, = 0x0 LDMIA r9 ! , {rO—r7}r8 r9 r8 r9 r8 r9 r8 sp
{r0_r7} {r0_r7} {r0_r7} {r0_r7} {r0_r7} {r0_r7} {r0_r7} {r3}
r3, r3, #0x000000C0 ;free arm926ejs interrupt SPSR, r3 ;restore svc mode spsr
sp ! , {r4, r5, r6, r7, r8, r9, r10, rll, r12, pc廠;this STMIA
LDMIA
STMIA
LDMIA
STMIA
LDMIA
STMIA
LDMIA
BIC
MSR
LDMIA insturction
retore all svc context, include cpsr
;from this point code start response interrupt 將ARM926EJS芯片進(jìn)入運(yùn)行態(tài)
(1)取出0x00010000處保存的值到r0。 (2)以遞增棧的形式從r0所指的Memory中取出一個(gè)word值,然后跳轉(zhuǎn)到此地址
(這個(gè)地址就是進(jìn)入Stop mode前保存的RestoreCpuContext的值)。 (3)以遞增棧的形式從r0所指的Memory中取值到rl、 r2、 r3、 r4、 r5、 r6、 r7用
rl r7的值恢復(fù)協(xié)處理器cpl5的cl、 c2、 c3、 c5、 c6、 c7、 cl3。 (4)切換到user模式,從r0所指的棧中以遞增棧的形式恢復(fù)r13、 lr。 (5)切換到abort模式,從r0所指的棧中以遞增的形式恢復(fù)spsr、 r13、 lr。 (6)切換到undef ine模式,從r0所指的棧中以遞增棧的形式恢復(fù)spsr、 r13、 lr。 (7)切換到irq模式,從r0所指的棧中以遞增棧的形式恢復(fù)spsr、rl3、lr。 (8)切換到fiq模式,從rO所指的棧中以遞增棧的形式恢復(fù)spsr、 r8、 r9、 rlO、
rll、rl2、r13、 lr。 (9)切換到svc模式,從rO所指的棧中取出svc模式的sp指針值并賦給sp指針。
(10)恢復(fù)0x00地址處的復(fù)位代碼(reset code),即把reset code copy到0x00 地址的內(nèi)存中。 (11)從sp所指的棧中取出svc模式進(jìn)入停止模式前的cpsr,并開中斷,把cpsr 的值賦給spsr。 (12)以sp為棧指針,以遞增棧的形式恢復(fù)r4、 r5、 r6、 r7、 r8、 r9、 r10、 rll、 rl2、 pc、 cpsr。
實(shí)現(xiàn)以上步驟的具體的源代碼如下 . globl WakeUpCpu WakeUpCpu LDR rl, = 0x00010000 LDR rO, [rl] LDMIA rO ! , {rl} ;load RestoreCpuContext value to Rl ;
13
BX rl ;j卿to rl ; 采用了上述的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,由于通過對(duì)片上系統(tǒng)進(jìn)行 特別設(shè)計(jì)加上系統(tǒng)軟件的配合,當(dāng)系統(tǒng)空閑時(shí)(即沒有程序需要執(zhí)行)通過硬件配置把CPU 推入停止態(tài),中斷來時(shí)如果CPU處于運(yùn)行態(tài),SOC直接把中斷送給CPU,如果中斷來時(shí)CPU處 在停止態(tài),SOC首先給CPU供電,然后給CPU提供時(shí)鐘信號(hào),從而CPU就被喚醒了 ,緊接著系 統(tǒng)軟件對(duì)CPU做相應(yīng)配置和場景恢復(fù),然后CPU響應(yīng)中斷,從而不再需要CPU始終處于運(yùn)行 態(tài),程序變成了一個(gè)單獨(dú)的主體,當(dāng)需要運(yùn)行的時(shí)候程序把自己拿到CPU上去執(zhí)行,執(zhí)行完 后關(guān)閉CPU,實(shí)現(xiàn)了在系統(tǒng)忙時(shí)打開CPU,系統(tǒng)空閑時(shí)徹底關(guān)閉CPU的效果,使得系統(tǒng)的平均
功耗進(jìn)一步降低,而且實(shí)現(xiàn)過程簡單快捷,工作性能穩(wěn)定可靠,適用范圍較為廣泛。 在此說明書中,本發(fā)明已參照其特定的實(shí)施例作了描述。但是,很顯然仍可以作出
各種修改和變換而不背離本發(fā)明的精神和范圍。因此,說明書和附圖應(yīng)被認(rèn)為是說明性的 而非限制性的。
權(quán)利要求
一種嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,所述的嵌入式系統(tǒng)包括片上系統(tǒng)、CPU、存儲(chǔ)模塊和電源模塊,其特征在于,所述的方法包括將CPU由運(yùn)行態(tài)進(jìn)入停止態(tài)的處理操作和將CPU由停止態(tài)進(jìn)入運(yùn)行態(tài)的處理操作,所述的將CPU由運(yùn)行態(tài)進(jìn)入停止態(tài)的處理操作包括以下步驟(A1)片上系統(tǒng)在系統(tǒng)沒有程序需要執(zhí)行的時(shí)候?qū)PU的中斷關(guān)閉;(A2)片上系統(tǒng)將CPU現(xiàn)場恢復(fù)運(yùn)行代碼拷貝到存儲(chǔ)模塊中的以CPU上電首先執(zhí)行的地址為起始地址的存儲(chǔ)區(qū)中;(A3)片上系統(tǒng)將當(dāng)前的CPU現(xiàn)場運(yùn)行狀態(tài)信息保存到存儲(chǔ)模塊中;(A4)片上系統(tǒng)對(duì)存儲(chǔ)模塊中保存的CPU現(xiàn)場運(yùn)行狀態(tài)信息進(jìn)行調(diào)整操作;(A5)片上系統(tǒng)驅(qū)動(dòng)電源系統(tǒng)將CPU關(guān)閉進(jìn)入停止?fàn)顟B(tài);所述的將CPU由停止態(tài)進(jìn)入運(yùn)行態(tài)的處理操作包括以下步驟(B1)片上系統(tǒng)在系統(tǒng)中斷到來的時(shí)候驅(qū)動(dòng)電源系統(tǒng)對(duì)CPU重新提供電源;(B2)片上系統(tǒng)對(duì)CPU重新提供穩(wěn)定時(shí)鐘信號(hào);(B3)CPU執(zhí)行所述的CPU現(xiàn)場恢復(fù)運(yùn)行代碼,從存儲(chǔ)模塊中讀取所述的CPU現(xiàn)場運(yùn)行狀態(tài)信息;(B4)片上系統(tǒng)將復(fù)位運(yùn)行代碼拷貝到存儲(chǔ)模塊中的以CPU上電首先執(zhí)行的地址為起始地址的存儲(chǔ)區(qū)中;(B5)片上系統(tǒng)將CPU的中斷打開。
2. 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,其特征在于,所述的 將CPU的中斷關(guān)閉,具體為片上系統(tǒng)通過對(duì)CPU的狀態(tài)寄存器的設(shè)置關(guān)閉CPU的中斷。
3. 根據(jù)權(quán)利要求2所述的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,其特征在于,所述的 將CPU的中斷打開,具體為片上系統(tǒng)通過對(duì)CPU的狀態(tài)寄存器的設(shè)置打開CPU的中斷。
4. 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,其特征在于,所述的 CPU上電首先執(zhí)行的地址為0x00地址。
5. 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,其特征在于,所述 的CPU現(xiàn)場運(yùn)行狀態(tài)信息包括存儲(chǔ)器管理單元的狀態(tài)值、高速緩存的狀態(tài)值和CPU中所有 寄存器的狀態(tài)值。
6. 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,其特征在于,所述的 對(duì)存儲(chǔ)模塊中保存的CPU現(xiàn)場運(yùn)行狀態(tài)信息進(jìn)行調(diào)整操作,具體為將PC指針的值指向CPU所執(zhí)行的指令的下一條指令。
7. 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,其特征在于,所述的 將CPU關(guān)閉進(jìn)入停止?fàn)顟B(tài),具體為片上系統(tǒng)通過配置硬件寄存器相應(yīng)的狀態(tài)值關(guān)閉CPU。
全文摘要
本發(fā)明涉及一種嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,將CPU由運(yùn)行態(tài)進(jìn)入停止態(tài)包括關(guān)閉CPU中斷、將CPU現(xiàn)場恢復(fù)運(yùn)行代碼拷貝到存儲(chǔ)模塊、將CPU現(xiàn)場運(yùn)行狀態(tài)信息保存到存儲(chǔ)模塊并進(jìn)行調(diào)整、關(guān)閉CPU進(jìn)入停止?fàn)顟B(tài),將CPU由停止態(tài)進(jìn)入運(yùn)行態(tài)包括對(duì)CPU重新供電和提供穩(wěn)定時(shí)鐘信號(hào)、CPU執(zhí)行現(xiàn)場恢復(fù)運(yùn)行代碼從存儲(chǔ)模塊中讀取CPU現(xiàn)場運(yùn)行狀態(tài)信息、將復(fù)位運(yùn)行代碼拷貝到存儲(chǔ)模塊、打開CPU中斷。采用該種嵌入式系統(tǒng)中降低CPU功耗的實(shí)現(xiàn)方法,通過片上系統(tǒng)進(jìn)行特別設(shè)計(jì)加上系統(tǒng)軟件的配合,實(shí)現(xiàn)了在系統(tǒng)忙時(shí)打開CPU,系統(tǒng)空閑時(shí)徹底關(guān)閉CPU的效果,使得系統(tǒng)的平均功耗進(jìn)一步降低,而且實(shí)現(xiàn)過程簡單快捷,工作性能穩(wěn)定可靠,適用范圍較為廣泛。
文檔編號(hào)G06F1/32GK101727171SQ20081020112
公開日2010年6月9日 申請(qǐng)日期2008年10月14日 優(yōu)先權(quán)日2008年10月14日
發(fā)明者彭世峰 申請(qǐng)人:上海摩波彼克半導(dǎo)體有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1