Для любых функций, запрещающих выполнение из XIP или запрет прерываний во время соединения требуется отрабатывать такой task-событие:
- Вычислить сколько есть свободного времени до следующего события приема-передачи, путем опроса обработчика RF.
- Если вычисленный интервал не позволяет выполнить “долгую” функцию – выход.
- Если вычисленный интервал позволяет выполнить “долгую” функцию – выполнить и переключиться на новый event.
Конкретно для BLE соединения есть “connection interval”, “connection latency”, “connection timeout”.
“Connection interval” обычно меньше чем время стирания сектора Flash. Приемник включает малое окно приема на назначенном канале от устройства с этим шагом. Если приема нет или шум в эфире в течении этого короткого окна – приемник следует к следующему окну приема через “connection interval” и так до “connection timeout”.
“Connection latency” – это кол-во “connection interval”, которые устройство может (максимально) пропустить до следующей транзакции.
В итоге, для OTA необходимо установить “connection latency” * “connection interval” более чем время стирания/записи Flash в вашей функции.
Через (“connection latency”+1) * “connection interval” происходит обязательная транзакция согласования дальнейшего соединения.
Если тупой BT адаптер не умеет переключать/согласовывать connection интервалы (и такого китайского г.. много) – тут ничего не поделать – пользователю следует выбросить такой адаптер. Иначе он намучается с любыми BLE.