ARM WFI赢得';睡不着

ARM WFI赢得';睡不着,arm,interrupt,cortex-m,Arm,Interrupt,Cortex M,我正试图在Cortex-M4上进入待机模式。正常情况下,设备大约每2分钟唤醒一次,但在我最新的FW版本中,代码似乎“随机”卡住了 经过调查,代码似乎通过了WFI指令而没有进入待机状态(无待机=>无复位=>无限循环=>…=>42) 因此,在阅读了许多不清楚的规范之后,我的理解是,如果存在挂起的中断,WFI可能不会进入睡眠状态 你能确认最后一句话吗 如何确保在调用WFI之前清除所有挂起的中断 有三种情况会导致处理器从WFI指令中唤醒: 发生非屏蔽中断,且其优先级大于当前执行优先级(即中断被采用) 由

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

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

因此,在阅读了许多不清楚的规范之后,我的理解是,如果存在挂起的中断,
WFI
可能不会进入睡眠状态

  • 你能确认最后一句话吗
  • 如何确保在调用
    WFI
    之前清除所有挂起的中断

  • 有三种情况会导致处理器从WFI指令中唤醒:

  • 发生非屏蔽中断,且其优先级大于当前执行优先级(即中断被采用)
  • 由PRIMASK屏蔽的中断变为挂起
  • 调试条目请求
  • 当WFI指令执行时,如果任何唤醒条件为真,那么它实际上是一个NOP(即,您不进入睡眠状态)

    至于确保没有挂起的中断,这是您必须执行的代码。通常这意味着确保中断源得到满足,这样它就不会断言其中断请求,然后清除必要的挂起位。通过读取中断挂起寄存器,您可以看到什么是挂起的,但是中断处理程序的任务通常是确保它们保持静止状态

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


    ARM还建议在WFI之前立即执行DSB指令,以确保在处理器进入睡眠之前完成任何数据操作。并非在所有情况下都必须这样做,但应将其放在万一情况发生变化而您忽略它的情况下使用。

    有三种情况会导致处理器从WFI指令中唤醒:

  • 发生非屏蔽中断,且其优先级大于当前执行优先级(即中断被采用)
  • 由PRIMASK屏蔽的中断变为挂起
  • 调试条目请求
  • 当WFI指令执行时,如果任何唤醒条件为真,那么它实际上是一个NOP(即,您不进入睡眠状态)

    至于确保没有挂起的中断,这是您必须执行的代码。通常这意味着确保中断源得到满足,这样它就不会断言其中断请求,然后清除必要的挂起位。通过读取中断挂起寄存器,您可以看到什么是挂起的,但是中断处理程序的任务通常是确保它们保持静止状态

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


    ARM还建议在WFI之前立即执行DSB指令,以确保在处理器进入睡眠之前完成任何数据操作。可能并非在所有情况下都必须这样做,但请把它放在万一情况发生变化而您忽略了它的情况下。

    非常感谢您提供了非常完整的答案。然而,我不是以英语为母语的人。那么,屏蔽(PRIMASK)和挂起中断之间的区别是什么呢?我的意思是,将WFI放入一个关键部分只会阻止处理程序被执行,但中断仍然挂起。那么,关键部分将如何防止案例2将WFI转换为NOP呢?如果在执行WFI时所提到的任何条件为真,那么处理器不会进入睡眠状态。这是您想要的,否则您可能会错过重要事件。将PRIMASK设置为1的目的是确保在WFI之前执行的任何测试或代码都不会中断。中断通常决定是否有额外的工作要做。该测试需要在没有中断可能性的情况下进行。但是,如果测试完成后中断确实变为挂起状态,则WFI为NOP,并且当PRIMASK设置为0时,将采用中断。非常感谢您提供的非常完整的答案。然而,我不是以英语为母语的人。那么,屏蔽(PRIMASK)和挂起中断之间的区别是什么呢?我的意思是,将WFI放入一个关键部分只会阻止处理程序被执行,但中断仍然挂起。那么,关键部分将如何防止案例2将WFI转换为NOP呢?如果在执行WFI时所提到的任何条件为真,那么处理器不会进入睡眠状态。这是您想要的,否则您可能会错过重要事件。将PRIMASK设置为1的目的是确保在WFI之前执行的任何测试或代码都不在