我试图进入一个皮质-M4的待机模式。正常的行为是,设备大约每2分钟醒来一次,但在我最新的FW版本中,代码似乎是“随机的”卡住了。
经过研究,代码似乎在没有待机的情况下传递WFI
指令(没有备用=>,没有重置=>无限循环=> . => 42)。
因此,在阅读了许多不明确的规范之后,我的理解是,如果出现挂起的中断,WFI
可能无法入睡。
WFI
之前清除所有挂起的中断?发布于 2017-10-25 20:52:52
有三种条件导致处理器从WFI指令中醒来:
如果在执行WFI指令时,任何唤醒条件都是真的,那么它实际上是一个NOP (也就是说,您不去睡觉)。
至于确保没有中断挂起,这是您的代码必须这样做。通常,这意味着确保中断源满足,这样它就不会断言其中断请求,然后清除必要的挂起位。您可以通过读取中断挂起寄存器来查看挂起的内容,但中断处理程序通常负责确保它们保持静止状态。
请注意,大多数系统必须在执行WFI之前或之后执行一些工作。例如,在决定与WFI睡觉之前,通常需要做一个测试,以确定是否还有任何额外的工作要做。然后,该测试和WFI的执行将在一个关键部分完成,其中PRIMASK设置为1(因此我们正在执行上面的选项2)。这将确保在测试和WFI之间没有中断,并且在唤醒之后,如果有需要完成的额外操作(通常涉及时钟),则不会中断。醒来后,PRIMASK被设置为0(退出关键部分),并接受任何挂起的中断。
此外,ARM建议在WFI之前执行一条DSB指令,以确保在处理器休眠之前完成任何数据操作。在所有情况下,这可能并不是绝对必要的,但如果情况发生变化,你就会忽略它。
https://stackoverflow.com/questions/46934649
复制相似问题