PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Шина IEEE 1394 — FireWire

Пакеты асинхронных транзакций

Пакеты запросов и ответов асинхронных передач для различных транзакций имеют форматы. Пакет состоит из заголовка и необя зательно блока данных. Ниже перечислено назначение полей, используемых в заголовках пакетов различных типов:

  • 64-битный адрес назначения (состоящий из полей destination_ID (10-битный номер шины и 6-битный номер узла) и destination_Offset (48-битный адрес в пространстве целевого узла);
  • метка транзакции tl (Transaction Label, 6 бит), с помощью которой запросчик определяет, к какому его запросу относится полученный ответ. Если метка используется, то ответчик помещает в пакет ответа метку, полученную запросчиком (аналогично тегам на PCI-X);
  • код повтора rt (Retry Code, 2 бита), по которому определяется, является ли данный пакет первой попыткой транзакции; для повторной попытки значение поля задается в зависимости от кода квитирования, полученного от целевого устройства: rt = 00 — первая попытка, rt = 01 — Retry_x, rt = 10 — Retry_A, rt = 11 — Retry_B;
  • поле типа транзакции (субакции) tcode (4 бита), определяющий назначение пакета и его формат в соответствии с табл. 18.2;
  • поле приоритета pri (Priority, 4 бита, используется только для кросс-шины), в кабельных сетях не используется;
  • поле rcode (4 бита) содержит код результата выполнения операции;
  • поле data_length (16 бит) содержит длину блока (в байтах);
  • поле расширенного кода транзакции extended_tcode (16 бит) уточняет выполняемую операцию (используется не для всех операций);
  • проверочный код header_CRC контролирует целостность заголовка.

Блок данных data_block, следующий за заголовком, и его проверочный код data_CRC присутствуют в пакетах с tcode = 1, 7, 9, A. Блок содержит целое число квадлетов; при необходимости остаток последнего квадлета заполняется нулями. Максимальный размер блока определяется скоростью передачи.

Таблица. Типы пакетов асинхронных транзакций

tcode Транзакция (субакция)
0 Запрос записи квадлета данных (Write Request)
1 Запрос записи блока данных (Write Request)
2 Ответ записи (Write Response)
3, C, D, F Резерв
4 Запрос чтения квадлета данных (Read Request)
5 Запрос чтения блока данных (Read Request)
6 Ответ чтения квадлета данных (Read Response)
7 Ответ чтения блока данных (Read Response)
8 Начало цикла (Cycle Start)
9 Запрос блокированной транзакции (Lock Request)
A Пакет асинхронного потока (Asynchronous Streaming Packet)
B Ответ блокированной транзакции (Lock Response)
E Не стандартизован

Допустимый размер блока данных, передаваемых в одном пакете, зависит от скорости (см. следующую таблицу).

Таблица. Допустимый размер блока данных пакета

Скорость Максимальный размер для асинхронных передач, байт Максимальный размер для изохронных передач, байт
S100 512 1024
S200 1024 2048
S400 2048 4096
S800 4096 8192
S1600 4096 16384
S3200 4096 32768

 

Таблица. Коды результата выполнения

rcode Результат
0 resp_comlete, успешное выполнение запроса
1-3 резерв
4 resp_conflict_error, отвечающий агент обнаружил конфликт ресурсов (запрос можно повторить позже)
5 resp_data_error, аппаратная ошибка, данные недоступны
6 resp_type_error, недопустимое значение полей в пакете запроса
7 resp_address_error, указанные адрес недоступен
8...Fh резерв

Пакет квитирования имеет длину всего 1 байт (cм. следующий рисунок), в нем содержится 4-битный код квитирования ack_code (см. следующую таблицу), достоверность которого проверяется по его двоичному дополнению ack_parity.

 

Таблица. Коды квитирования

ack_code Имя Значение
0 Резерв Резерв
1 ack_complete Пакет успешно принят. Если это квитанция пакета запроса, то пакет ответа не предполагается
2 ack_pending Пакет запроса успешно принят, пакет ответа будет послан (для пакетов ответа не используется)
3 Резерв Резерв
4 ack_busy_x Пакет не принят из-за занятости узла (возможен успех при повторной попытке)
5 ack_busy_A Пакет не принят из-за занятости узла. Данные будут приняты при следующем повторе (фаза A), когда узел освободится
6 ack_busy_B Пакет не принят из-за занятости узла. Данные будут приняты при следующем повторе (фаза В), когда узел освободится
7-Ah Резерв Резерв
Bh ack_tardy Пакет не принят из-за неготовности узла, находящегося в состоянии standby; попытку можно повторить через некоторое время (1394a)
Ch ack_conflict_error Пакет не принят из-за конфликта ресурсов (1394a)
Dh ack_data_error Пакет не принят из-за ошибки данных (CRC или несоответствие длины пакета заявленной)
Eh ack_type_error Пакет не принят из-за недопустимого типа (неверные параметры, неподдерживаемый тип транзакции)
Fh ack_address_error Пакет не принят из-за недоступности указанного адреса (Dest_Offset) в целевом узле(1394a)

 

Обработка ошибок и механизм повторов


Успешному выполнению асинхронных транзакций может помешать ряд причин:

  • занятость целевого узла (заполнение его входных и выходных очередей);
  • заблокированность целевого узла (он находится в процессе выполнения блокированной транзакции от другого узла);
  • ошибки при передаче пакетов.

Уровень транзакций предоставляет драйверам надежные сервисы, уведомляющие драйвер об успехе или неуспехе транзакции. Однако средства IEEE 1394 (уровень транзакций) обеспечивают автоматические повторы только для случая занятости целевого узла.

 

ПОСТОВОЙ: Советую обратить внимание на бесплатный видеокурс по Windows 7. Всё по делу и ничего лишнего.