реклама на сайте
подробности

 
 
> Задержки чтения в USB Mass Storage, Поясните или ткните носом в спецификацию
PriBoris
сообщение May 7 2008, 17:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352



Есть прибор с хитрой и неоднородной организацией памяти.
Компьютеру эта память представляется в виде отдельных файлов, которые надо с прибора считывать.
Если использовать READ_10, то из-за неизбежных задержек сектор (512байт) из памяти прибора может считываться до 0.3сек. Не могу понять ( найти в спецификациях ) что нужно делать по USB в течение этого времени. Если я в течение этого времени отзываюсь NAKами по OUT и по IN, то Windows переклинивает. Т.е. вылезает букет ошибок и как результат винда сбрасывает USB-функцию.
Что делать ? Поддерживается ли в MassStorage/SCSI какое-нибудь отложенное чтение ? Или как-то подругому можно решить проблему ?
Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
galjoen
сообщение May 7 2008, 18:20
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(PriBoris @ May 7 2008, 21:16) *
Если я в течение этого времени отзываюсь NAKами по OUT и по IN, то Windows переклинивает. Т.е. вылезает букет ошибок и как результат винда сбрасывает USB-функцию.

Вообще это странно. Вы уверены? Тут вроде только на IN NAKи приходится слать. А что такое винда запрашивает в том CBW, на который вы NAKи на OUT шлёте? Я давным-давно такое делал, поэтому не уверен, но у меня вроде 5 секунд NAKи на IN до ошибки слались.
Цитата(PriBoris @ May 7 2008, 21:16) *
Что делать ? Поддерживается ли в MassStorage/SCSI какое-нибудь отложенное чтение ? Или как-то подругому можно решить проблему ?
Заранее спасибо.

Можно винде слать CSW с ошибкой, а на следующий REQUEST SENSE послать, что ошибка CRC была "ID CRC ERROR" - SenseKey=3, ASC=0x10, ASCQ=0. В этом случае точно ДОЛГО тот-же READ(10) шлётся. В смысле с теми-же параметрами. Проверял. Из-за этого даже новую флешку, у которой CRC в 0м секторе не совпадает, отформатировать невозможно.
А м.б. логичнее что-то типа "LOGICAL DRIVE NOT READY - BECOMING READY" послать (SenseKey=2, ASC=4, ASCQ=1). Или ещё что-нибудь - попробуйте.

Встречный вопрос. А как вы с кэширование боретесь? Или вам только 1 раз прочитать нужно, а потом ничего не меняется? Или способ как винду заставить перечитать знаете? Тогда этим способом (борьбы с кэшированием) поделитесь пожалуйста.
Go to the top of the page
 
+Quote Post
PriBoris
сообщение May 8 2008, 05:55
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352



Цитата(galjoen @ May 7 2008, 22:20) *
Вообще это странно. Вы уверены? Тут вроде только на IN NAKи приходится слать. А что такое винда запрашивает в том CBW, на который вы NAKи на OUT шлёте? Я давным-давно такое делал, поэтому не уверен, но у меня вроде 5 секунд NAKи на IN до ошибки слались.

Если не принимать никаких мер, то да, уверен. CBW во время этой задержки я не смотрел, т.к. OUT отключен. Попробую проанализировать.
Цитата(galjoen @ May 7 2008, 22:20) *
Можно винде слать CSW с ошибкой, а на следующий REQUEST SENSE послать, что ошибка CRC была "ID CRC ERROR" - SenseKey=3, ASC=0x10, ASCQ=0. В этом случае точно ДОЛГО тот-же READ(10) шлётся. В смысле с теми-же параметрами. Проверял. Из-за этого даже новую флешку, у которой CRC в 0м секторе не совпадает, отформатировать невозможно. А м.б. логичнее что-то типа "LOGICAL DRIVE NOT READY - BECOMING READY" послать (SenseKey=2, ASC=4, ASCQ=1). Или ещё что-нибудь - попробуйте.

Идеи интересные, но весь смысл затеи в максимально быстром чтении. Мне кажется с подобными ухищрениями получится сильное торможение обмена.
В принципе MSC не самоцель, главное чтобы все было быстро. Если не получится я другой класс сделаю, CDC например. Просто сделано много, и, чтобы это не потерять, хочется четко понять всю физику процесса и убедиться что MSC здесь не катит.
Цитата(galjoen @ May 7 2008, 22:20) *
Встречный вопрос. А как вы с кэширование боретесь? Или вам только 1 раз прочитать нужно, а потом ничего не меняется? Или способ как винду заставить перечитать знаете? Тогда этим способом (борьбы с кэшированием) поделитесь пожалуйста.

Скажу сразу, пока реально не использовал, т.к. здесь это не нужно. Но видел в MSDN в описании функции CreateFile вот такую вещь:
HANDLE CreateFile(
...
DWORD dwFlagsAndAttributes, // file attributes
...
);
dwFlagsAndAttributes - Specifies the file attributes and flags for the file.
FILE_FLAG_NO_BUFFERING
Instructs the system to open the file with no intermediate buffering or caching. When combined with FILE_FLAG_OVERLAPPED, the flag gives maximum asynchronous performance, because the I/O does not rely on the synchronous operations of the memory manager. However, some I/O operations will take longer, because data is not being held in the cache.
Попробуйте, может быть это оно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 22:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016