Mon Jul 09 2007 10:59, Nickita A Startcev wrote to Vitaly Polikarpov: NS>>>>>>> Для обмена мелкими контрол-пакетами на самом медленном NS>>>>>>> стандарте по моим прикидкам получился примерно 17кратный NS>>>>>>> оверхед.
"Это вряд ли" (с). Скорее всего, не в этом дело.
В USB все происходит фреймами или микрофреймами. Период повторения фреймов (low speed и full speed) равен 1 мс, период повторения микрофреймов - 125 мкс.
Внутри фрейма все происходит определенным чередом. Сначала идет обмен по управляющим трубам, потом - по изохронным и по трубам прерывания, в конце - по bulk. Обмен с какой-то трубой идет или до тех пор, пока планировщик хоста это разрешает, или пока устройство не "запнется" (т.е. слегка запоздает) с ответом. "Запнувшееся" устройство планировщик тут же перестает опрашивать до следующего фрейма.
Например, если фулл спид балк труба запнется на более чем 42 мкс (если склероз не подводит), то планировщик перейдет к обслуживанию следующей трубы, а эта запнувшаяся труба в следующий раз будет обслужена только в следующем фрейме, т.е. через 1 мс.
Поэтому два с виду одинаковых устройства, одно из которых реагирует на USB запросы быстро, а другое задерживается с ответами по сравнению с первым всего на несколько микросекунд, могут работать очень по-разному: первое будет "летать", а второе неимоверно "тормозить". А разработчик такого тормознутого девайса будет рассуждать об "оверхедах", хотя причина будет только в том, что ему доку было лень прочитать внимательно.
Другая возможная причина - ошибочно выбранная труба. Управляющая труба имеет наивысший приоритет, но планировщик отводит на все управляющие трубы всего процентов 10 от пропускной способности. Если обмен не успевает уложиться в отведенную ему полосу, ему придется ждать следующего фрейма, и т.п.
А вот балк, хоть и имеет самый низший приоритет, зато может занимать почти всю полосу. Если устройство одно, то планировщик быстренько обменяется с ним несколькими байтами по управляющей трубе, а остаток времени отдаст балку.
Пока Алексей