ARM系列 -- WFI和WFE
文摘
科技
2023-05-28 12:00
北京
今天来看两个特殊的指令,WFI(Wait For Interrupt)和WFE(Wait For Event)。这两条指令的语法非常简单,不需要带任何参数。如果大家读过前面文章,肯定对中断(interrupt)不陌生。至于事件(event),与中断有点像,不同的是处理器对二者的处理方式不一样。可以先将事件理解成特殊的中断。先看WFI,首先,我们研究一下ARM处理器进入低功耗状态的机制。当一个处理器核的工作负载不高时,可以通过降压降频(DVFS)的方式来让处理器运行在较低的频率,从而降低整个芯片的功耗。如果处理器的没有工作负载,完全空闲下来,这时就需要其它方法让处理器进入更低的功耗模式。如果大家对ACPI有一些了解,就知道其中定义的“睡眠(sleep)”模式就有好几种,每种模式对应的电源和时钟状态不同。处理器芯片进入空闲状态的大体顺序应该是这样的,应用处理器(Application Processor)判断是否具备进入空闲状态的条件,如果满足条件则进行一些准备工作;发消息给系统控制器(System control processor);等待全部操作执行完;执行WFI进入空闲状态;等待系统控制器做出下一步动作,或者关闭时钟,或者关闭电源等等。从WFI这个名字可以看出,唤醒(wake up)处理器的一个机制就是发送中断给处理器。与A系列处理器搭配的中断处理器是GIC,这在前面介绍过。GIC接到中断后,产生唤醒信号给系统控制器或者是电源管理模块(Power
Management Unit),系统控制器或者PMU根据处理器核的状态以及系统状态,决定下一步的动作。如果唤醒信号是给系统控制器,则可以考虑接到系统控制器的中断处理接口,比如,采用M系列作为系统控制器时,可以接到NVIC(Nested Vectored Interrupt Controller)。唤醒机制要根据具体情况具体分析,法无定法。WFE与WFI很像,只不过等待的是事件,也就是说系统可以通过发送事件来唤醒应用处理器。WFE的一个典型应用场景是自旋锁。当多个应用处理器竞争同一个临界区资源时,只有一个应用处理器能获得权限,其它的应用处理器需要等待临界区资源被释放,也就是这些应用处理器“自旋”。当然操作系统也可以采取其它的处理方式,比如把时间片分给其它的应用程序,不过这不在今天的研究范畴。显然,应用处理器简单的“自旋”对于功耗不友好,一个解决办法就是让这些“自旋”的应用处理器进入一种低功耗模式,获得临界区资源的应用处理器在完成当前进程后,唤醒这些应用处理器去重新竞争临界区资源。这时的唤醒机制不宜采取中断方式,因为效率不高。ARM中采用的是事件方式,即通过执行SEV(Send Event)指令向其它应用处理器发送唤醒的事件。WFI和WFE还有一种变体形式,WFIT和WFET,其中的T是超时(timeout)的意思,也就是说,唤醒机制多了一种超时的方式,没有中断或者事件产生,时间到了也会发出唤醒。