ARM(A7) wfi唤醒后...是执行中断处理程序还是后一条指令
记录WFI相关细节,以及如何让中断唤醒后先执行wfi后指令,再执行中断异常;或者优先执行中断异常,再执行wfi后指令。
1. ARM(A7)关于WFI的描述
处理器可以通过执行WFI指令进入WFI低功耗状态。
当硬件检测到WFI唤醒事件,WFI指令结束。
WFI唤醒事件无法被CPSR屏蔽位屏蔽。
执行wfi后processor clock状态
进入wfi后,processor clock是什么状态?
WFI执行的结果:
- 关闭核内大部分时钟保持核供电。
- 保留小部分时钟确保核能从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标志位即可:
联系方式:arnoldlu@qq.com