Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Многопоточность и USB драйвер  (Прочитано 16855 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline 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
Специалист

ru
Offline Offline

WWW
« Ответ #2 : 28-05-2004 13:44 » 

USBLexus, смотря каким драйвером пользуешься.
Если пользуешь bulkusb из NTDDK то будут мешать. Он не совсем корректно написан.
Записан

Megabyte be with you!
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #3 : 29-05-2004 17:07 » 

Цитата: Lex
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
Специалист

ru
Offline Offline

WWW
« Ответ #5 : 31-05-2004 09:40 » 

USBLexus, взять bulkusb и подправить его. Говорят драйвер из XP DDK получше, но с ним я не работал.

AlexANDor, В bulkusb не совсем корректно сделаны функции чтения и записи. Т.е. при одновременном обращении в драйверу из двух разных потоков(даже к двум разным эндпоинтам) стосит крышу драйверу напроч, вплоть до синего экрана. До того как подправили драйвер обходили это выделением обращений к драйверу в критическую секцию.
Записан

Megabyte be with you!
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 31-05-2004 13:26 » 

Цитата: Lex
USBLexus, взять bulkusb и подправить его. Говорят драйвер из XP DDK получше, но с ним я не работал.

AlexANDor, В bulkusb не совсем корректно сделаны функции чтения и записи. Т.е. при одновременном обращении в драйверу из двух разных потоков(даже к двум разным эндпоинтам) стосит крышу драйверу напроч, вплоть до синего экрана. До того как подправили драйвер обходили это выделением обращений к драйверу в критическую секцию.


Можно ли где достать исправленые исходники этого драйвера У меня DDK XP но там его действительно засунули в критическую секцию.
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #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
Опытный

ru
Offline 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
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #10 : 01-06-2004 02:59 » 

Цитата: AlexANDor
За основу надо брать 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
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 01-06-2004 03:06 » 

Цитата: Lex
USBLexus, где достать исправленные исходники я не знаю


А исходники bulk transfera из книги Waltera Oney Тоже обладают этим глюком? Может за основу взять лучше их
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #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
Опытный

ru
Offline 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
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #15 : 02-06-2004 02:54 » 

Цитата: USBLexus
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
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #16 : 02-06-2004 03:05 » 

Цитата: AlexANDor
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 увеличил.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines