ARM WFI赢得';睡不着
我正试图在Cortex-M4上进入待机模式。正常情况下,设备大约每2分钟唤醒一次,但在我最新的FW版本中,代码似乎“随机”卡住了 经过调查,代码似乎通过了ARM WFI赢得';睡不着,arm,interrupt,cortex-m,Arm,Interrupt,Cortex M,我正试图在Cortex-M4上进入待机模式。正常情况下,设备大约每2分钟唤醒一次,但在我最新的FW版本中,代码似乎“随机”卡住了 经过调查,代码似乎通过了WFI指令而没有进入待机状态(无待机=>无复位=>无限循环=>…=>42) 因此,在阅读了许多不清楚的规范之后,我的理解是,如果存在挂起的中断,WFI可能不会进入睡眠状态 你能确认最后一句话吗 如何确保在调用WFI之前清除所有挂起的中断 有三种情况会导致处理器从WFI指令中唤醒: 发生非屏蔽中断,且其优先级大于当前执行优先级(即中断被采用) 由
WFI
指令而没有进入待机状态(无待机=>无复位=>无限循环=>…=>42)
因此,在阅读了许多不清楚的规范之后,我的理解是,如果存在挂起的中断,WFI
可能不会进入睡眠状态
WFI
之前清除所有挂起的中断有三种情况会导致处理器从WFI指令中唤醒:
ARM还建议在WFI之前立即执行DSB指令,以确保在处理器进入睡眠之前完成任何数据操作。并非在所有情况下都必须这样做,但应将其放在万一情况发生变化而您忽略它的情况下使用。有三种情况会导致处理器从WFI指令中唤醒:
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之前执行的任何测试或代码都不在