首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >手臂WFI不睡觉

手臂WFI不睡觉
EN

Stack Overflow用户
提问于 2017-10-25 14:07:55
回答 1查看 2.2K关注 0票数 0

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

经过研究,代码似乎在没有待机的情况下传递WFI指令(没有备用=>,没有重置=>无限循环=> . => 42)。

因此,在阅读了许多不明确的规范之后,我的理解是,如果出现挂起的中断,WFI可能无法入睡。

  1. 你能确认最后一句吗?
  2. 如何确保在调用WFI之前清除所有挂起的中断?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-25 20:52:52

有三种条件导致处理器从WFI指令中醒来:

  1. 发生非屏蔽中断,其优先级大于当前执行优先级(即中断被接受)。
  2. 由PRIMASK屏蔽的中断将被挂起
  3. 调试入口请求。

如果在执行WFI指令时,任何唤醒条件都是真的,那么它实际上是一个NOP (也就是说,您不去睡觉)。

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

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

此外,ARM建议在WFI之前执行一条DSB指令,以确保在处理器休眠之前完成任何数据操作。在所有情况下,这可能并不是绝对必要的,但如果情况发生变化,你就会忽略它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46934649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档