Как обезопасить функцию от прерывания?
Для таких целей вводятся дополнительные обертки над disable_irq и enable_irq, которые вычисляют "глубину" запрета прерываний. По факту просто есть глобальный счетчик, который увеличивается при каждом вызове ext_disable_irq и уменьшается при ext_enable_irq. Настоящее включение прерываний происходит в самом конце ext_enable_irq и только если счетчик в этот момент равен нулю
Покури доку на компилятор который используешь. Во многие компиляторы встроены специальные механизмы, которые можно использовать для запретов и разрешений прерываний. Например есть макросы, которые запрещают прерывания при входе в какой-то блок, а потом либо их разрешают не смотря ни на что либо восстанавливают то значение которое было до входа в этот блок, т.к. если прерывания были запрещены, то они и остаются запрещены.