Продолжаем.
Коллеги, у меня вопрос.
Техподдержка Nordic запрещает отключать прерывания, используемые softdevice'ом (это стек блютус, исполняемый на том же процессоре, что и пользовательский код; поставляется как единый hex с документированными точками входа).
Для организации критических секций у них предусмотрен следующий костыль:
https://github.com/NordicPlayground/nrf52-b...nrf_nvic.h#L437sd_nvic_critical_region_enter(), sd_nvic_critical_region_exit()
Т.е:
- запретить все прерывания
- сохранить во временную переменную регистры разрешённых прерываний
- обнулить эти регистры (точнее, записать маску "только прерывания softdevice'а)
- разрешить прерывания
При этом:
- допустимые ядром приоритеты прерываний - 0..7
- софтдевайс использует приоритеты 0 и 4 (во всяком случае, так в последнем SDK 15.0, в документации это не описано)
Ваше мнение, как лучше:
- обернуть эти функции в OS::TCritSect
- оставить обычную критическую секцию - они всё равно делают disable_irq()/enable_irq(), несмотря на заявление техподдержки "прерывания отключать нельзя, ни на 1 секунду, ни на 1 микросекунду"
- сделать прерывания ОС и пользовательского кода с приоритетом 5..7 и разобраться с запретом через изменение регистра BASEPRI