Kalombyr
@Kalombyr

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

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

P.S. выделение памяти в прерываниях зло и т.д. ага.
P.P.S. можно настроить, что бы прерывания одно другое не прерывали, но это не подходит, т.к. нужно только некоторые функции, которые вызываются в прерывании.
  • Вопрос задан
  • 961 просмотр
Решения вопроса 2
15432
@15432
Системный программист ^_^
Для таких целей вводятся дополнительные обертки над disable_irq и enable_irq, которые вычисляют "глубину" запрета прерываний. По факту просто есть глобальный счетчик, который увеличивается при каждом вызове ext_disable_irq и уменьшается при ext_enable_irq. Настоящее включение прерываний происходит в самом конце ext_enable_irq и только если счетчик в этот момент равен нулю
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
P.S. выделение памяти в прерываниях зло и т.д. ага.

Дело говоришь. Вообще какая-либо существенная работа в обработчике прерывания -- зло. Избегай этого по возможности.

Так вот, что бы не проставлять кучу __disable_irq(); __enable_irq();

А никак иначе. Но обычно есть возможность делать не disable/enable а save+disable/restore, т.е. запрещать прерывания, одновременно возвращая текущее состояние запрета и восстанавливать это состояние.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Zamuhrishka
@Zamuhrishka
пытаюсь понять
Покури доку на компилятор который используешь. Во многие компиляторы встроены специальные механизмы, которые можно использовать для запретов и разрешений прерываний. Например есть макросы, которые запрещают прерывания при входе в какой-то блок, а потом либо их разрешают не смотря ни на что либо восстанавливают то значение которое было до входа в этот блок, т.к. если прерывания были запрещены, то они и остаются запрещены.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы