最小化ARM Cortex-M CPU功耗的方法與技巧
1理解Thumb-2
本文引用地址:http://www.ex-cimer.com/article/273936.htm首先,讓我們從一個(gè)看起來并不明顯的起點(diǎn)開始討論節(jié)能技術(shù)—指令集。所有Cortex-M CPU都使用Thumb-2指令集,它融合了32位ARM指令集和16位Thumb指令集,并且為原始性能和整體代碼大小提供了靈活的解決方案。在Cortex-M內(nèi)核上一個(gè)典型的Thumb-2應(yīng)用程序與完全采用ARM指令完成的相同功能應(yīng)用程序相比,代碼大小減小到25%之內(nèi),而執(zhí)行效率達(dá)到90%(當(dāng)針對運(yùn)行時(shí)間進(jìn)行優(yōu)化后)。
Thumb-2中包含了許多功能強(qiáng)大的指令,能夠有效減少基礎(chǔ)運(yùn)算所需的時(shí)鐘周期數(shù)。減少時(shí)鐘周期數(shù)意味著現(xiàn)在你能夠以更少的CPU功耗完成手頭的工作。例如,假設(shè)要完成一個(gè)16位乘法運(yùn)算(如圖1所示)。在一個(gè)8位8051內(nèi)核的MCU上執(zhí)行這個(gè)運(yùn)算將需要48個(gè)時(shí)鐘周期,并占用48字節(jié)的Flash存儲(chǔ)空間。使用一個(gè)16位內(nèi)核的MCU(例如C166)執(zhí)行相同的運(yùn)算需要8個(gè)時(shí)鐘周期,并占用8字節(jié)的Flash存儲(chǔ)空間。相比之下,在使用Thumb-2指令集的Cortex-M3內(nèi)核中完成相同運(yùn)算僅僅需要1個(gè)時(shí)鐘周期,并占用2字節(jié)的Flash存儲(chǔ)空間。Cortex-M3內(nèi)核能夠通過使用更少時(shí)鐘周期完成相同任務(wù),節(jié)省了能耗;同時(shí)也能夠通過占用極少的Flash存儲(chǔ)空間,減少Flash存儲(chǔ)器訪問次數(shù),實(shí)現(xiàn)最終能耗節(jié)省的目標(biāo)(除此之外,更小的應(yīng)用代碼也使得系統(tǒng)可以選擇更小的Flash存儲(chǔ)器,進(jìn)一步降低整體系統(tǒng)功耗)。
圖1 時(shí)鐘周期數(shù)對比
圖2 ARM7和Cortex-M3的中斷響應(yīng)
2中斷控制器節(jié)能技術(shù)
Cortex-M架構(gòu)中的中斷控制器(Nested Vectored Interrupt Controller or NVIC)在降低CPU功耗方面也起著關(guān)鍵作用。以前的ARM7-TDMI需要“多達(dá)”42個(gè)時(shí)鐘周期,Cortex-M3 NVIC從中斷請求發(fā)生到執(zhí)行中斷處理代碼僅需要12個(gè)時(shí)鐘周期的轉(zhuǎn)換時(shí)間,這顯然提高了CPU執(zhí)行效率,降低了CPU時(shí)間浪費(fèi)。除了更快進(jìn)入中斷處理程序之外,NVIC也使得中斷之間切換更加高效。
在ARM7-TDMI內(nèi)核實(shí)現(xiàn)中,需要先花費(fèi)數(shù)個(gè)時(shí)鐘周期從中斷處理程序返回主程序,然后再進(jìn)入到下一個(gè)中斷處理程序中,中斷服務(wù)程序之間的“入棧和出棧(push-and-pop)”操作就要消耗多達(dá)42個(gè)時(shí)鐘周期。而Cortex-M NVIC采用更有效的方法實(shí)現(xiàn)相同任務(wù),被稱為“末尾連鎖(tail-chaining)”。這種方法使用僅需6個(gè)時(shí)鐘周期處理就能得到允許,進(jìn)入下一個(gè)中斷服務(wù)程序的所需信息。采用末尾連鎖,不需要進(jìn)行完整的入棧和出棧循環(huán),這使得管理中斷過程所需的時(shí)鐘周期數(shù)減少65%(如圖2所示)。
3存儲(chǔ)器節(jié)能注意事項(xiàng)
存儲(chǔ)器接口和存儲(chǔ)器加速器能夠明顯影響CPU功耗。代碼中的分支和跳轉(zhuǎn)可能會(huì)對為CPU提供指令的流水線產(chǎn)生刷新影響,在這種情況下CPU需要延遲幾個(gè)時(shí)鐘周期以等待流水線重新完成填充。在Cortex-M3或Cortex-M4內(nèi)核中,CPU配備了一條3級(jí)流水線。刷新整條流水線將導(dǎo)致CPU延遲3個(gè)時(shí)鐘周期,如果有Flash存儲(chǔ)器等待狀態(tài)發(fā)生,時(shí)間會(huì)更長,以便完成重新填充過程。這些延遲完全浪費(fèi)功耗,沒有任何功用。為了幫助減少延遲,Cortex-M3和M4內(nèi)核包括一個(gè)被稱為推測取指(Speculative Fetch)的功能,即它在流水線中對分支進(jìn)行取指的同時(shí)也取指可能的分支目標(biāo)。如果可能的分支目標(biāo)命中,那么推測取指能夠把延遲降低到1個(gè)時(shí)鐘周期。雖然這個(gè)特性是有用的,但顯然不夠,許多Cortex-M產(chǎn)品供應(yīng)商都增加了自己的IP以增強(qiáng)這個(gè)能力。
評論