ARM系列之ARM hint instruction以及WFI补充
admin
2024-03-28 16:58:05
0

目录

  • 什么是ARM hint instruction
  • 伪代码实现
  • standby 模式- 待机模式
  • WFI使用注意事项补充

接上文ARM系列之ARM多核指令WFE、WFI、SEV原理
本文主要对WFI使用注意事项补充说明。

什么是ARM hint instruction

Hint instruction is for the instruction set space that is reserved for 
architectural hint instructions.Some encodings described here are not allocated in this revision of the architecture, 
and behave as NOPs. These encodings might be allocated to other hint functionality 
in future revisions of the architecture and therefore must not be used by software.

HINT 指令可以合法地被视为 NOP指令,但它们可以具有特定于实现的效果,常见的HINT指令有:

NOP // No operation,无操作, 不保证CPU会花时间去执行
YIELD // 提示当前线程正在执行可以换出的任务
WFE // Wait for Event,进入low power状态,直到等待的事件发生
WFI // Wait for interrupt,进入low power状态,直到等待的中断或与中断类似的操作发生
SEV // Send Event,发送事件,与WFE对应
SEVL // Send Event Local,发送本地事件,与WFE对应

ARM 汇编语言中包含可用于让core进入低功耗状态(low-power state)的指令:WFI或WFE。ARM架构将这些指令定义为hint指令,这意味着core在执行它们时不需要采取任何特定操作。然而,在 Cortex-A 处理器系列中,这些指令的实现方式是关闭几乎所有内核部分的时钟。这意味着内核的功耗显着降低,仅消耗静态漏电流,没有动态功耗。

伪代码实现

SystemHintOp op;case CRm:op2 ofwhen '0000 000' op = SystemHintOp_NOP;when '0000 001' op = SystemHintOp_YIELD;when '0000 010' op = SystemHintOp_WFE;when '0000 011' op = SystemHintOp_WFI;when '0000 100' op = SystemHintOp_SEV;when '0000 101' op = SystemHintOp_SEVL;when '0000 110'if !HaveDGHExt() then EndOfInstruction();    // Instruction executes as NOPop = SystemHintOp_DGH;when '0000 111' SEE "XPACLRI";when '0001 xxx'case op2 ofwhen '000' SEE "PACIA1716";when '010' SEE "PACIB1716";when '100' SEE "AUTIA1716";when '110' SEE "AUTIB1716";otherwise EndOfInstruction();when '0010 000'if !HaveRASExt() then EndOfInstruction();    // Instruction executes as NOPop = SystemHintOp_ESB;when '0010 001'if !HaveStatisticalProfiling() then EndOfInstruction();    // Instruction executes as NOPop = SystemHintOp_PSB;when '0010 010'if !HaveSelfHostedTrace() then EndOfInstruction();    // Instruction executes as NOPop = SystemHintOp_TSB;when '0010 100'op = SystemHintOp_CSDB;when '0011 xxx'case op2 ofwhen '000' SEE "PACIAZ";when '001' SEE "PACIASP";when '010' SEE "PACIBZ";when '011' SEE "PACIBSP";when '100' SEE "AUTIAZ";when '101' SEE "AUTHASP";when '110' SEE "AUTIBZ";when '111' SEE "AUTIBSP";when '0100 xx0'op = SystemHintOp_BTI;// Check branch target compatibility between BTI instruction and PSTATE.BTYPESetBTypeCompatible(BTypeCompatible_BTI(op2<2:1>));otherwise EndOfInstruction();
case op ofwhen SystemHintOp_YIELDHint_Yield();when SystemHintOp_DGHHint_DGH();when SystemHintOp_WFEHint_WFE(-1, WFxType_WFE);when SystemHintOp_WFIHint_WFI(-1, WFxType_WFI);when SystemHintOp_SEVSendEvent();when SystemHintOp_SEVLSendEventLocal();when SystemHintOp_ESBif HaveTME() && TSTATE.depth > 0 thenFailTransaction(TMFailure_ERR, FALSE);SynchronizeErrors();AArch64.ESBOperation();if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation();TakeUnmaskedSErrorInterrupts();when SystemHintOp_PSBProfilingSynchronizationBarrier();when SystemHintOp_TSBTraceSynchronizationBarrier();when SystemHintOp_CSDBConsumptionOfSpeculativeDataBarrier();when SystemHintOp_BTISetBTypeNext('00');otherwise    // do nothing

standby 模式- 待机模式

WFI指令的主要目的就是使core进入standby模式,直到中断或者类似中断的事件发送,才退出,core继续工作。

在待机模式下,core保持上电状态,但其大部分时钟停止或者进入时钟门限。这意味着core的绝大部分都处于static state,唯一消耗的功率是用于寻找中断唤醒条件的泄漏电流和少量逻辑时钟。

使用 WFI(等待中断)或 WFE(等待事件)指令可以进入此模式。 ARM 建议在 WFI 或 WFE 之前使用数据同步屏障 (Data Synchronization Barrier ,DSB) 指令,以确保待处理的内存事务在更改状态之前完成。

core进入待机状态后,会停止执行,直到检测到唤醒事件。唤醒条件取决于进入指令。对于 WFI,需要中断事件或外部调试请求来唤醒core。对于 WFE,存在许多指定的事件,包括cluster中执行 SEV 指令的另一个core。

WFI 指令广泛用于电池供电的系统。例如,手机可以每秒多次将core置于待机模式,同时等待用户按下按钮才唤醒core,从而可以节省功耗。

