ARM WFI不会睡觉

时间:2017-10-25 14:07:56

标签: arm interrupt cortex-m

我正在尝试在Cortex-M4上进入待机模式。正常的行为是设备大约每2分钟唤醒一次,但在我最新的FW版本中,似乎代码被“随机”卡住了。

经过调查,似乎代码通过了WFI指令而没有进入待机状态(没有待机=>没有重置=>无限循环=> ... => 42)。

因此,经过许多不明确的规范阅读之后,我的理解是,如果有待处理的中断,WFI可能无法进入休眠状态。

  1. 你能否确认最后一句
  2. 如何确保在调用WFI之前清除所有待处理的中断?

1 个答案:

答案 0 :(得分:3)

有三个条件导致处理器从WFI指令唤醒:

  1. 发生非屏蔽中断,其优先级大于当前执行优先级(即中断)
  2. 由PRIMASK屏蔽的中断正在等待
  3. 调试条目请求。
  4. 如果WFI指令执行时任何唤醒条件为真,那么它实际上是一个NOP(即你不进入睡眠状态)。

    至于确保没有待处理的中断,那就是你的代码必须这样做。通常,这意味着确保满足中断源,以便它不会断言其中断请求,然后清除必要的挂起位。您可以通过读取中断挂起的寄存器来查看待处理的内容,但通常会设置中断处理程序以确保它们保持静止状态。

    请注意,大多数系统必须在执行WFI之前或之后立即执行某些操作。例如,在决定使用WFI进入睡眠状态之前,通常必须进行一项测试以确定是否还有其他工作要做。然后在PRIMASK设置为1的关键部分完成该测试和WFI的执行(因此我们在上面执行选项#2)。这将确保在测试和WFI之间没有中断,并且在唤醒之后,如果有需要完成的附加操作(通常涉及时钟),则不会发生中断。唤醒后,PRIMASK被设置回0(退出临界区)并且正在进行任何挂起的中断。

    ARM建议在WFI之前立即执行DSB指令,以确保在处理器进入休眠状态之前完成任何数据操作。它可能并非在所有情况下都是绝对必要的,而是为了防止情况发生变化而忽视它。