RSIC-V_WFI和WFE

在 RISC-V 架构中,`WFE`(Wait For Event)和 `WFI`(Wait For Interrupt)是两种不同的低功耗休眠指令,主要用于暂停处理器执行以降低功耗,直到特定事件或中断触发唤醒。以下是它们的核心区别:

核心差异

  1. 标准化程度

    • WFI(Wait For Interrupt)
      - 功能: 
      处理器执行 `WFI` 后会进入休眠状态,**直到被任意使能的中断或异常唤醒**(包括定时器中断、外部中断等)。 
      - 设计目标: 
      主要用于降低功耗,适用于空闲等待中断的场景(如操作系统空闲循环)。 
      - 行为细节: 
      - 唤醒条件:任何未被屏蔽的中断(全局中断使能且中断源未被禁用)。 
      - 实现可能允许处理器在中断未实际触发时继续执行(取决于微架构实现)。 
      - 典型用途: 
      操作系统调度器在无任务运行时调用 `WFI` 进入低功耗模式。

 

    • WFE(Wait For Event)
      - 功能: 
      处理器执行 `WFE` 后会暂停,直到特定事件(Event)发生。事件可能包括: 
      - 显式的 `SEV`(Send Event)指令(由其他核或线程触发)。 
      - 中断(可选配置,取决于实现)。 
      - 设计目标: 
      支持多核/多线程场景下的高效同步,避免忙等待(busy-wait)。 
      - 行为细节: 
      - 唤醒条件更灵活,可能不依赖中断(例如通过核间通信触发)。 
      - 某些实现可能允许事件累积(即事件发生后未立即唤醒时,后续 `WFE` 直接通过)。 
      - 典型用途: 
      多核同步场景,如自旋锁优化(锁被释放时通过 `SEV` 唤醒等待的核)。
  1. 功能设计

    • WFI :执行后处理器暂停,仅通过中断唤醒 (如定时器、外设中断)。
    • WFE :支持事件唤醒 (如多核通信中的SEV指令),更适合多核协作场景(如自旋锁优化)。
  2. 实现方式

    • 支持WFE的处理器(如青稞)需通过配置寄存器(如PFIC系统控制寄存器)将WFI切换为WFE行为。
  3. 应用场景

    • WFI适用于单核低功耗待机。
    • WFE常用于多核间同步,减少忙等待的功耗。
特性 WFI WFE
唤醒条件 中断/异常 | 事件(SEV指令或中断,可配置)
多核优化 不直接支持核间同步 专为多核同步设计(依赖 `SEV`)
功耗管理 纯粹低功耗休眠 兼顾低功耗与同步效率
灵活性 依赖中断机制 可配置是否忽略中断

   5.注意事项

  - WFI 是 RISC-V 标准指令(Base ISA 和特权架构定义)。 
  - WFE并非标准指令,但在某些扩展(如自定义多核扩展)或厂商实现中可能存在(例如某些高性能核或嵌入式设计)。 
  - 实现差异: 
  具体行为(如事件的定义、中断与事件的优先级)可能因微架构不同而有所变化,需参考具体手册(如 SiFive、ARM 兼容扩展等)。

 

举例:

    /*WFE应用场景*/
    SYS_DisableAllIrq(&irq_status);//关闭全局中断
    LowPower_Sleep(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND);//芯片进入低功耗睡眠模式,停在__WFE()处,即使全局中断处于关闭状态,产生中断也可唤醒芯片,但此时是中断事件唤醒,中断标志会一直存在内核中,等待全局中断恢复即可进入中断服务函数
    SYS_RecoverIrq(irq_status);//恢复全局中断后,立即进入中断服务函数

 

    /*WFI应用场景*/
    SYS_DisableAllIrq(&irq_status);
    .......
    SYS_RecoverIrq(irq_status);
    LowPower_Sleep(RB_PWR_RAM32K | RB_PWR_RAM96K | RB_PWR_EXTEND);//低功耗睡眠中,如果使用__WFI(),必须在睡眠前恢复全局中断才可唤醒,否则芯片无法醒来

 

posted @ 2025-07-20 18:27  oTvTo  阅读(293)  评论(0)    收藏  举报