
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (51) « Первая ... 36 37 [38] 39 40 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#556
,
|
|
|
Ну это твое дело. Плюсом, пожалуй, будет то, что эта контора, судя по всему, занимается разработкой целенаправленно и драйверы их скорее всего (но не факт) содержат мало ошибок. А вообще если уж на то пошло, то я думаю многие любители "поиграться с USB" поделятся с тобой наработками "за спасибо", но естественно придется многое допиливать. |
Сообщ.
#557
,
|
|
|
На форумах англоязычных хвалят книгу
USB: The Universal Serial Bus by Benjamin David Lunt там примерыов много говорят, интересно на каком компиляторе |
Сообщ.
#558
,
|
|
|
StasNewOs, ты до сих пор не сделал поддержку EHC?
По сабжу - мне вполне хватает спецификаций. Чужие исходники - чужие ошибки. |
Сообщ.
#559
,
|
|
|
Кстати вопрос к zakharo. Я когда начинал проектировать свой драйвер EHCI, то выбрал такую модель, что каждая цепочка TD объединяется в одну QH и добавляется в асинхронный список и так для всех транзакций (ну QH естественно освобождаются). Но вот по обдумав архитектуру совсем недавно пришел к выводу, что эффективней сразу добавить QH в асинхронный список под каждую используемую bulk и control конечную точку при инициализации устройства, так ли это? Вообже влияют ли на производительность QH в списке без активных TD?
|
Сообщ.
#560
,
|
|
|
В книжке все 4 контроллера и примеры для мышей, клавы, принтера, вебкамеры и флешек. Такую книгу по любому надо купить.
Я поддержку ещё не доделал, допереписываю систему и захожу уже на 3 круг драйвера флешек. Кстати shm читал тебя недавно на wasme, на эту тему, ты явно сделал level up в нней. По поводу скорости, то контроллер по своему таймеру проверяет команды в своей памяти, какие бы они небыли, хоть вопрос и не мне. |
Сообщ.
#561
,
|
|
|
У меня вообще QH один на все - я уже говорил, что был вынужден работать в условиях жестких ограничений на память. Адрес QH записывается в регистр контроллера при иницализации. При подготовке транзакции я заполняю QH, а потом выставляю контроллеру флажок ASYNC_ENABLE. После окончания транзакции снимаю ASYNC_ENABLE.
На скорость это, пожалуй, влияет - я даже при работе с USB-винчестерами не получаю больше 3 Мб/сек, в то время, как Винда легко крутит до 40. Правда, Винда в одну транзакцию укладывает не один сектор, а сразу много (например, целый кластер) - это, конечно, тоже существенно влияет на скорость. |
Сообщ.
#562
,
|
|
|
А мне кажется, что винда читает 4096байт, т.е. страницу, 8 секторов за раз. Для заполнении виртуального пространства файлом ОС в любом случае сначала заполняет страницы, а уж потом ставит их подряд.
Скорость будет максимальной, если все куски файла в одной очереди у контроллера, т.е. нужно взять нужное количество страниц и подготовить команды для копирования секторов в них за одну очередь. Мне кажется, что одну QH и несколько qt лучше, т.к. возможно обрабатывает её за один раз, хотя не знаю. При создании файла выделяется пространство под его объём, а уже при открытии его пространство заполняется страницами и сами страницы заполняются контроллером от флешки, или диска, или может сетевуха туда накидать чаго, или звуковуха записать звук, даже дополнительные процессоры (CPU, GPU), но главный процессор в это время не занят и делает другую работу. |
Сообщ.
#563
,
|
|
|
Ну, во-первых, EHCI за одну транзакцию может передать 5 страниц - в QTD есть 5 адресов. Но надо учитывать еще и уровень SCSI.
Чем больше информации передается за одну SCSI-команду, тем выгоднее - меньше потери на передачу CBW и CSW. Дальше надо анализировать порядок кластеров в файле. Если они идут не подряд, то больше одного кластера читать нет смысла. А вот если подряд, то их тоже можно объединить и читать одной SCSI-командой. Думаю, что c точки зрения скорости лучше всего сделать так: одной командой SCSI читать по максимуму, а дальше в зависимости от размера этого максимума сделать нужное количество QTD для приема. Мне тут недавно довелось работать с карточкой памяти формата RAW, то есть без файловой системы. И не в ДОСе, а из специализированной ПЛИС. На карточке информация была записана просто по секторам в порядке возрастания. И там удалось поэкспериментировать со скоростью. Чем больше секторов я читал за одну SCSI-команду, тем, естественно, скорость была выше. Конечно, нелинейно - ведь процент потерь на передачу CBW и CSW становился все меньше. Короче, я дошел до 32 Кбайт (64 сектора) за одно чтение и получил скорость порядка 1 Мб/сек с карточки типа CF на самодельном (прошитом в ПЛИС) контроллере USB 1.1. А при чтении по одному сектору было примерно 200 Кб/сек. |
Сообщ.
#564
,
|
|
|
Круто.
На диске обычно кластер собственно и есть 4096 байт, а страницы памяти, которые мы заполняем в реальности считаются перемешаны, хотя есть ещё 4мб страницы но с ними работать накладно для оперативки. Если гнаться за скоростью, то получается можно отлавливать идущие подряд кластера и страницы, правда замучаешься такой алгоритм писать. Проще учесть, что у нас есть перемешанные кластера на диске и перемешанные страницы памяти, которые нужно заполнять и ставить подряд в ВАП. Короче работа сводиться к копированию файла блоками из 8 секторов по 512байт, для этого и делается цепочка из qtd. |
Сообщ.
#565
,
|
|
|
Цитата StasNewOs @ На диске обычно кластер собственно и есть 4096 байт Смотря для какой системы. NTFS или там Ext - да, чаще всего 4096 кб. А FAT (FAT32) - обычно гораздо больше. На флешках стандартно используется FAT(32). Редко кто форматирует флешку в NTFS или Ext (2,3). |
Сообщ.
#566
,
|
|
|
Бывает, что кластер 32 сектора, но он всегда кратен 8, получается, что его нужно разбивать на 4 части, т.к. страница памяти то 4096байт. Другое дело, что в нём файл тока на 3 сектора может быть.
Добавлено А сама цепочка из qtd мне кажется должна быстро обрабатываться, он ведь не останавливается пока всю не обработает. Добавлено Для меня встала необходимость отлавливать моменты, когда у контроллера нету помощников и на материнке запаян хаб. Делать проверку количества юнитов. |
Сообщ.
#567
,
|
|
|
Цитата StasNewOs @ В книжке все 4 контроллера и примеры для мышей, клавы, принтера, вебкамеры и флешек. На все это есть нормальные спецификации. По крайней мере у меня проблем с реализаций роддержки HID и USB HDD не было. Цитата StasNewOs @ Кстати shm читал тебя недавно на wasme, на эту тему, ты явно сделал level up в нней. Я не написал там ничего нового, что не знал года 4 назад, когда писал драйвер UHCI и начал EHCI, вот недавно дошли руки его допиливать, но ничего особо нового я не узнал. Но разве, что про расщепленные транзакции я не читал. Цитата StasNewOs @ По поводу скорости, то контроллер по своему таймеру проверяет команды в своей памяти Это понятно, меня итересуют контретные значения. А сколько я потеряю в скорости если для каждой конечной точки будут постоянно висеть в списке свои QH. У меня складывается впечатление, что разработчики EHCI предполагали именно такую архитектуру. Сейчас у меня скороть работы с флешкой примерно такая же как в винде. Цитата zakharo @ Винда в одну транзакцию укладывает не один сектор, а сразу много (например, целый кластер) - это, конечно, тоже существенно влияет на скорость. Вообще ты меня не совем правильно понял - это понятно, что чем более большими кусками передаешь - тем быстрее скорость, меня интересует конкретно как влияют неактивные QH в асинхронном списке на производительность. А так я разбиваю передачу по 128 секторов для EHC, для UHC по 16. А на более верхнем уровне у меня тот же драйвер FAT производит "склейку" смежных клатеров при чтении. Цитата StasNewOs @ А мне кажется, что винда читает 4096байт, т.е. страницу, 8 секторов за раз. Нет, это не так. Цитата StasNewOs @ Для заполнении виртуального пространства файлом ОС в любом случае сначала заполняет страницы, а уж потом ставит их подряд. ![]() Цитата zakharo @ Ну, во-первых, EHCI за одну транзакцию может передать 5 страниц - в QTD есть 5 адресов. Вот тут я не уверен, так как эти величина еще зависит от размера КТ. Цитата zakharo @ Думаю, что c точки зрения скорости лучше всего сделать так: одной командой SCSI читать по максимуму, а дальше в зависимости от размера этого максимума сделать нужное количество QTD для приема. Вообще примерно так оно и делается. Я правда ограничивая не DT а количесвом секторов на команду, но суть та же. Цитата StasNewOs @ На диске обычно кластер собственно и есть 4096 байт Предположение верно только для NTFS и то не всегда (у меня например сейчас на одном диске NTFS размер кластера иной). Цитата StasNewOs @ Если гнаться за скоростью, то получается можно отлавливать идущие подряд кластера и страницы, правда замучаешься такой алгоритм писать. В чем проблема? Цитата StasNewOs @ но он всегда кратен 8 Не всегда, может быть меньше. Вообще рекомендую забыть про связь меду аппаратным уровнем и программной абстракцией данных. |
Сообщ.
#568
,
|
|
|
>У всех современных устройтвв с DMA есть возможность разбиения данных ан страницы.
Я и говорю, что подготавливаем qtd с тем, чтобы попасть в страницы. В принципи поставить проверку на то, что следующий кластер идёт следом, или страницы физически друг за другом это не так и трудно. |
Сообщ.
#569
,
|
|
|
Цитата StasNewOs @ страницы физически друг за другом А это еще зачем? раскидать данные по страницам - забота контроллера. Скорость от этого падать не должна. |
Сообщ.
#570
,
|
|
|
Это как? Контроллер не знает виртуальную память, он работает с реальной, ты чего
![]() |