WFE和WFI的區別


1. 概念:

WFI(Wait for interrupt)和WFE(Wait for event)是兩個讓ARM核進入low-power standby模式的指令,由ARM architecture定義,由ARM core實現。

2. WFI和WFE

2.1 相同點

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

需要說明的是,ARM architecture並沒有規定“low-power standby state”的具體形式,因而可以由ARM core自行發揮,根據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.2 不同點

那它們的區別體現在哪呢?主要體現進入和退出的方式上。
對WFI來說,執行WFI指令后,ARM core會立即進入low-power standby state,直到有WFI Wakeup events發生。
而WFE則稍微不同,執行WFE指令后,根據Event Register(一個單bit的寄存器,每個PE一個)的狀態,有兩種情況:如果Event Register為1,該指令會把它清零,然后執行完成(不會standby);如果Event Register為0,和WFI類似,進入low-power standby state,直到有WFE Wakeup events發生。

2.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訪問資源,此時資源不空閑,執行WFE指令,讓core進入low-power state
d)Core1釋放資源,release lock,釋放資源,同時執行SEV指令,喚醒Core2
e)Core2獲得資源

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM