在许多应用程序中,我使用简单的模板,其中中断例程(例如 UART 接收)引发标志(易失性变量)和 main() 函数轮询这些标志并处理这些事件(例如解析传入的 UART 字符)。我想在无事可做时让 MCU 进入睡眠状态——当所有标志都被清除时。但我不能简单地写:
- if(!flag1 && !flag2 ...){
- go_to_sleep();
- }
因为潜在的竞争条件。可以在 if 语句评估期间设置标志,并且存在风险,即 MCU 会在升起一些标志的情况下进入睡眠状态。是否有任何机制如何让 STM8S(可能还有 STM8L)安全地睡眠——只有在标志被清除的情况下?
只是为了兴趣:
STM32 通过调用“发送事件”指令(在出现标志的地方)来处理该问题,从而防止入睡。
AVR 有单独的位用于“睡眠启用”,该位可以在 IRQ 例程中清除,在该例程中会升高标志并防止 MCU 进入睡眠模式。
如何使用 STM8 做到这一点?