Уважаемый
zltigo!
У меня нет желания спорить с Вами.
Я лишь привёл несколько примеров, причём далеко на всех.
Цитата(zltigo @ Nov 27 2006, 21:23)

Цитата(Alex03 @ Nov 27 2006, 14:26)

- Подсчёт статистики, такой как кол-во прерываний,
Сильно. Просто общее количество прерываний и за каждое обработанное прерывание брать денюжку :-), хотя опять некоторые сложно обрабатывать а некоторве попроще. Тогда надо считать их отдельно, тогда зачем общий обработчик?
Ну почему же общее, считать по конкретному прерыванию.
Общий обработчик конечно же должен знать, скажем так, индекс прерывания.
Например в нашей ОС возможно максимум N источников прерываний.
Тогда имея
nIntCounts[N] - массив счётчиков по всем перрываниям
pIntFn[N] - массив указателей на зарегистрированные обработчики
В общем обработчике можно например так:
Код
nIntCounts[nIntIdx]++;
if(pIntFn[nIntIdx])
pIntFn[nIntIdx]();
Откуда взять индекс? Зависит от архитектуры, но на примере того же LPC - а кто Вам сказал что в VicVectAddr/VicVectAddrX должен лежать именно адрес? Туда можно этот индекс и положить.

Наберите в Linux-е командочку
Код
# cat /proc/interrupts
Притом если процев/ядер в системе несколько, то прерывания ещё и по каждому процу отдельно считаются.
Цитата
Цитата
систем_тайм/юзер_тайм и т.д.
А это уже конкретные обработчики, ну право-же не считать-же системное время по сумме прерываний от таймера, мышки и клавиатуры.
Не по сумме прерываний, а по сумме времени затраченного на исполнение прерываний, процессов ядра и юзерских процессов.
В роли таймера тут могут быть как некий системный таймер, так и какойнить счётчик тактов который например присутствует во всех современных пнях (и прочих x86).
Цитата
Цитата
- Переключение задач по соответствующим условиям, как то с низкоприоритетной прерванной задачи, на более (сильно/реалтайм) приоритетную, которая была выведена из спячки текущим прерыванием.
Действия понятны, но с этим разбирается система а не какой-то универсальный пролог/эпилог ко всем прерываниям.
И где по Вашему этим система разбирается?
1. Исполняется юзер-процесс
2. Происходит прерывание
3. Исполняется Ваш обработчик, который выводит из спячки высокоприоритетный процесс.
4. Возврат из прерывания
5. ??? Опять юзер-процесс ??? Где переключение контекста на высокоприоритетный процесс?
Цитата
Цитата
- Разрешение вложенных прерываний, опять же в соответствии с заданной в ОС логикой.
Разрешение вложенных прерываний огульно любого в любом. Выделение, например стека, неведомого размера (или наоборот не выделение) под вложенное. Причем до того, когда когда управление
получит обработчик конкретного прерывания или таже OS. При этом не запущенный обработчик
прерывания той-же OS как-то "задает логику"? Вот когда он получит управление он и будет "задавать логику" и именно он а не прокладка перед ним.
Ну почему же любого в любом?
Рядом с упомянутыми массивами nIntCounts[N], pIntFn[N] положите ещё массив с флагами для каждого прерывания, такими как возможность разрешения вложенности, флаг реентерабельности (повторного вхождения) и т.д.
Вариантов всегда множество.
В том же линуксе есть такое понятие bottom half.
При этом логику работы прерывания разбивают на две части
1. то что обязательно должно исполниться в обработчике прерывания.
2. то что обязанно исполниться после обработчика прерывания (например обработка данных), но до любого юзеского кода. Т.е. после прерывания исполняется системный процесс, который может быть в том числе прерван прерываниями.
Цитата
Цитата
в PC архитектуре когда на одном физическом прерывании может несколько девайсов висеть
Это к архитектуре никакого отнощения не имеет, у меня вот прямо сейчас перед носом 16 на одном
прерывании висят. И разбирается кто вылез обработчик конкретного прерывания, который знает
как разобраться "кто сказал Гав" а не некая абстрактная прокладка для всех прерываний вместе взятых.
Давайте видеть всю фразу, а не её части. PC архитектуру я приводил как пример, и то что Вы умеете разрулить "кто сказал Гав" заложенно в Вашей железячно-програмной архитектуре. Возвращаясь же к PC архитектуре там в случае нескольких девайсов на одной линии прерывания однозначно определить источник не возможно, и приходится ОС (точнее её универсальному обработчику прерывания) вызывать по очереди все зерегистрированные для данной линии обработчики, а уже конкретный обработчик первым делом проверяет своё железо на факт наличия прерывания, и именно по этому не советуют иметь несколько девайсов, особенно скоростных на одной линии прерывания.
Цитата
Цитата
и когда драйвера, а с ними и обработчики прерываний, являются динамически загружаемыми/выгружаемыми модулями.
Сильно. Т.е. девайса нет (не вставили), драйвера нет(не загрузили) а обработчик прерывания - вот он уже есть и готов работать с неведомым ему железом на неведомом прерывании.
Если Вы про универсальный обработчик - то да! Он может быть, но в нём нет кода по работе с неведомым железом, в нём есть код по вызову (или не вызову) зарегистрированного(ых) обработчика(ов). А регистрируют эти обработчики например драйвера при их загрузке и после инициализации железа.
И если вдруг произойдёт прерывание от некоего девайса для которого не зарегистрирован обработчик - то это факт наличия какихто неполадок в железе или ПО, который можно както обработать.
Цитата
Цитата
Ну и как доп. уровень абстракции когда писатель драйвера конкретной железки, не занимается программированием MMU или там контроллера прерываний (как то запись в VICVectAddr

), а использует допустимые (документированные) для данной ОС механизмы.
Живые примеры вышеописанного "ненавязчивого сервиса" имеют место быть, только зачем для этого обязательно иметь некую абстрактную прокладку перед или после собственно обработчика прерывания, который будет писать писатель драйвера?
Про обязательность везде и всего я не говорил.

Цитата
Цитата
Чем навороченнее ОС тем больше вариантов.
Навернуть можно много чего, вопрос зачем?
Конкретный пример наворота присутствовал в первом примере с которого топик начался. Наворот виден и кушает такты. Польза от наворота? Не писать в каждом обработчике в VICVectAddr? А если я, простите
захочу разрешить в одном (только упаси боже не во всех зараз) обработчике вложенные прерывания?
Нафига мне тогда такой сервис?
Во первых я сам в LPC пользую
Код
ldr pc,[pc,#-0xFF0]
При этом я не пользую ОС.
Во вторых мы перевели разговор в сторону прерываний в ОС.
Цитата
А вот с этого места, пожалуйста поподробнее. Очень люблю про OSы думать. Заинтриговали.
ОС-ы бывают большие и маленькие, простые и сложные.
Писать их может один человек, а может и тысяча.
Ну и как пример оправданности оверхеда с тем же VICVectAddr:
Допустим Вы участвуете в разработке некой ОС или драйверов к ней.
Допустим Вам надо написать драйвер UART совместимого с x550.
Помимо всего прочего в драйвере нужен обработчик прерывания от UART-а.
Теперь вопрос: Вы хотите при этом досканально изучить все платформы на которых работает эта ОС (ну или по крайней мере есть UART совместимый с x550) и все возможные контроллеры прерываний на этих платформах чтобы использовать эти прерывания?