Я даже близко к этому не приблизился.
Давай как в той песни . Всё хорошо прекрасная Маркиза и хороши у нас дела.
Цитата:
Проблема в том, что устройств много, а все события должны обрабатываться последовательно, иначе невозможно
Ну по чему же не возможно? События можно обрабатывать последовательно, параллельно и асинхронно.
Цитата:
Обработчик прерывания помещает в эту очередь событие.
А как же безопасность? Мы же должны заблокировать очередь на запись. А как вы планируете это сделать если мы в обработчике прерывания(другие прерывания заблокированы)?
Цитата:
У каждого драйвера есть своя очередь событий, учитывающая специфику устройства (у клавиатуры скан-код 1 байт, у мыши пакет 3-4 байта, у сетевой карты размер пакета побольше).
А что мешает данные напрямую отдавать приложению? Тем более если писать их в очередь то это снижает эффективность DMA.
Приложение вызвало ReadData - функция эта блокирующая. Т.е она будет жать и не отдавать управление приложению до тех пор пока данные не окажутся в буфере. Следовательно драйвер уже знает адрес буфера и может туда начинать писать.
Прерывание придёт когда данные будут записаны. Для устройств без DMA, эмитируем это поведение прямо в обработчике прерывания. Тем более у них данные по 1-16 байт. А вот после обработчик прерывания может писать в очередь сообщений 1 бит с указанием флага.
Цитата:
Может есть третий вариант?
Конечно, если у вас ОС жёсткого реального времени (ОСЖРВ). То можно без очередей. А если просто РВ, то такие очереди можно перенести из ядра в прикладные приложения.