博客專欄

        EEPW首頁 > 博客 > ARM WFI和WFE指令

        ARM WFI和WFE指令

        發(fā)布人:電子禪石 時間:2024-07-13 來源:工程師 發(fā)布文章

        1. 前言

        蝸蝸很早以前就知道有WFI和WFE這兩個指令存在,但一直似懂非懂。最近準備研究CPU idle framework,由于WFI是讓CPU進入idle狀態(tài)的一種方法,就下決心把它們弄清楚。

        WFI(Wait for interrupt)和WFE(Wait for event)是兩個讓ARM核進入low-power standby模式的指令,由ARM architecture定義,由ARM core實現。聽著挺簡單,但怎么會有兩個指令?它們的區(qū)別是什么?使用場景是什么?深究起來,還挺有意思,例如:能想象WFE和spinlock的關系嗎?

        2. WFI和WFE

        1)共同點

        WFI和WFE的功能非常類似,以ARMv8-A為例(參考DDI0487A_d_armv8_arm.pdf的描述),主要是“將ARMv8-A PE(Processing Element, 處理單元)設置為low-power standby state”。

        需要說明的是,ARM architecture并沒有規(guī)定“l(fā)ow-power standby state”的具體形式,因而可以由ARM core自行發(fā)揮,根據ARM的建議,一般可以實現為standby(關閉clock、保持供電)、dormant、shutdown等等。但有個原則,不能造成內存一致性的問題。以Cortex-A57 ARM core為例,它把WFI和WFE實現為“put the core in a low-power state by disabling the clocks in the core while keeping the core powered up”,即我們通常所說的standby模式,保持供電,關閉clock。

        2)不同點

        那它們的區(qū)別體現在哪呢?主要體現進入和退出的方式上。

        對WFI來說,執(zhí)行WFI指令后,ARM core會立即進入low-power standby state,直到有WFI Wakeup events發(fā)生。

        而WFE則稍微不同,執(zhí)行WFE指令后,根據Event Register(一個單bit的寄存器,每個PE一個)的狀態(tài),有兩種情況:如果Event Register為1,該指令會把它清零,然后執(zhí)行完成(不會standby);如果Event Register為0,和WFI類似,進入low-power standby state,直到有WFE Wakeup events發(fā)生。

        WFI wakeup event和WFE wakeup event可以分別讓Core從WFI和WFE狀態(tài)喚醒,這兩類Event大部分相同,如任何的IRQ中斷、FIQ中斷等等,一些細微的差別,可以參考“DDI0487A_d_armv8_arm.pdf“的描述。而最大的不同是,WFE可以被任何PE上執(zhí)行的SEV指令喚醒。

        所謂的SEV指令,就是一個用來改變Event Register的指令,有兩個:SEV會修改所有PE上的寄存器;SEVL,只修改本PE的寄存器值。下面讓我們看看WFE這種特殊設計的使用場景。

        3. 使用場景

        1)WFI

        WFI一般用于cpuidle。

        2)WFE

        WFE的一個典型使用場景,是用在spinlock中(可參考arch_spin_lock,對arm64來說,位于arm64/include/asm/spinlock.h中)。spinlock的功能,是在不同CPU core之間,保護共享資源。使用WFE的流程是:

        a)資源空閑

        b)Core1訪問資源,acquire lock,獲得資源

        c)Core2訪問資源,此時資源不空閑,執(zhí)行WFE指令,讓core進入low-power state

        d)Core1釋放資源,release lock,釋放資源,同時執(zhí)行SEV指令,喚醒Core2

        e)Core2獲得資源

        以往的spinlock,在獲得不到資源時,讓Core進入busy loop,而通過插入WFE指令,可以節(jié)省功耗,也算是因禍(損失了性能)得福(降低了功耗)吧。

         


        *博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: WFI

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 莱州市| 伊吾县| 黄龙县| 辽宁省| 巴楚县| 灵武市| 宿松县| 东乡| 溧水县| 马尔康县| 兴国县| 福贡县| 香港 | 洛隆县| 蓝田县| 类乌齐县| 芒康县| 达日县| 临夏市| 武乡县| 涞源县| 游戏| 武胜县| 罗山县| 昔阳县| 海原县| 涟源市| 阿城市| 泸溪县| 克什克腾旗| 禹城市| 和林格尔县| 墨江| 巩义市| 和田市| 滨州市| 盐池县| 尚义县| 曲沃县| 都昌县| 达州市|