Задать вопрос
Kalombyr
@Kalombyr

Как обезопасить функцию от прерывания?

Добрый день.
В программе используются прерывания, прерывание может прервать другое прерывание =)
Основная проблема - malloc() , случается иногда что попадает именно в момент выделения памяти, но и в другом прерывании так же есть выделение памяти. И когда случаются совпадения, то бывает коллапс.
Так вот, что бы не проставлять кучу __disable_irq(); __enable_irq();
как можно некоторые функции целиком защитить от прерывания (но что бы оно было вызвано после выполнения самой функции)? Под целиком я подразумеваю не писать внутри функции команды, а как-то снаружи что ли...
С учётом того, что оборачивать сам вызов функции не вариант (костыль).
Использование __disable_irq(); и __enable_irq(); то же может быть проблемным, т.к. если в вызывающей эту функцию прерывания уже отключены мы можем случайно их включить, чего очень не хочется.

P.S. выделение памяти в прерываниях зло и т.д. ага.
P.P.S. можно настроить, что бы прерывания одно другое не прерывали, но это не подходит, т.к. нужно только некоторые функции, которые вызываются в прерывании.
  • Вопрос задан
  • 1083 просмотра
Подписаться 2 Простой Комментировать
Решение пользователя 15432 К ответам на вопрос (3)
15432
@15432
Системный программист ^_^
Для таких целей вводятся дополнительные обертки над disable_irq и enable_irq, которые вычисляют "глубину" запрета прерываний. По факту просто есть глобальный счетчик, который увеличивается при каждом вызове ext_disable_irq и уменьшается при ext_enable_irq. Настоящее включение прерываний происходит в самом конце ext_enable_irq и только если счетчик в этот момент равен нулю
Ответ написан