давайте еще раз, я чего то не понимаю
моя последовательность действий
1. запрет прерывания
2. обработка
3. разрешение прерывания.
в случае прерывания до 1 или после 3 все работает
в случае прерывания 1-2, 2-3 обработка прерывания откладывается до после 3, и там обрабатывается
ваша последовательность действий
1. ставим флаг
2. обработка
3. снятие флага.
4. разрешение прерывания
в случае до 1 и после 4 все работает
в случае прерывания 1-2, 2-3, 3-4, прерывание вызывается, запрещает себя, выходит из прерывания, продолжает обработка, а прерывание откладывается до после 4, где повторно вызывается и обрабатывается.
результат один, прерывание работает либо до либо после критического куска, прерывание не работает внутри куска, все вызовы внутри откладываются до окончания куска.
но при этом в вашем варианте вы делаете лишний вызов прерывания со всеми сохранениями регистров, у вас добавлен лишний флаг, в прерывании сделана лишняя проверка. Почему это лучше? Что разница есть это очевидно, но почему эта разница полезная?! что я упускаю?
Цитата
Разница есть. Речь о том, кто запрещает прерывание: конкурент (это плохо) или сам обработчик (он в курсе, и это лучше).
это сильно зависит от обработчика, если он выполняет одно короткое действие, то он вообще не должен быть в курсе чего либо. А если есть два конкурирующие за ресурс устройства, то должен быть арбитр, который как раз решает приоритеты доступа. И я не уверен что назначать арбитром само прерывание (считай нагружать его еще дополнительным функционалом) правильно.