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

相关内容

热门资讯

圣邦股份跌3.32%,成交额1... 来源:新浪证券-红岸工作室 7月24日,圣邦股份跌3.32%,成交额11.29亿元,换手率1.86%...
新华鲜报丨企业年金个人账户明年... 无论你在哪里干、社会保险接着算,这句话在企业年金上有了新体现。 7月24日,《企业年金个人账户转移接...
原创 曹... 饭桌上最容易吵翻天的话题,除了催婚,大概就是买房。一个说手里有房心里不慌,一个说背上房贷就是给银行打...
盒马超盒算NB首进西南 成都6... 观点网讯:7月24日,盒马旗下平价社区超市品牌超盒算NB正式进入西南市场,首批6家门店在成都同步开业...
上海出台直接融资“20条” 打... ◎记者 陈佳怡 近日,上海出台《上海市充分发挥直接融资功能 进一步加强科技金融服务的若干措施》(下称...
10倍牛股德明利:董事长承诺,... 7月24日晚,深圳市德明利技术股份有限公司(证券代码:001309 证券简称:德明利)发布关于控股股...
“科技小登”为何跳水? 文|达摩财经 7月21日,长鑫科技打新结果揭晓。作为国内存储行业龙头,公司距离科创板上市更进一步。...
全国老破小,有一次大翻身机会! 作者:路小舟 卖不掉、租不掉、贷不了款、价格咔咔掉、住着太受罪、等拆迁可能这辈子都等不到…… 万人嫌...
北美世界杯,格外吸引中国富豪 文|老鱼儿 编辑|杨旭然 2026年7月20日,西班牙队凭借费兰·托雷斯在加时赛第106分钟打入制胜...
年赚8亿,曹德旺家族的“宁德时... 福耀曹家的动力电池生意,正在跑出行业罕见的融资速度。 7月8日,江苏证监局公示辅导备案信息,正力新能...
原创 7... 写在文章前的声明:在本文之前的说明:本文中所列的投资信息,只是一个对基金资产净值进行排行的客观描述,...
AI细分赛道,7月逆市爆发! 7月的A股AI板块经历了一轮剧烈调整。 光模块、光纤类个股普遍重挫,科创50日内宽幅震荡成为常态,上...
元鹏OPC(虹口)跨境电商潮创... 7月23日,元鹏OPC(虹口)跨境电商潮创社区在上海虹口正式启动运营。该项目专注打造“产业带+(跨境...
老酒回收服务的场景适配与选型关... 在礼品流通与收藏品变现的环节中,老酒回收作为一种常见的资产处置方式,其服务内容与流程往往受到持有者的...
长鑫科技下周一上市,发行价为8... 来源:@财联社APP微博 财联社7月23日讯,今日晚间,长鑫科技今日发布公告称,公司股票将于2026...
数字人民币开启从“可用”到“好... 证券时报记者 李颖超 当钱包开立规模持续扩容、试点版图不断铺开之后,数字人民币开始尝试切换发展逻辑。...
收评:超4200只个股上涨!电... 每经编辑:彭水萍 7月23日,A股全天走出缩量修复行情,三大指数小幅收红,盘面黄白线分化明显,中小盘...
商务部:将加快修订出台关于外国... 【大河财立方消息】7月23日,国务院新闻办公室举行新闻发布会,介绍2026年上半年商务工作及运行情况...
「AI新世代」智谱算力出鞘:1... 本报(chinatimes.net.cn)记者石飞月 北京报道 这段时间,智谱的股价经历了一番大起大...