8000
BLE init failures can cause infinite loop in scheduler #17246
Labels
Port, board and/or hardware
stm32wb55
MicroPython version
master branch, slightly newer than v1.25
Reproduction
On a stm32wb55 based board with the rfcore (WS) firmware blob wiped / damaged.
Ends up stuck with
tl_ble_wait_resp: timeout
repeated on the command line every few seconds.Expected behaviour
The
tl_ble_wait_resp: timeout
message is expected due to lack of response from the rfcore, however there is a timeout in C so this should only retry a limited number of times (2 seconds worth) before aborting with a Timeout error:micropython/extmod/nimble/modbluetooth_nimble.c
Line 632 in 79abdad
Observed behaviour
Instead, the
tl_ble_wait_resp: timeout
message repeats forever. On my application this cannot be ctrl-c interrupted, it reboots after some time only because we have a WDT running.Additional Information
I've debugged the issue down to the scheduler, specifically the C STATIC_NODES section of it:
In this case the C scheduler is used to run
mp_bluetooth_hci_poll()
. Due to timeout trying to communicate with hci able_hs_reset()
gets run on the nimble os_eventq which starts by resetting the hci transport.That flows through to mp_bluetooth_hci_uart_init() which itself starts the hci polling...
This re-inserts the hci poll function into head of the c schedule linked list meaing it's ready to be run immediately, forming an infinite loop in
mp_sched_run_pending()
Code of Conduct
Yes, I agree
The text was updated successfully, but these errors were encountered: