Eugene
Гость
|
|
« Ответ #3 : 05-12-2004 01:27 » |
|
Серж, спасибо за ответ. Но есть вот такой вопрос. В данный момент ситуация такая: драйвер написан человеком, которого уже нет, а мне нужно разобраться и внести различные исправления.
Сделано на данный момент так: 1\ используем плату PCI (bus master device); 2\ плата передаёт данные блоками по 64 kb; 3\ по завершении передачи бока плата генерит прерывание, сигнализирующее о том, что передача блока завершена. 4\ чтобы плата начала передавать данные в неё пишется сколько байтов мы хотим получить, и начальный физический адрес памяти, куда это всё ложить. Область памяти выделенная под данные, как я понимаю должна быть непрерывной. 5\ Поступает запрос (IOCTL) из приложения на чтение, например 4Mb. В драйвере выделяется Common Buffer размером 64kb. Его адрес и подсовывается плате. По приходу прерывания(т.е. получили 64kb) данные копируются из него в некий другой буффер большего размера. После этого адрес Common Buffera опять подсовыается плате и передача данных продолжается и опять копирование в другой буфер и так до тех пор пока не будет накоплено 4Mb. После этого в пользовательское приложение передаётся Event и пользовательское приложение передаёт с помощью IOCTL запроса(METHOD_NEITHER) свой буфер, уже куда копируются данныё из драйверного буфера(RtlCopyMemory).
Вопрос: Как лучше и правильнее всё это сделать? Мне кажется, что здесь какие-то копирования лишние и вообще не очень всё правильно сделано. Если не очень сложно поподробнее, пожалуйста.
|