Транзакции
Из пакетов строятся транзакции. Транзакция - это логическая единица обмена данными. Транзакции, как и пакеты, имеют структуру и находятся на более высокой степени абстракции. Транзакции совершаются в рамках временных окон, о которых уже говорилось. Каждая транзакция должна начинаться и завершаться в рамках единственного окна и недопустимо, чтобы транзакция началась в одном временном окне и закончилась в другом. Напомним, что начало временного окна отмечается пакетом SOF и завершается особым состоянием шины EOF.
Существует 4 типа транзакций: прерывания, массовой передачи, изохронных передач, и управления. Сообщалось о каналах, связывающих конечную точку с хостом. Поток транзакций и составляет канал. Транзакции для различных типов передач имеют протокольные различия, обусловленные гарантированием или не гарантированием пропускной способности, времени отклика, надежности доставки и синхронизации ввода и вывода. К примеру, транзакции изохронных передач, гарантируют скорость обмена, но не обеспечивают надежности доставки. При приеме поврежденных пакетов, повторная передача поврежденного пакета не осуществляется, в то время как транзакции прерываний, обеспечивают гарантированное время реакции USB устройства на запрос хоста, но не предназначены для передачи больших объемов данных.
Рассмотрим транзакцию прерывания чтения. Любая транзакция инициируется хостом, посредством передачи пакета маркера IN, который ранее описывался. Пакет маркера описывает тип транзакции, адрес USB устройства, номер конечной точки. Адрес распознается USB устройством, и оно возвращает пакет данных. Затем хост отвечает квитированием. В транзакции прерывания может быть только один пакет данных. Для передачи нескольких пакетов используются дополнительные транзакции. Пакет маркера защищен от искажений, и если USB устройство будет принят искаженный пакет маркера, USB устройство выдерживает тайм-аут, сигнализируя хосту о необходимости повторной передачи маркерного пакета. В случае не готовности данных для передачи, посылается пакет NAK. Типичное USB устройство распознав принятый от хоста пакет IN, заполняет буфер конечной точки данными и изменив значение некоторого флага, запускает отправку содержимого буфера хосту. Но до тех пор пока данные не отправлены, SIE автоматически посылает пакеты NAK хосту. Если USB устройству требуется значительное время на ожидание готовности данных, то пропускная способность шины будет расходоваться впустую, на прием потока пакетов квитирования. В этом случае микропрограммное обеспечение USB устройства переводит конечную точку в блокированное состояние. В блокированном состоянии конечная точка на пакет IN от хоста, отвечает пакетом квитирования STALL. Приняв этот пакет, хост узнает, что конечная точка находится в блокированном состоянии. Этим пакетом сообщается хосту о необходимости длительного ожидания. Если пакет данных, переданный USB устройством, принят хостом с искажениями, то хост выдерживает тайм-аут, сигнализируя USB устройству о необходимости повторной передачи. Рисунок поясняет сказанное.
В транзакции прерывания записи, хост посылает пакет маркера OUT транзакции записи и пакет данных. В случае искажения маркерного пакета или пакета данных, переданных хостом, USB устройство выдерживает тайм аут, свидетельствуя об ошибке. При успешном принятии данных, USB устройство возвращает пакет положительного квитирования ACK. Если буфер еще не пуст, возвращается NAK.
Логика транзакций массовой передачи данных (bulk) аналогична рассмотренной выше транзакции прерывания. Понятно, что для транзакций массовой передачи используется свой маркерный пакет. Отличия в основном касаются планирования транзакций массовой передачи хостом. Проще говоря, транзакции массовой передачи посылаются в последнюю очередь.
Транзакции изохронной передачи устроены совсем просто, хост посылает маркерный пакет, затем принимает или посылает пакет данных. Пакеты квитирования не используются, искаженные пакеты просто отбрасываются.
Рисунок 9 |
.
|