<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > ARM WFI和WFE指令

ARM WFI和WFE指令

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

1. 前言

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

WFI(Wait for interrupt)和WFE(Wait for event)是兩個(gè)讓ARM核進(jìn)入low-power standby模式的指令,由ARM architecture定義,由ARM core實(shí)現。聽(tīng)著(zhù)挺簡(jiǎn)單,但怎么會(huì )有兩個(gè)指令?它們的區別是什么?使用場(chǎng)景是什么?深究起來(lái),還挺有意思,例如:能想象WFE和spinlock的關(guān)系嗎?

2. WFI和WFE

1)共同點(diǎn)

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

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

2)不同點(diǎn)

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

對WFI來(lái)說(shuō),執行WFI指令后,ARM core會(huì )立即進(jìn)入low-power standby state,直到有WFI Wakeup events發(fā)生。

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

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

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

3. 使用場(chǎng)景

1)WFI

WFI一般用于cpuidle。

2)WFE

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

a)資源空閑

b)Core1訪(fǎng)問(wèn)資源,acquire lock,獲得資源

c)Core2訪(fǎng)問(wèn)資源,此時(shí)資源不空閑,執行WFE指令,讓core進(jìn)入low-power state

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

e)Core2獲得資源

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

 


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: WFI

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>