Я ожидал, что код приостановится, а затем возобновится вскоре после установки события, но вместо этого :
- Если событие уже было установлено, оно продолжается, как ожидалось.
- Если событие не было установлено заранее, и там если другие задачи не выполняются, программа завершается без предупреждения.
- Если я создайте задачу Keep_alive, которая просто зацикливается, основной цикл возобновится с ожидания события непосредственно перед выходом задач Keep_alive из спящего режима.
Такое ощущение, что ожидание события не поддерживает цикл само по себе, а установка события не возобновит выполнение, если что-то еще не разбудит цикл.
(оба из которых для меня были неожиданными)
Не следует ли мне для начала использовать события?
Наконец, я также попытался вызвать пробуждение, создав тривиальную задачу из контекста IRQ с использованием расписания. , но задача даже не запустится, пока цикл сам не пробудится из уже существовавшего сна.
В следующем коде между «установкой» и «завершением» проходит 4 секунды. Я считаю, что это связано с тем, что код основного цикла возобновляется не тогда, когда установлено событие, а когда планировщик uasyncio просыпается для задачи Keep_alive. Кроме того, пробуждение никогда не выводится на печать, поскольку до этого возобновляется основной цикл и завершается.
import uasyncio
from machine import Timer
async def keep_awake():
while True:
print("awake")
await uasyncio.sleep(5)
def set(_=None):
global event
event.set()
print("set")
async def main():
print("start")
# The time will call set() after a second
Timer(-1).init(mode=Timer.ONE_SHOT, period=1000, callback=set)
print("waiting...")
global event
await event.wait()
print("end")
event = uasyncio.Event()
uasyncio.create_task(keep_awake())
uasyncio.run(main())
Подробнее здесь: https://stackoverflow.com/questions/792 ... ry-pi-pico