飞腾CPU体系结构之低功耗指令

飞腾CPU体系结构之低功耗指令

WFE和WFI指令

当飞腾CPU核执行两类指令:WFE或WFI之后,CPU核会进入低功耗状态; 一旦CPU核进入低功耗状态,就要一直保持低功耗状态直到相应的唤醒事件发生。ARM体系结构并没有定义CPU核进入低功耗的具体属性要求;但是确保在进入、保持和退出低功耗的整个过程中,内存和高速缓冲依然满足数据一致性。

在AArch64状态下,低功耗常规唤醒事件列表如下:

唤醒事件 WFE WFI
当前核接收到物理中断 v v
当前核接收到虚拟中断 v v
当前核接收到定时器事件流的事件 v -
SVE指令 v -
全局性能计时器被清零 v -
  1. 当前飞腾CPU还不支持WFET和WFIT这两个指令。
  2. 当飞腾CPU核执行WFE,CPU核首先检查内部的唤醒事件列表(软件不可直接访问),如果唤醒事件列表为空,CPU核就会进入低功耗状态。

SEV和SEVL指令

当飞腾CPU核执行SEV指令,就会向CPU内部所有核发送唤醒事件。
当飞腾CPU核执行SEVL指令,只会向该CPU核发送唤醒事件。

WFE和SEV/SEVL常规用法

抢占操作

	sevl
1:	wfe
	/*抢占操作*/
	...
	/*如果抢占不成功,就跳转回到 1*/
	cbxx...

释放操作

	/*释放操作*/
	...
	dsb
	sev

问题1:为什么要sevl?
答:cpu核给自己发送唤醒事件,这是为了保证第一次wfe由于唤醒事件列表不为空,所以不会进入低功耗,但依然会清空唤醒事件列表。
问题2:为什么sev之前要用dsb指令?
答:因为CPU不能保证sev在释放操作之后运行,为了确保sev在释放操作完成之后执行,必须加入dsb指令。

WFI常规用法

CPU核退出

1: wfe
	wfi
	b 1b

CPU核进入idle状态

static void __cpu_do_idle(void)
{
    
    
	dsb(sy);
	wfi();
}

参考定义

#define sev()           asm volatile("sev" : : : "memory")
#define wfe()           asm volatile("wfe" : : : "memory")
#define wfi()           asm volatile("wfi" : : : "memory")

猜你喜欢

转载自blog.csdn.net/lsshao/article/details/116482033