типо в камнях, где нет SWI, делаем их руками, а где есть - забываем и опять делаем руками:) Открыл описание embOS - там в обработчиках прерываний, в которых используются сервисы ОС, явно прописываются "защитные заглушки" при входе и при выходе (OS_EnterInterrupt() и OS_LeaveInterrupt()). Наверно это "критическая секция" только наоборот:)
Чуток размышлизма.
Специально открыл Таненбаума. ничего в моём понимании критических секций не изменилось. но понял откуда ноги спора растут.
Во-первых от
"для ядра характерна блокировка прерываний для некоторых команд при работе с переменными или списками. Возникновение прерывания в момент, когда, например, список готовых процессов находится в неопределенном состоянии, могло бы привести к состоянию состязания".
это тот случай, когда ОС нужно защищать саму себя - просто частный случай.
Во-вторых -от
"неразумно давать пользовательскому процессу полномочия запрета прерываний"
и далее
"запрет прерываний бывает полезным в самой операционной системе, но это решение неприемлемо в качестве механизма взаимного исключения для пользовательских процессов".
Вот тут и зарыто отличие "взрослых" ОС от остальных - во "взрослых" пользователи не пишут драйвера - там отдельно системное программирование и пользовательское application. Когда смешиваются в кучу и кони и прочая, тогда и начинается меряние "важностью критичности". Считаю, что то drivers (из системного только и остаётся, если ядро уже написано) и applications не стоит объединять в одной посуде. Но это вопрос не к инструментарию.
Когда мне нужен доступ к быстрому АЦП, таймеру и прочему изменчивому, то я пишу функцию, которая фактически есть драйвер, и если мне надо глушить все прерывания, то так и делаю. В результате отдельно пишем BSP, а на уровне application у нас нет ни обработчиков прерываний, ни критических секций:) BSP для относительно больших проектов вааще оформляем в виде либы. То же жестковременное ногодрыжество оформляется в виде программируемого генератора и "запечатывается" - пользовательская задача может управлять генератором, но не ногами напрямую.