USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« : 28-05-2004 13:00 » |
|
Такая задача - Нужно одновременно читать из 2х пайп Одна bulk другая interrupt На start_device будет запускаться циклическая прослушка interrupt пайпы 1й поток читает данные с interrupt Запускается 2й поток и выполняет ReadFile для чтения bulk Таким образом с одним драйвером работают сразу 2 потока одновременно Будут ли они мешать друг другу?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
maaaaaad
Гость
|
|
« Ответ #1 : 28-05-2004 13:13 » |
|
нет. никогда
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #2 : 28-05-2004 13:44 » |
|
USBLexus, смотря каким драйвером пользуешься. Если пользуешь bulkusb из NTDDK то будут мешать. Он не совсем корректно написан.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #3 : 29-05-2004 17:07 » |
|
USBLexus, смотря каким драйвером пользуешься. Если пользуешь bulkusb из NTDDK то будут мешать. Он не совсем корректно написан. Да из DDK А где взять более корректный пример bulkа и interrupta?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
AlexANDor
Гость
|
|
« Ответ #4 : 30-05-2004 22:33 » |
|
Lex, не можешь уточнить, в чем некорректность bulkusb? Я наблюдаю нестабильность работы bulkusb, может отвиснуть передача или даже проресетиться машина. В форуме www.usb.org сообщалось, что bulkusb все еще содержит ошибки, в частности при работе с памятью. Так ли это?
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #5 : 31-05-2004 09:40 » |
|
USBLexus, взять bulkusb и подправить его. Говорят драйвер из XP DDK получше, но с ним я не работал.
AlexANDor, В bulkusb не совсем корректно сделаны функции чтения и записи. Т.е. при одновременном обращении в драйверу из двух разных потоков(даже к двум разным эндпоинтам) стосит крышу драйверу напроч, вплоть до синего экрана. До того как подправили драйвер обходили это выделением обращений к драйверу в критическую секцию.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #6 : 31-05-2004 13:26 » |
|
USBLexus, взять bulkusb и подправить его. Говорят драйвер из XP DDK получше, но с ним я не работал.
AlexANDor, В bulkusb не совсем корректно сделаны функции чтения и записи. Т.е. при одновременном обращении в драйверу из двух разных потоков(даже к двум разным эндпоинтам) стосит крышу драйверу напроч, вплоть до синего экрана. До того как подправили драйвер обходили это выделением обращений к драйверу в критическую секцию. Можно ли где достать исправленые исходники этого драйвера У меня DDK XP но там его действительно засунули в критическую секцию.
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Lex
|
|
« Ответ #7 : 31-05-2004 15:24 » |
|
USBLexus, где достать исправленные исходники я не знаю
|
|
|
Записан
|
Megabyte be with you!
|
|
|
AlexANDor
Гость
|
|
« Ответ #8 : 31-05-2004 22:02 » |
|
За основу надо брать bulkusb из DDK Server 2003. Например в DDK XP в обработчике завершения BulkUsb_ReadWriteCompletion() все еще был забыт вызов MmPrepareMdlForReuse(). Возможно, это та причина, которая приводила к краху системы, особенно после большой передачи данных, о чем упоминают в конференциях. У меня запись-чтение в одном потоке (overlapped) и как-будто (тьфу-тьфу) все заработало. Завтра попробую интереса ради поработать из разных потоков. USBLexus, а в каком примере вызовы драйвера в критической секции? (в rwbulk.c вроде не вижу).
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #9 : 01-06-2004 02:57 » |
|
USBLexus, а в каком примере вызовы драйвера в критической секции? (в rwbulk.c вроде не вижу)
Я конечно в этом деле чайник и могу ошибаться так что не судите строго Я имел ввиду KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, //завершит все Executive, //отложеные запросы: KernelMode, //selective suspend FALSE, //request NULL);
в BulkUsb_DispatchReadWrite
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #10 : 01-06-2004 02:59 » |
|
За основу надо брать bulkusb из DDK Server 2003. Например в DDK XP в обработчике завершения BulkUsb_ReadWriteCompletion() все еще был забыт вызов MmPrepareMdlForReuse(). Возможно, это та причина, которая приводила к краху системы, особенно после большой передачи данных, о чем упоминают в конференциях. У меня запись-чтение в одном потоке (overlapped) и как-будто (тьфу-тьфу) все заработало. Завтра попробую интереса ради поработать из разных потоков. USBLexus, а в каком примере вызовы драйвера в критической секции? (в rwbulk.c вроде не вижу). Можешь куда нибудь выложить пару примеров из 2003 DDK с bulk и interrupt transferom Весь DDK мне не выкачать Трафик не позволяет
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #11 : 01-06-2004 03:06 » |
|
USBLexus, где достать исправленные исходники я не знаю А исходники bulk transfera из книги Waltera Oney Тоже обладают этим глюком? Может за основу взять лучше их
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Lex
|
|
« Ответ #12 : 01-06-2004 10:24 » |
|
USBLexus, до W.Oney я так и не добрался, сейчас на работе времени нет на это. Судя по отзывам, у него должен быть более правильный драйвер.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
AlexANDor
Гость
|
|
« Ответ #13 : 01-06-2004 15:23 » |
|
USBLexus, процитированный тобой кусок вообще к Selective Suspend относится, не о том. Насчет обещанного эксперимента: организовал в своем устройстве еще пару bulk-эндпоинтов и запустил две программы, одна из которых общается через первую пару, другая - через вторую. Поставил периодический прогон (зеркало - устройство выдает то, что получило, в PC-программе опять проверяю совпадение) - обмен идет нормально уже несколько часов. Драйвер bulksusb из DDK Server 2003 (то, что я тебе послал), кому еще надо - выложил тут: http://alexan.fromru.com/files/bulkusb2003.zipЯ думаю нечего вспоминать bulkusb времен DDK 2K - там даже и overlapped i/o не работал. Нынешний кажется вполне ничего. W.Oney видимо не хуже, хотя с ним у меня получается скорость выкачки данных меньше, почему так - еще не разбирался. Я также собирал драйвера от Driver Studio 2.7 , тоже работают. Работаю только с bulk, с interrupt дела не имел. USBLexus, примеры W.Oney должны прекрасно собираться утилитой build , у него же все там есть - и sources и makefile.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #14 : 02-06-2004 02:15 » |
|
Ok Спасибо за пример! Буду искать отличия в XP и 2003 bulkusb... С W Oney я решил не связываться Не хочу таскать за собой generic.sys
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #15 : 02-06-2004 02:54 » |
|
Ok Спасибо за пример! Буду искать отличия в XP и 2003 bulkusb... С W Oney я решил не связываться Не хочу таскать за собой generic.sys Да исправлений много в XP действительно пропущен MmPrepareMdlForReuse Но больше всего радует что наконецто в явном виде показали что interrupt и bulk transferы ничем с точки зрения программиста не отличаются и работают с одним и тем же кодом Меня долго этот вопрос мучал зачем в XP стояла проверка что тип пайпы должен быть обязательно bulk а в Numege их вообще разнесли на разные функции BuildBulkTransfer и BuildInterruptTransfer когда эти функции ничем не отличаются только названия разные.
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #16 : 02-06-2004 03:05 » |
|
USBLexus, Насчет обещанного эксперимента: организовал в своем устройстве еще пару bulk-эндпоинтов и запустил две программы, одна из которых общается через первую пару, другая - через вторую. Поставил периодический прогон (зеркало - устройство выдает то, что получило, в PC-программе опять проверяю совпадение) - обмен идет нормально уже несколько часов. Драйвер bulksusb из DDK Server 2003 (то, что я тебе послал), кому еще надо - выложил тут: http://alexan.fromru.com/files/bulkusb2003.zip Очень важный для меня вопрос Ты в своем эксперименте использовал пайпы через ReadFile или ты для каждой пайпы создал свой DEVICE_IO_CONTROL код
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
AlexANDor
Гость
|
|
« Ответ #17 : 02-06-2004 08:36 » |
|
USBLexus, использовал только ReadFile/WriteFile, а сам драйвер вообще не трогал, ну только BULKUSB_MAX_TRANSFER_SIZE до 4096 увеличил.
|
|
|
Записан
|
|
|
|
|