1. 程式人生 > >arm彙編指令WFI和WFE

arm彙編指令WFI和WFE

1. 前言

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

WFI(Wait for interrupt)和WFE(Wait for event)是兩個讓ARM核進入low-power standby模式的指令,由ARM architecture定義,由ARM core實現。聽著挺簡單,但怎麼會有兩個指令?它們的區別是什麼?使用場景是什麼?深究起來,還挺有意思,例如:能想象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並沒有規定“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)不同點

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

對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發生。

WFI wakeup event和WFE wakeup event可以分別讓Core從WFI和WFE狀態喚醒,這兩類Event大部分相同,如任何的IRQ中斷、FIQ中斷等等,一些細微的差別,可以參考“DDI0487A_d_armv8_arm.pdf“的描述。而最大的不同是,WFE可以被任何PE上執行的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訪問資源,此時資源不空閒,執行WFE指令,讓core進入low-power state

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

e)Core2獲得資源

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


相關推薦

arm彙編指令WFIWFE

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

arm 待機指令 WFIWFE

百度百科上對於待機的解釋: 待機是將當前處於執行狀態的資料儲存在記憶體中,機器只對記憶體供電,而硬碟、螢幕和CPU等部件則停止供電。由於資料儲存在速度快的記憶體中,因此進入等待狀態和喚醒的速度比較快。 對於手機而言,待機就是除了DDR保持低頻重新整理,維護DDR中資料以外,

ARM彙編指令——TSTBNE、BEQ解析

從彙編角度來講,TST和AND可以說做的是完全相同的運算,只不過TST不儲存具體運算結果只判斷是否為0。 簡單例子: TST     R0, #0x8    ;          測試bit_3是否為0 BNE    SuspendUp ;       BNE指令 是“不相等或不為0跳轉指令 

ARM彙編指令——算數邏輯指令

MOV : 傳送 (Move)//相當於賦值語句 MOV{條件}{S} <dest>, <op 1> dest = op_1 MOV 從另一個暫存器、被移位的暫存器、或一個立即值裝載一個值到目的暫存器。你可

ARM彙編指令-STMFDLDMFD

根據ATPCS規則,我們一般使用FD(FullDescending)型別的資料棧!所以經常使用的指令就有STMFD和LDMFD。這兩個指令一般用於進行程式搬移等大規模操作前的cpu現場保護和操作結束後的現場恢復,屬於非單一連續的壓棧和出棧。 STMFD SP! ,{R0-R

STM32彙編指令(一)WFI WFE

ARM彙編的呼叫 嵌入式開發,尤其是編寫BSP的時候,非常接近底層,這個時候有可能用一些彙編指令來保證程式的簡潔和高效,但是平常編寫程式碼用到的都是C/C++,那麼如何使用匯編指令呢? 其實這個問題也很簡單,在C/C++中提供了關鍵字asm或者ASM來內嵌彙

ARM WFIWFE指令

1. 前言 蝸蝸很早以前就知道有WFI和WFE這兩個指令存在,但一直似懂非懂。最近準備研究CPU idle framework,由於WFI是讓CPU進入idle狀態的一種方法,就下決心把它們弄清楚。 WFI(Wait for interrupt)和WFE(Wait for event)是兩個讓ARM核進入l

ARM彙編:MRSMSR指令

                        ARM彙編:MRS和MSR指令 ARM中有兩條指令用於在狀態暫存器和通用暫存器之間傳送資料。 一:下面先來說說狀態暫存器

ARM彙編:載入儲存指令集(六大類)---LDR、LDRB、LDRH、STR、STRB、STRH

ARM的六大類指令集---LDR、LDRB、LDRH、STR、STRB、STRH ARM微處理器支援載入/儲存指令用於在暫存器和儲存器之間傳送資料,載入指令用於將儲存器中的資料傳送到暫存器,儲存指令則完成相反的操作。常用的載入儲存指令如下: —  LDR     字資料載

1.19.ARM彙編指令集7之儲存器訪問指令(LDRSTR)

ARM彙編指令集的儲存器訪問指令: LDR & STR & LDM & STM & SWP 這裡先總的介紹一下儲存器訪問指令,然後再詳解說前兩個(LDR&STR

常用的ARM彙編指令

一. 帶點的(一般都是ARM GNU偽彙編指令)   1. ".text"、".data"、".bss" 依次表示的是 “以下是程式碼段”, “以下是初始化資料段”, “以下是未初始化資料段”。 2.".global" 定義一個全

ARM彙編:BNETSTBEQ

                                  ARM彙編:BNE和TST (1)例一:TST與BNE

ARM彙編.global .extern .text

在ARM彙編中,常搞不清.global和.extern的區別,下面就簡要闡述一下這兩個的區別。 1>.global .global關鍵字用來讓一個符號對連結器可見,可以供其他連結物件模組使用。 .global _start 讓_start符號成為可見的標示符,這樣連結器就知道跳

ARM彙編指令集_學習筆記(1)

一、什麼是ARM彙編? 執行在ARM處理器上的組合語言就叫ARM彙編。 C程式執行在X86平臺,底層就是X86彙編;執行在ARM平臺,底層就是ARM彙編。ARM彙編與X86彙編有顯著區別。 X86屬於CISC(複雜指令集);ARM屬於RISC(精簡指令集)。 二、CISC存在的問題:

ARM彙編指令程式設計之選擇排序

題目:將整數陣列{0XAABBCC11,0XAABBCC00,0XAABBCC33,0XAABBCC22,0XAABBCC44}進行選擇排序。 實驗環境:ARM Developer Suite V1.2 程式碼如下: AREA test,CODE

常用的ARM彙編指令集與彙編呼叫C語言

***指令與偽指令: 指令:CPU機器指令的助記符,經過編譯後得到一串10組成的機器碼,可以被CPU直接讀取執行。 偽指令:編譯器環境提供,用來指導編譯過程,最終不會生成機器碼。 ***LDR/STR架構: CPU不能直接對記憶體的內容進行操作,必須藉助CPU

ARM-彙編指令集(總結)

https://www.cnblogs.com/wxb20/p/6249580.html ARM彙編指令集 指令、偽指令 (彙編)指令: 是機器碼的助記符,經過彙編器編譯後,由CPU執行。 (彙編)偽指令:用來指導指令執行,是彙編器的產物,最終不會生成機器碼。 有兩種不同風格

iOS安全攻防(十二)arm彙編之mov mvn

先看2段程式碼: 第一段程式碼main裡面沒有任何語句,第2段程式碼是返回0值,這2段程式碼的反彙編是一樣的,看下圖: 一共 2行彙編程式碼,第2行 bx lr 代表返回到main呼叫之後的語句,而第一行 movs是 mov的擴充套件,最後字母s代表影響標誌位,從彙編程式碼可知,如果返回int

1.15.ARM彙編指令3之邏輯指令

ARM彙編指令之邏輯指令:and & orr & eor & bic * and 邏輯與操作指令,將operand2的值與暫存器Rn的值按位邏輯與操作,結果儲存到Rd中。 指令

1.16.ARM彙編指令4之比較指令

ARM比較指令:CMP & CMN & TST & TEQ * CMP 比較指令,指令使用Rn的值減去operand2的值,根據操作的結果更新CPSR暫存器相應的條件標誌位,