Доброго времени суток.
У меня есть драйвер устройства.
Реализована функция чтения данных и устройства и обработка прерывания.
Подскажите когда драйвер получает прерывание он может сразу отправить некий буфер вместе с сообщением siginfo ?
Здравствуйте, reider, Вы писали:
R>Подскажите когда драйвер получает прерывание он может сразу отправить некий буфер вместе с сообщением siginfo ?
Я б начал с уточнения, о какой операционной системе идет речь. Следующий вопрос, что драйвер должен делать? (содержательно, а не "присылать буфера с сигналами). Потом посмотрим.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, reider, Вы писали:
R>>Подскажите когда драйвер получает прерывание он может сразу отправить некий буфер вместе с сообщением siginfo ?
Pzz>Я б начал с уточнения, о какой операционной системе идет речь. Следующий вопрос, что драйвер должен делать? (содержательно, а не "присылать буфера с сигналами). Потом посмотрим.
Данный драйвер реализует несколько буферов DMA, в которые внешнее устройство пишет по PCI. Как только буфер наполнен, оно шлёт сообщение (прерывание). Драйвер ловит это прерывание и сообщает об этом программе работающей в user mode. Программа должна считывать данные с dma буферов драйвера и записывает в RAM. ОС Debian Linux 11
Здравствуйте, reider, Вы писали:
R>Данный драйвер реализует несколько буферов DMA, в которые внешнее устройство пишет по PCI. Как только буфер наполнен, оно шлёт сообщение (прерывание). Драйвер ловит это прерывание и сообщает об этом программе работающей в user mode. Программа должна считывать данные с dma буферов драйвера и записывает в RAM. ОС Debian Linux 11
Ну логично было бы, чтобы драйвер формировал очередь уже заполненных буферов, а user space отрывал бы устройство, и read-ом содержимое этих буферов из устройства вычитывал.
При этом если данные с устройства, логически, представляют собой просто поток байтов (т.е., если пришло 100 байтов, то не важно, как они пришли, одним куском, или 50+50), то отдавать очередному read-у все, что уже накопилось и влезает в предоставленный буфер. А если это поток не байтов, а "сообщений", т.е., сохранение границ между последовательными блоками важно, то отдавать за раз одно целое сообщение, и возвращать ошибку, если оно не лезет в предоставленный буфер
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, reider, Вы писали:
R>>Данный драйвер реализует несколько буферов DMA, в которые внешнее устройство пишет по PCI. Как только буфер наполнен, оно шлёт сообщение (прерывание). Драйвер ловит это прерывание и сообщает об этом программе работающей в user mode. Программа должна считывать данные с dma буферов драйвера и записывает в RAM. ОС Debian Linux 11
Pzz>Ну логично было бы, чтобы драйвер формировал очередь уже заполненных буферов, а user space отрывал бы устройство, и read-ом содержимое этих буферов из устройства вычитывал.
Pzz>При этом если данные с устройства, логически, представляют собой просто поток байтов (т.е., если пришло 100 байтов, то не важно, как они пришли, одним куском, или 50+50), то отдавать очередному read-у все, что уже накопилось и влезает в предоставленный буфер. А если это поток не байтов, а "сообщений", т.е., сохранение границ между последовательными блоками важно, то отдавать за раз одно целое сообщение, и возвращать ошибку, если оно не лезет в предоставленный буфер
Pzz>Никакие сигналы при этом использовать не надо
Спасибо за совет! Так как Вы описали действительно и проще и быстрее