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检测到中断"); 

相关内容

热门资讯

原创 真... 乔布斯曾讲过一个企业的底层逻辑:如果你在顶层做了正确的事,底层的结果就会随之而来。 人们关注企业每年...
国内成品油价今晚上涨,加满一箱... 界面新闻记者 | 田鹤琪 国内成品油价迎来“三连涨”。 2月24日,国家发改委发布消息称,自24时...
马斯克设想从月球电磁弹射AI卫... IT之家 2 月 25 日消息,据新华社报道,为更便捷部署专用于人工智能 (AI) 的数据中心卫星网...
马年首涨:中概股破局,A股引领... 在黄金因美元强势而黯然跳水、A股于春节后首个交易日释放出久违的磅礴巨量之际,大洋彼岸的美股市场,第一...
原创 帮... 昨晚大宗商品市场,走出一场“分道扬镳”的戏码。 原油连续第三天下跌,WTI跌破66美元,布伦特收在7...
今起可预约!办理2025年度个... 今起可预约!办理2025年度个税汇算 这些事项要注意 2026-02-25 06:54:50 看看...
原创 天... 年后的天津二手房,马上就要起跑了。 其实在1月份迹象就已显现。 往年的楼市淡季却“反常”得活跃:连续...
13F机构追踪:谷歌、拼多多、... 来源:活报告 在美股市场,资产管理规模超过1亿美元的机构需要在每个季度结束后的45天内向SEC提交1...
原创 手... 最近一段时间,有个词突然走红甚至冲上热搜,这就是手搓经济,在这个早已经现代工业化的时代,手搓经济是怎...
【美联储理事警告:美联储货币政... 【美联储理事警告:美联储货币政策可能无法应对AI引发的失业潮 】库克称,AI已引发美国劳动力市场的代...
黄金和交易提醒:金价高位“吞没... 来源:市场资讯 文章来源:汇通财经 周三(2月26日)亚市早盘,现货黄金窄幅震荡,目前交投于5150...
IPO雷达| 百普赛斯港股IP... 百普赛斯(301080.SZ)正式向香港联交所递交招股书。根据公司同步发布的2025年度业绩预告,全...
原创 澳... 2025年一则“澳洲高薪挖角中国稀土团队”的新闻,把全球稀土市场搅得风生水起。澳大利亚莱纳斯公司甩出...
苹果收购单人AI初创公司inv... IT之家 2 月 25 日消息,据 MacRumors 报道,一份提交给欧盟的新文件显示,苹果公司已...
珍惜:由早晨跑步所想到的 我每天早晨起来习惯在校园跑步,在跑步的时候,常常会思考跑步、人生及享受人生之间的关系。 我们知道人的...
趁乱抛售?最高法院刚裁决,对冲... 来源:市场资讯 来源:金十数据 根据外媒获得的一份美国银行报告,花旗的对冲基金客户在上周五美国最高法...
特别关注|9艘!“超高规格”新... 根据广船国际官微介绍,上述MR型油轮新造船为广船国际自主设计,总长约183米、宽32.2米,设计服务...
甲骨文股价在星门项目相关报道发... 来源:环球市场播报 周一, 甲骨文股价下跌4.5%,此前报道称,这家云计算公司与OpenAI和软银的...