Реентерабельность прерываний

Этот пост написан в продолжение темы о размере стека и прерываниях, который обсуждается на

http://electronix.ru/forum/index.php?showtopic=108099&st=0

Реентерабельность (от re-enter — повторный вход) — это, конечно, хорошо! Но всему должна быть мера.

Реентерабельность обычных функций (не обработчиков прерываний) — это нормальное явление. Хотя оно и требует к себе повышенного внимания. То есть вполне допустимо, если вы понимаете, что вы делаете, и что на самом деле у вас в системе происходит.

Реентерабельность прерываний — это уже из области работы со взрывчаткой. Тут, в отличие от простых функций, внимание этому вопросу нужно уделять максимальное. Если вы профи, то, если что, вы наверняка разберетесь со странным поведением системы. Но если вы только-только, то геморр на несколько дней вам обеспечен без гарантии того, что вам вообще удастся обуздать ситуацию.

Вообще реентерабельность прерываний подразумевает то, что прерывания разбиты на несколько уровней — по приоритетам. Более приоритетные прерывания имеют право прерывать работу обработчиков прерываний с более низким приоритетом. (Блин, ну и тавтология. Сам поражаюсь!) Реентерабельность прерываний — это вынужденная мера. Это нужно делать только тогда, когда другими способами не удается «разрулить» работу системы (девайса). По возможности нужно избегать реентерабельности прерываний.

Если реентерабельность прерываний одного уровня — очень и очень сомнительна (это явно не от великого ума), то реентерабелность одного прерывания — это мега-зло!

Применение уровней прерываний и создание реентерабельности может быть оправдано только в двух случаях. Первый — программа на столько небольшая, что логика работы ее прозрачна и осязаема. Ну, например, моргание светодиодами. Второй случай — это когда система достаточно большая и сложная, но должна отвечать жестким требованиям по скорости отклика на события. Это в основном системы реального времени с заранее оговоренной скоростью реакции.

Во всех остальных случаях, следует придерживаться следующей логики. Из нескольких, одновременно возникших в системе событий мы должны создать очередь, и последовательно их обработать. Например, одновременно пришедшие события от клавиатуры, мышки и RS485, могут быть обработаны в ЛЮБОМ порядке относительно друг друга. Собственно, порядок их обработки может быть легко измениться, если какое-то событие возникнет на мгновение раньше другого. Невозможно учесть абсолютно все жизненные ситуации, поэтому проще считать, что

будем бороться с проблемами в порядке их возникновения
(с) не помню чье высказывание

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

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s