WFE 类似于 WFI。core暂停执行,直到发生事件。这可以是列出的事件条件之一,也可以是cluster中另一个core发出的事件信号。其他core可以通过执行 SEV 指令来发出事件信号。 SEV 向所有core发送一个事件信号。还可以对generic timer通用定时器进行编程,以触发将core从 WFE 唤醒的周期性事件。

总而言之,WFI 指令可以提示hint core在接收到中断或类似的exception之前无需执行任何操作,具体来说有两部分:

强制暂停core的运行以及所有相关的总线活动。
暂停处理器执行指令。

WFI使用注意事项补充

  • 在WFI指令之前使用 DSB 、DMB等内存屏障指令,使得core在进入待机模式之前,完成内存交互。
  • 当硬件检测到WFI唤醒事件后,WFI指令才算执行完成。
  • WFI唤醒事件不能被CPSR中的相关掩码(I F A)等bit位屏蔽,即忽略CPSR中的IFA相关bit 位。
  • ARM架构并未定义低功耗状态的确切性质,但 WFI 指令的执行不得导致内存一致性遭受破坏。
  • 如果是为了测试中断事件而使用WFI,注意在中断发生和WFI之间不应有耗时事件(如大量的printf打印),否则有可能导致中断丢失,即中断已经处理完成了才执行WFI指令,此时中断已经消失了,但是WFI还在一直等中断。use case如下:
/* 案例一*/
/* 假设这是个timer,10秒后将发起中断,* 中断handler在其他地方定义 */
Timer(10); 
/* 如果处理器没有接收到中断,WFI指令将没有完成,* 一直处于休眠状态,下一条printf也不会被执行。* 当检测到中断时(10S后),WFI指令才算完成,* 才会唤醒处理器,下一条printf会被执行* */
WFI();   
printf("中断发生,WFI检测到中断"); 
/* 案例二 */
/* 10秒后将发起中断 */
Timer(10); 
/* 执行这个函数需要20秒 */
WasteTime(20); 
/* 从中断发生,到处理完成中断用不了10秒,执行到WFI时,中断已经消失了,
* 所以CPU会一直处于休眠状态,下面的printf也不会被执行 
* */
WFI();   
printf("中断发生,WFI检测到中断"); 

相关内容

热门资讯

贷款也“拼团” 银行抢单忙 购物能“拼团”,贷款也能! 近日,一场“拼团融资”的银企对接活动在省工业和信息化厅拉开帷幕。 “贷款...
逛花展、赶市集、嗨直播!202... 5月23日 “2026北京直播电商购物月” 在丰台区丽泽金融商务区·2026北京国际花展 正式拉开帷...
2026中关村毕业季|AI“吃... “上帝会掷骰子吗?” 在联想未来中心的“与智者同场”展区,一位海淀学子对着屏幕问道。 爱因斯坦微微前...
原创 今... 今日为5月23日,国际现货黄金价格在4500美元/盎司整数关口附近徘徊不前,日内最低触及4480美元...
三连亏后变为“无主”状态,农尚... 从吴亮手中接盘农尚环境(300536)不足三年后,林峰如今让出了公司控制权,上市公司进入“无主”状态...
55岁湖南女首富出手!豪掷13... 快科技5月24日消息,与马斯克、库克并肩而坐,刚参加完国宴的湖南女首富周群飞就买了家上市企业。 近日...
外资加仓A股,岂是跟风这么简单... 熬过忙碌的交易日,在周末安静时段,理清接下来布局方向。本篇为大家准备了5条要闻,涵盖市场动态、行业变...
原创 俄... 在全球能源的残酷牌桌上,手里攥着石油,腰杆子才能硬气。长期以来,中东的沙漠、俄罗斯的冰原、美国的页岩...
喜力啤酒有产品将涨价,华润啤酒... 来源:红星新闻 红星资本局5月22日消息,今日,红星资本局从雪花啤酒(厦门)有限公司、华润啤酒方面获...
原创 金... 心理预期调整刻不容缓,五月二十二日,黄金价格或将重现十五年前的历史性低迷。 近期若您密切关注着黄金市...
原创 马... 埃隆·马斯克如果能让SpaceX实现“科幻小说”级别的目标,他可能获得1万亿美元的收入。 埃隆·马斯...
涨涨涨!放开限制、可加杠杆!这... 韩国股市站在风口上! 据最新消息,为吸引更多海外资金进入股市,韩国政府计划放开限制,允许境外投资者直...
下周9家上会丨科创板首单IPO... IPO及再融资上会预告 据交易所官网审核动态信息,下周(5.25-5.29)IPO上会审核6家企业,...
富途、老虎市值蒸发1/4!或被... 来源:金融时报 5月22日,中国证监会宣布依法对Tiger Brokers (NZ) Limited...
马爸爸的好兄弟钱多多搞了杀猪盘... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 上周四,港股经纬天地大崩盘...
原创 壳... 编辑:XL 国际能源圈最近炸开了锅,壳牌这家百年石油巨头在2026年3月与委内瑞拉政府正式签署多项油...
存储热潮愈演愈烈!奖金拿到手软... 财联社5月24日讯(编辑 卞纯)在席卷全球的存储芯片热潮中,韩国“存储芯片双雄”SK海力士和三星无疑...
揽牌、合作、生态,跨境支付头部... 近日,国内头部跨境支付机构密集落地海外重要布局,一方面,连连数字、PingPong两家公司相继在中东...
原创 帮... 老铁们,周末好!我是帮主郑重。刚扫了一眼下周的财经日历,好家伙,事件一个接一个,堪称“消息面轰炸周”...
海南省住建厅与中国石化海南石油... 5月22日,中国石化海南石油分公司代表、党委书记李新强、总经理蔡文东一行赴海南省住建厅拜访交流。省住...