← index #6701Issue #3961
Off-topic · high · value 0.166
QUERY · ISSUE

RTC wakeup callback should be executed immediately rather than deferred

openby acutetechopened 2020-12-17updated 2024-09-13
port-stm32

AFAIK the callback invoked by RTC.wakeup is scheduled for later execution rather than being executed immediately, as the pin interrupts are.

See: https://github.com/micropython/micropython/blob/master/ports/stm32/extint.c#L657

IMHO this is undesirable behaviour. If the RTC is used to (a) wake the processor after machine.sleep() and (b) set a flag to be inspected by the main thread, then it has the effect that the flag may not be ready for inspection.

The code below illustrated the problem. I find that for correct operation it is necessary to add a delay after execution resumes and before inspecting variables changed by the callback. Commenting out the delay at line 17 results in undesirable behaviour.

I ran this on an OpenMV camera and the OpenMV github issue here provides more details of how I found this bug/feature, and some further analysis https://github.com/openmv/openmv/issues/1032

`
import machine, pyb, time

global triggered
triggered = False

def callback(arg):
global triggered
triggered = True

pyb.RTC().wakeup(1000, callback)

while (True):

machine.sleep()
# At this point the RTC will have woken us but the callback may not have been executed.
# This delay is essential to allow the callback to execute and update 'triggered'
time.sleep_ms(1)    # Required minimum delay is not known. Do not use sleep_us()

if (triggered):
    # Toggle green LED to indicate correct behaviour.
    # 'triggered' is seen as having changed
    pyb.LED(2).toggle()
else:
    # Toggle red LED to indicate incorrect behaviour.
    # 'triggered' is NOT seen as having changed
    pyb.LED(1).toggle()

triggered = False

`

CANDIDATE · ISSUE

ESP8266 crashes on wake from deepsleep

closedby peterhinchopened 2018-07-19updated 2024-08-28
port-esp8266

This was reported on the forum.

If the following code is pasted at the REPL the board wakes after 10s but crashes: there is no response to the REPL or to pings, and the red LED on the reference board is lit.

import machine
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
rtc.alarm(machine.RTC.ALARM0, 10000)
machine.deepsleep()
machine.reset()  # Crashes with or without this

A second issue is that the handler kwarg to rtc.irq is rejected:

rtc.irq(trigger=rtc.ALARM0, handler=lambda *_ : None, wake=machine.DEEPSLEEP)

produces TypeError: extra keyword arguments given.

Hardware: Adafruit Feather Huzzah, build:

MicroPython v1.9.4-227-gab02abe-dirty on 2018-07-19; ESP module with ESP8266

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied