К накладным расходам при передаче по последовательной шине относятся:
Накладные расходы на каждую транзакцию зависят от ее типа; наиболее выгодные — изохронные (нет подтверждения), самые ресурсоемкие — управляющие трехстадийные. Число байт накладных расходов на каждую транзакцию, отнесенное к числу байт полезных данных для полной и высокой скорости, приведено в табл. 1 (низкую скорость в «соревнованиях» не рассматриваем). В таблице приведена и эффективность использования пропускной способности шины во время указанных транзакций. Большие накладные расходы на высокой скорости объясняются большим влиянием задержек распространения: на полной скорости время оборота «поглощает» до двух байт, а на высокой — до 90 (поскольку битовый интервал около 2 нс много меньше допустимых задержек распространения).
Скорость | FS | HS |
Тип | Накладные расходы/Размер данных — Эффективность | |
Изохронные | 9/1023 — 99% | 38/1024 — 96% |
Прерывания | 13/64 — 83% | 55/1024 — 95% |
Передача массивов | 13/64 — 83% | 55/512 — 90% |
Управление (3 стадии) | 45/64 — 59% | 173/64 — 27% |
Очевидно, что с точки зрения уменьшения доли накладных расходов шины выгодно использовать транзакции с пакетами данных максимальной длины. Однако такие транзакции занимают слишком много времени в микрокадре, оставляя мало места для других. Теоретически за каждый кадр (1 мс) на полной скорости (12 Мбит/с) по шине может быть передано 12 000 бит (вместе со вставленными) — 1,5 Кбайт, хотя реально это число меньше из-за задержек распространения и ответов. На высокой скорости (480 Мбит/с) в микрокадре (125 мкс) передается 60 000 бит — 7,5 кбайт.
В следующих таблицах приводятся параметры пропускной способности для разных типов передач в зависимости от размера поля данных. В этих таблицах приняты следующие обозначения: D — размер поля данных, VEP — достижимая скорость для конечной точки, KF — доля времени микрокадра, занимаемая транзакцией; VBUS — максимальная пропускная способность шины с пакетами указанной длины.
Оценить возможность сочетания различных транзакций в микрокадре можно сложением занимаемых долей кадра (результат не должен превышать 100%). Из следующих таблиц видно, что низкоскоростные устройства при малой пропускной способности расходуют значительную часть времени шины. В USB 1.x с этим мирятся (ради простоты), а в USB 2.0 полоса высокоскоростной шины экономится за счет применения расщепленных транзакций (что требует существенного усложнения хабов).
D | VEP, Кбайт/с |
KF | N | VBUS, Кбайт/с | VEP, Кбайт/с | KF | N | VBUS, Кбайт/с |
Управляющие передачи | Прерывания | |||||||
1 | 1 | 26% | 3 | 3 | 1 | 11% | 9 | 9 |
2 | 2 | 27% | 3 | 6 | 2 | 11% | 8 | 16 |
4 | 4 | 28% | 3 | 12 | 4 | 12% | 8 | 32 |
8 | 8 | 30% | 3 | 24 | 8 | 14% | 6 | 48 |
D | VEP, Кбайт/с |
KF | N | VBUS, Кбайт/с | VEP, Кбайт/с | KF | N | VBUS, Кбайт/с |
Изохронные передачи | Передача массивов и прерывания | |||||||
1 | 1 | 1% | 150 | 150 | 1 | 1% | 107 | 107 |
2 | 2 | 1% | 136 | 272 | 2 | 1% | 100 | 200 |
4 | 4 | 1% | 115 | 460 | 4 | 1% | 88 | 352 |
8 | 8 | 1% | 88 | 704 | 8 | 1% | 71 | 568 |
16 | 16 | 2% | 60 | 960 | 16 | 2% | 51 | 816 |
32 | 32 | 3% | 36 | 1152 | 32 | 3% | 33 | 1056 |
64 | 64 | 5% | 20 | 1280 | 64 | 5% | 19 | 1216 |
128 | 123 | 9% | 10 | 1280 | не дост. | |||
256 | 256 | 18% | 5 | 1280 | ||||
512 | 512 | 35% | 2 | 1024 | ||||
1023 | 1023 | 69% | 1 | 1023 |
D | VEP, Кбайт/с |
KF | N | VBUS, Кбайт/с | VEP, Кбайт/с |
KF | N | VBUS, Кбайт/с |
Изохронные передачи | Передача массивов и прерывания | |||||||
1 | 8 | 1% | 192 | 1536 | 8 | 1% | 133 | 1064 |
2 | 16 | 1% | 187 | 2992 | 16 | 1% | 131 | 2096 |
4 | 32 | 1% | 178 | 5696 | 32 | 1% | 127 | 4064 |
8 | 64 | 1% | 163 | 10432 | 64 | 1% | 119 | 7616 |
16 | 128 | 1% | 138 | 17664 | 128 | 1% | 105 | 13440 |
32 | 256 | 1% | 107 | 27392 | 256 | 1% | 86 | 22016 |
64 | 512 | 1% | 73 | 37376 | 512 | 2% | 63 | 32256 |
128 | 1024 | 2% | 45 | 46080 | 1024 | 2% | 40 | 40960 |
256 | 2048 | 4% | 25 | 51200 | 2048 | 4% | 24 | 49152 |
512 | 4096 | 7% | 13 | 53248 | 4096 | 8% | 13 | 53248 |
1024 | 8192 | 14% | 7 | 57344 | 8192 | 14% | 6 | 49152 |
20481 | 16384 | 28% | 3 | 49152 | 16384 | 28% | 3 | 49152 |
30721 | 25576 | 41% | 2 | 49152 | 25576 | 42% | 2 | 49152 |
1 — Для широкополосной конечной точки строки относятся к двум-трем транзакциям в микрокадре, в каждой из которых длина поля данных не превышает 1024 байт.
Для передачи сигналов используются два провода D+ и D–. На каждой стороне интерфейса (порте хаба и подключенного устройства, см. рисунок ниже) имеются:
Уровни сигналов передатчиков FS/LS в статическом режиме должны быть ниже 0,3 В (низкий уровень) или выше 2,8 В (высокий уровень). Приемники должны выдерживать входное напряжение в пределах –0,5...+3,8 В. Чувствительность дифференциальных приемников — 200 мВ при синфазном напряжении 0,8–2,5 В. Линейные приемники должны обладать гистерезисом с нижним порогом 0,8 В и верхним порогом 2 В.
Устройство USB должно поддерживать все состояния, определенные спецификацией:
USB поддерживает динамическое конфигурирование, отслеживая подключение и отключение устройств. USB позволяет идентифицировать подключаемые устройства, определять их потребности в ресурсах (полоса пропускания, питание от шины), выбирать нужную конфигурацию и управлять устройствами, что обеспечивает полную поддержку PnP. Для этих целей определены «правила поведения» подключаемых устройств, система дескрипторов и стандартные управляющие запросы к устройствам. Ключевую роль в системе PnP играют хабы, позволяющие селективно управлять работой подсоединенных к ним сегментов шины, что требуется на этапе конфигурирования. В процессе работы шины постоянно идет процесс нумерации (enumeration) устройств, отслеживающий изменения физической топологии.
Периодические транзакции (изохронные и прерывания) критичны к времени выполнения, что накладывает отпечаток на их исполнение в расщепленном виде.
Изохронные транзакции на FS синхронизируются с кадрами (1 мс), в то время как на HS — с микрокадрами (125 мкс). Поскольку за время микрокадра на полной скорости может быть передано всего 187,5 байт данных, при расщеплении транзакций на стороне FS можно без ущерба равномерности уменьшить размер передаваемого пакета за один микрокадр (ради облегчения планирования загрузки микрокадров). Исходя из этого, одна транзакция FS, несущая до 1023 байт данных, фрагментируется — разбивается на 1–6 транзакций HS, несущих до 188 байт данных каждая.
Проще всего расщепляются транзакции изохронного вывода, поскольку здесь не требуется получения от устройства ответа или данных. Одна FS-транзакция изохронного вывода реализуется в виде цепочки из 1–6 HS-транзакций, в каждой из которых после маркера SS посылается маркер OUT, адресующийся к конечной точке целевого устройства, и пакет DATA0 с очередным фрагментом данных. Здесь (и только здесь) в маркере SS поля S (Start) и E (End) определяют местоположение пакета данных в полноскоростной транзакции: [S:E] = 10 — стартовый, [S:E] = 01 — последний, [S:E] = 00 — промежуточный, [S:E] = 11 — в пакете все данные транзакции.
Транслятор транзакций, успешно приняв стартовый пакет (с единичным битом S), может начинать транзакцию вывода, полагая, что последующие данные будут хостом доставлены своевременно. Отработав пакет с признаком последнего фрагмента, транслятор формирует нормальное окончание пакета (CRC код и EOP). Если промежуточные фрагменты приходят с ошибкой, транслятору придется «испортить» выводимый пакет, введя ошибку вставки бит. Таким образом, целевой приемник данные этой транзакции проигнорирует, как некорректные. Транслятор транзакций после приема фрагмента с ошибкой будет игнорировать все расщепленные транзакции, адресованные к данной конечной точке, у которых нет признака начального фрагмента. Последующую транзакцию со стартовым фрагментом транслятор будет отрабатывать как новую.
Транзакции изохронного ввода расщепляются несколько сложнее, поскольку требуют передачи к хосту данных, которые от целевого устройства будут получены с задержкой. Одна FS-транзакция изохронного ввода реализуется в виде цепочки, состоящей из транзакции запуска, содержащей маркер SS и маркер IN, и нескольких транзакций завершения, в каждой из которых за маркером CS следует тот же маркер IN и ожидается от хаба пакет с очередным фрагментом данных или пакет квитирования. Здесь также данные одной FS-транзакции разбиваются на 1–6 фрагментов (HS-транзакций). Данные всех фрагментов, кроме последнего, возвращаются пакетами MDATA, вынуждающими повторить транзакцию завершения в следующем микрокадре. Последний фрагмент приходит в пакете DATA0. Вместо пакета данных контроллер может ответить пакетом NYET, если к концу микрокадра он принял от целевого устройства менее трех байт данных. Хост в этом случае повторит транзакцию завершения в следующем микрокадре, если текущий микрокадр не является последним в кадре. Ответ NYET в последнем микрокадре кадра трактуется хостом как ошибка, по которой транзакцию следует завершить и сообщить об этом клиентскому драйверу. Если транслятор транзакций принимает от целевого устройства данные с ошибкой, он ответит пакетом ERR, что тоже вынудит хост прекратить транзакцию с сообщением об ошибке.
Транзакции прерываний имеют небольшой размер пакета (до 8 байт данных на LS и до 64 на FS), поэтому для них не нужна фрагментация вывода, а их выполнение укладывается в 1–2 микрокадра.
Транзакция запуска вывода по прерыванию (Interrupt OUT) состоит из последовательности маркеров SS и OUT, за которыми следует пакет данных DATA0 или DATA1. Транзакция завершения состоит из последовательности маркеров CS и OUT, на которую транслятор отвечает пакетом подтверждения:
Транзакция запуска ввода по прерыванию (InterruptIN) состоит из последовательности маркеров SS и IN. Данные от устройства хост получит в пакетах 1–2 транзакций завершения. Транзакция завершения состоит из последовательности маркеров CS и IN, на которую транслятор отвечает пакетом данных или подтверждения (NAK, NYET, STALL или ERR с вышеописанными значениями). Если транслятор принял еще не все данные от целевого устройства, они придут в пакете MDATA (если принято менее трех байт, транслятор пошлет NYET), на что хост должен повторить транзакцию завершения в следующем микрокадре. Последняя порция данных придет в пакете DATA0 или DATA1.
Непериодические транзакции (управление и передача массивов) не критичны к времени выполнения; малый размер блока данных (до 64 байт) позволяет их расщеплять, используя по одной транзакции запуска и завершения.
Транзакции запуска вывода состоит из последовательности маркеров SS и OUT для массивов (Bulk OUT) или SS и SETUP для управления (Сontrol), за которыми следует пакет данных DATA0 или DATA1. Транслятор подтверждает запуск ответом ACK, после которого хост должен выполнить транзакцию завершения, или отвергает его пакетом NAK, после которого хост должен повторить запуск. Транзакция завершения состоит из маркеров CS и OUT, на что транслятор отвечает подтверждениями ACK, NAK, STALL (это обычные ответы целевой конечной точки) или NYET — транзакция еще не завершена, хосту следует позже повторить транзакцию завершения.
Транзакции запуска ввода состоит из последовательности маркеров SS и IN, транслятор своим ответом подтверждает (ACK) или отвергает (NAK) запуск. Транзакция завершения состоит из маркеров CS и IN, на что транслятор отвечает пакетом данных (DATA0 или DATA1) или подтверждениями NAK, STALL или NYET с вышеописанным значением.
Хост-контроллер является аппаратным посредником между устройствами USB и хостом. В настоящее время имеется три спецификации хост-контроллеров, каждой из которых соответствует свой комплект драйверов хост-части:
Все эти варианты контроллеров выполняют одни и те же задачи: организуют физические транзакции с устройствами по шине USB в соответствии с описаниями (дескрипторами) этих транзакций, помещенными в системное ОЗУ драйвером хост-контроллера. При этом транзакции разных типов обрабатываются по-разному. В плане обработки ошибок проще всего устроены изохронные транзакции, где ошибки не требуют повторов. Транзакции передач с гарантированной доставкой в случае ошибок требуют повторов до победного конца или признания неудачи (исчерпания допустимого числа повторов). С точки зрения планирования следует выделить периодические транзакции, которые должны выполняться строго по графику, остальные — как получится, и их ставят в очереди. Из-за особенностей планирования и возможных повторов порядок завершения обработки дескрипторов транзакций (успешных или нет) будет отличаться от порядка их помещения в память1, что прибавляет забот хост-контроллеру и его драйверу. Три варианта хостконтроллеров решают эти задачи по-разному и используют разные стратегии планирования транзакций, что иллюстрирует таблицы ниже.
а)
SOF | Изохронные транзакции | Транзакции прерываний | Транзакции управления | Транзакции передач массивов | Свободное время |
б)
SOF | Непереодические транзакции (Т1) | Переодические транзакции | Непереодические транзакци |
В)
SOF | Непереодические транзакци | Переодические транзакции |