Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
FT245BL соглашается на bulk transfer либо если в буфере накопилось 62 байта, либо если прошло 16мс с последнего трансфера. В итоге, за секунду пролезает не больше 60 мелких пакетов (размером меньше 62 байт)... Даже сраные диалап модемы работали быстрее.
З.Ы. Можно уломать её на таймаут в 1мс, но это не особо помогает. Получается 1 мегабит вместо теоретических (и практических, если гнать сплошной поток) 8.
Да можно, но это усложнит интерфейс... Вместо простого и понятного jtag_shift_dr, который сразу отдаёт ответ, будет какая-нибудь асинхронная хуета с коллбеками или очередями... Брр...
Самая жопа в том, что этот буфер с той стороны кабеля. Не со стороны компа. Т.е. надо уломать железку за ftdi (в данном случае cpld байтбластера) высрать в буфер что-то кратное 62...
Благо число байт в её ответе можно легко предсказать и пустых команд на чтение накидать, которые 1 байт отправляют в ответ...
Ну вроде как этот чип ещё умеет изохронный трансфер (грубо говоря поток с равномерной скоростью и гарантией на тайминги). Но там гарантии доставки не будет, что совсем не айс.
А вообще в усб их 4 типа:
control - для небольших команд (настройки и т.п.)
interrupt - мелкие, но критичные к задержкам пакеты от железки (клавы, мыши и т.п.)
isochronous - выделенная полоса для всяких видео и звуков
bulk - с гарантированной доставкой но без гарантий по таймингам (флешки, принтеры и т.п.)
> работа с кучей мелких файлов такая медленная
Ты про запись же? Это вендопроблема, емнип. Венда пытается спасти долбоёбов, выдирающих флешки без размонтирования, вот и флашит всё на каждый чих. Попробуй галочку переключить (диспетчер устройств, свойства флешки, быстрое извлечение vs пирфоманс).
> может ли лагать сеть
Да, USB сетевухи тоже через bulk работают.
> может ли лагать клава/мышь
Нет. У interrupt высший приоритет.
> долбоёбов, выдирающих флешки без размонтирования
Как грубо!
Кстати, Windows пытается спасти ещё и тех простофиль, которые посмели не перезагружая компьютера подключить мышь, какой позор, на костёр их срочно! P. S. А ведь USB на аппаратном уровне штекера поддерживает быстрое вытыкание.
Но ведь продумали же! И самолёты продумали.
Да, там неканон, здесь неканон, просто к остальному уже привыкли. Если делать всё правильно и по задумке природы, можно на всю жизнь остаться кучкой хаотично движущихся молекул.
Да нет же. Наглый вполне так пропускает первый пакет, даже если он 1 байт. А остальные держит.
А эту железку явно просят отдать данные, а она жмотится и делает вид, что нихуя нету, пока таймаут не пройдёт.
З.Ы. В усб принципы немного другие. Железка ничего не может отправить, пока хост не попросит. Ну и подтверждение идёт сразу за пакетом. Поэтому никаких наглов тут не замутишь 😉
И при этом хост один хуй пингует железку весь этот таймаут, пытаясь выпросить данные... Там по-моему на эти пинги больше полосы ушло, чем на передачу этого сраного байта...
> таймаут
Ну нету у наглого таймаутов. Либо с того конца подтверждение придёт по предыдущему пакету, либо полный пакет наберётся.
Ты, наверное, про другую фичу - отложенное подтверждение пакетов (delayed tcp ack), когда другой конец не кидает ack сразу, а ждёт 500мс или какого-нибудь попутного пакета. Вот её сочетание с нейглом и write-write-read на сокете скатывает всё в ёбаный диалап.
Ты, наверное, читал как раз про проблему в целом. А потом подробности забыл и приписал всё это наглому...
А для неё надо:
1) write-write-read в программе
2) nagle на отправляющей стороне
3) delayed ack на принимающей
Вот тогда и получаются те самые "наберётся M байтов (и nagle пропустит ещё пакет) или пройдёт Nмс (и другой конец кинет ack, а nagle пропустит ещё пакет)".
Ты вот про это? This classic problem is well-known and was first addressed in the Tymnet network in the late 1960s. The solution used there was to impose a limit on the count of datagrams generated per unit time. This limit was enforced by delaying transmission of small packets until a short (200-500ms) time had elapsed, in hope that another character or two would become available for addition to the same packet before the timer ran out.
Но тут же Нейгл пишет о говнорешении, которое в 60 году до него придумали... И предлагает его заменить как раз на алгоритм без таймаутов:
The solution is to inhibit the sending of new TCP segments when new outgoing data arrives from the user if any previously transmitted data on the connection remains unacknowledged. This inhibition is to be unconditional; no timers, tests for size of data received, or other conditions are required.
С tcp тут вообще мало общего. Как-то так, если спуститься на самые нижние уровни усб:
- хост говорит IN (слышь, данные есть?)
- девайс отвечает NAK (пиздит, данные то есть)
- хост с неким интервалом говорит PING (а если найду?)
- девайс на них отвечает NAK (нету, заебал)
- и вдруг через 16мс на один из пингов отвечает ACK (ладно, ладно, есть у меня данные)
- хост кидает IN еще раз (ну давай их сюда)
- девайс кидает DATA
- хост отвечает ACK
Может они проосто не хотят балк гонять ради двух байт?
Проще выровнять на 62 😉
Вот и пришлось добавлять байты до кратного 62, чтобы ответа не ждать целых 16мс.
видал я протоколы где надо было выравнивать запрос по 2^N байтов, но чтоб 62 это впервые
Благо число байт в её ответе можно легко предсказать и пустых команд на чтение накидать, которые 1 байт отправляют в ответ...
control - для небольших команд (настройки и т.п.)
interrupt - мелкие, но критичные к задержкам пакеты от железки (клавы, мыши и т.п.)
isochronous - выделенная полоса для всяких видео и звуков
bulk - с гарантированной доставкой но без гарантий по таймингам (флешки, принтеры и т.п.)
Если подключить винт и сетевуху через один хаб, может ли лагать сеть если канал заполнен диском и наоборот?
может ли лагать клава/мышь из-за перегрузки канала?
Ты про запись же? Это вендопроблема, емнип. Венда пытается спасти долбоёбов, выдирающих флешки без размонтирования, вот и флашит всё на каждый чих. Попробуй галочку переключить (диспетчер устройств, свойства флешки, быстрое извлечение vs пирфоманс).
> может ли лагать сеть
Да, USB сетевухи тоже через bulk работают.
> может ли лагать клава/мышь
Нет. У interrupt высший приоритет.
Как грубо!
Кстати, Windows пытается спасти ещё и тех простофиль, которые посмели не перезагружая компьютера подключить мышь, какой позор, на костёр их срочно!
P. S. А ведь USB на аппаратном уровне штекера поддерживает быстрое вытыкание.
во-первых это слово выдуманное от вытыкать
во-вторых вытыкать - это выкалывать. Глаз выткнул
по этому не соглашусь - USB на аппаратном уровне штекера не поддерживает быстрое вытыкание.
Толи Jack 6.2...
Ага. Устройство просто не сгорает от выдирания (хотя могло бы, если бы создатели USB этот момент не продумали).
Да, там неканон, здесь неканон, просто к остальному уже привыкли. Если делать всё правильно и по задумке природы, можно на всю жизнь остаться кучкой хаотично движущихся молекул.
Там единицей передачи является файл, должно лучше работать
а эта железка завязывается не на конфирмейшены, а на размер буфера или на время (почему-то)
Так что ты видимо хотел выпендриться своим знанием TCP, но потерпел крах
Полосу USB экономить пытались. Но как-то криво, имхо. Лучше бы кидали NAK при пустом буфере да и всё.
А в опенсурсной версии (видимо, отреверсили) я flush не заметил.
бери нормальное и будет все работать
это всё равно что взять самбу, и сказать "говно этот ваш Active Directory, ничерта не умеет"
Ты думаешь, что официальная либа лучше работает? Да хуй там.
> бери нормальное
Да я сам уже написал. И тот читерский паддинг до 62 байт дал 4000 write-read транзакций за секунду против 60-500 у штатной.
А тут и первый пакет задерживается.
Это ведь и есть твоя проблема?
Гость, ты уже понял что обосрался?
А эту железку явно просят отдать данные, а она жмотится и делает вид, что нихуя нету, пока таймаут не пройдёт.
З.Ы. В усб принципы немного другие. Железка ничего не может отправить, пока хост не попросит. Ну и подтверждение идёт сразу за пакетом. Поэтому никаких наглов тут не замутишь 😉
http://govnokod.ru/19660#comment317196
> таймаут
Ну нету у наглого таймаутов. Либо с того конца подтверждение придёт по предыдущему пакету, либо полный пакет наберётся.
Ты, наверное, про другую фичу - отложенное подтверждение пакетов (delayed tcp ack), когда другой конец не кидает ack сразу, а ждёт 500мс или какого-нибудь попутного пакета. Вот её сочетание с нейглом и write-write-read на сокете скатывает всё в ёбаный диалап.
А для неё надо:
1) write-write-read в программе
2) nagle на отправляющей стороне
3) delayed ack на принимающей
Вот тогда и получаются те самые "наберётся M байтов (и nagle пропустит ещё пакет) или пройдёт Nмс (и другой конец кинет ack, а nagle пропустит ещё пакет)".
https://tools.ietf.org/html/rfc896
Но тут же Нейгл пишет о говнорешении, которое в 60 году до него придумали... И предлагает его заменить как раз на алгоритм без таймаутов:
The solution is to inhibit the sending of new TCP segments when new outgoing data arrives from the user if any previously transmitted data on the connection remains unacknowledged. This inhibition is to be unconditional; no timers, tests for size of data received, or other conditions are required.
- хост говорит IN (слышь, данные есть?)
- девайс отвечает NAK (пиздит, данные то есть)
- хост с неким интервалом говорит PING (а если найду?)
- девайс на них отвечает NAK (нету, заебал)
- и вдруг через 16мс на один из пингов отвечает ACK (ладно, ладно, есть у меня данные)
- хост кидает IN еще раз (ну давай их сюда)
- девайс кидает DATA
- хост отвечает ACK