LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

ARM(A7) wfi唤醒后...是执行中断处理程序还是后一条指令

记录WFI相关细节,以及如何让中断唤醒后先执行wfi后指令,再执行中断异常;或者优先执行中断异常,再执行wfi后指令。

1. ARM(A7)关于WFI的描述

处理器可以通过执行WFI指令进入WFI低功耗状态。

当硬件检测到WFI唤醒事件,WFI指令结束。

WFI唤醒事件无法被CPSR屏蔽位屏蔽。

执行wfi后processor clock状态

进入wfi后,processor clock是什么状态?

WFI执行的结果:

  1. 关闭核内大部分时钟保持核供电。
  2. 保留小部分时钟确保核能从WFI低功耗状态唤醒。

执行wfi指令后,进入WFI低功耗模式之前,硬件做了如下的工作

某些情况下,打开processor clock但是processor并没有退出wfi状态

导致处理器退出WFI低功耗的几种事件

WFI和STANDBYWFI信号的关系

 2. 通过配置CPSR控制wfi后中断行为

2.1 CPSR寄存器以及配置

 通过配置AIF位,来决定CPU是否处理相关异常:

2.1.1 读写CPSR

对CPSR寄存器读写可以通过如下进行:

复制代码
__STATIC_INILINE uint32_t __get_CPSR(void)
{
    register uint32_t __regCPSR __ASM("cpsr");
    return(__regCPSR);
}

__STATIC_INILINE uint32_t __set_CPSR(uint32_t cpsr)
{
    register uint32_t __regCPSR __ASM("cpsr");
    __regCPSR = cpsr;  
}
复制代码

2.1.2 cps指令

cps指令用于配置CPSR的A、I、F位,以及进入特定处理器模式。仅在特权模式下可使用。

复制代码
CPSeffect iflags{, #mode}
CPS #mode
where:
effect is one of:
IE Interrupt or abort enable.
ID Interrupt or abort disable.
iflags is a sequence of one or more of:
a Enables or disables imprecise aborts.
i Enables or disables IRQ interrupts.
f Enables or disables FIQ interrupts.
mode
specifies the number of the mode to change to.
复制代码

比如:

cpsie if - 表示使能处理器对IRQ和FIQ的响应。

cpsid ai, #17 - 表示关闭aborts和irq响应,并进入FIQ模式。

cps #16 - 表示进入User模式。

2.2 配置流程

中断满足GIC的需求,通过Distributor送到CPU Interface,再送到Processor。

此时必然会将Processor从WFI状态唤醒,但是中断异常是否执行取决于CPSR.IF位设置。对于Async Abort执行取决于CPSR.A位设置。

 所以根据需要,在执行WFI之前设置CPSR.IF标志位即可:

posted on   ArnoldLu  阅读(1207)  评论(1编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示