Шина IEEE 1394 — FireWire

Арбитраж и распределение времени шины IEEE 1394

Общая информация

Арбитраж определяет, какому из узлов, запрашивающих передачу, предоставляется это право. Арбитраж обеспечивает гарантированную пропускную способность для изохронных передач и справедливое предоставление доступа узлам для асинхронных транзакций. Арбитраж на шине IEEE 1394 выполняется перед посылкой любого пакета запроса (синхронного или изохронного) или ответа. Исключением является соединенная (concatenated) форма выполнения транзакций. Пакеты квитирования посылаются без арбитража — право на их передачу разыгрывать не надо, поскольку квитанцию посылает только тот единственный узел, к которому адресовался подтверждаемый пакет запроса или ответа.

Арбитражем занимается физический уровень каждого узла шины. Арбитраж выполняется распределенно иерархически: им занимаются все узлы, «верховным» арбитром является корневой узел (root node), автоматически выбираемый на этапе конфигурирования шины.

Физический уровень (PHY) предоставляет канальному уровню (LINK) следующие сервисы арбитража, перечисленные в порядке нарастания приоритетности:

  • справедливый арбитраж (fair arbitration service), используемый для передачи обычных асинхронных пакетов;
  • приоритетный арбитраж (priority arbitration service), используемый для передачи пакетов начала цикла и приоритетных асинхронных пакетов;
  • немедленный арбитраж (immediate arbitration service), используемый для передачи пакетов квитирования;
  • изохронный арбитраж (isochronous arbitration service), используемый для передачи изохронных пакетов.

Приоритет в арбитраже на шине IEEE 1394 определяется длительностью зазора арбитража (arbitration gap) — временем, в течение которого узел наблюдает покой шины перед началом передачи запроса арбитража. Чем меньше этот зазор, тем больше шансов у узла получить право на передачу. Исходная схема арбитража 1394 усовершенствовалась дважды: в 1394a были введены механизмы ускоренного арбитража, а в 1394b с его дуплексными соединениями был введен новый механизм — BOSS-арбитраж. Все усовершенствования направлены на снижение непродуктивных затрат времени.

Если на шине используются изохронные передачи, то все транзакции организуются в последовательность циклов — интервалов времени с номинальной длительностью 125 мкс. Начало каждого цикла отмечается широковещательным пакетом начала цикла (Cycle Start). Эти пакеты посылает узел, являющийся мастером циклов. Право на передачу этого пакета мастер получает через арбитраж, используя высокий приоритет. Организация циклов представлена на рисунке, где изображена работа двух изохронных каналов (Ch#J и Ch#K) и передача асинхронных пакетов A и B. После пакета начала цикла каждый узел, которому выделены изохронные каналы, имеет право передать по одному пакету для каждого канала (до прихода следующего пакета начала цикла). Для изохронных передач используется короткий зазор арбитража, так что асинхронные транзакции, использующие более длинный зазор, в изохронную часть цикла вклиниться не могут. После того как иссякнут изохронные пакеты данного цикла, выполняются асинхронные передачи, у которых для арбитража используются более длинные зазоры. Когда наступает пора посылки следующего пакета начала цикла, мастер цикла, дождавшись освобождения шины, снова получает право доступа (пользуясь своим приоритетом, обусловленным его положением в корне дерева) и посылает следующий пакет начала цикла. Таким образом, длительность цикла может отклоняться от номинального значения 125 мкс. Отклонения длительности цикла от номинального не страшны, поскольку пакет начала цикла несет значение системного времени точно на момент фактической передачи этого пакета.

Если на шине не используются изохронные передачи, то мастер циклов может отсутствовать и пакетов начала цикла на шине не будет. В этом случае все время на шине может заполняться асинхронными передачами с их длинными зазорами арбитража.

Базовый механизм арбитража

Узел, желающий передать пакет, посылает вверх по дереву сигнал запроса арбитража TX_REQUEST. Узел имеет право на передачу пакета запроса или ответа, когда он получит «сверху» сигнал предоставления RX_GRANT. Если несколько узлов запрашивают шину одновременно, то доступ получит то устройство, которое пошлет сигнал арбитража раньше. Запрос арбитража узел имеет право послать, лишь наблюдая состояние покоя шины (Bus Idle) в течение некоторого промежутка времени — зазора арбитража. Таким образом, более приоритетным окажется узел, использующий для задержки запроса арбитража меньшее значение зазора и находящийся ближе к корню — его запрос дойдет быстрее. В связи с этим мастер циклов должен находится в корне дерева, чтобы иметь приоритет посылки пакетов начала цикла по отношению к асинхронным пакетам других узлов. Для шины IEEE 1394 различают две длительности зазора:

  • изохронный зазор (Isochronous gap), длительность которого лежит в пределах 40–50 нс;
  • зазор асинхронных транзакций (subaction gap) — более длительный (0,3–10,6 мкс), величина которого подбирается так, чтобы не слишком затягивать арбитраж и не конфликтовать с задержками посылок пакетов квитирования. Длительность зазора должна быть не меньше, чем время оборота по шине для самой удаленной друг от друга пары узлов.

Немедленный и изохронный арбитраж используют одинаковую (самую маленькую) длительность зазора — 40–50 нс. Однако это не вызывает проблем с приоритетом изохронных пакетов: немедленный арбитраж выполняется только для пакетовквитанций, которыми узлы отвечают только на асинхронные пакеты запросов-ответов. Пакеты запросов-ответов требуют приоритетного или справедливого арбитража, так что они могут передаваться только после всех изохронных пакетов данного цикла. Следовательно, немедленный арбитраж никогда не происходит в изохронной части цикла.

Справедливый арбитраж для асинхронных передач предохраняет шину и ее узлы от возможных перегрузок. Для этого на шине устанавливается интервал справедливости (fairness interval) — период времени, в течение которого узел имеет право выполнить лишь одну субакцию — послать один асинхронный пакет запроса или ответа. Длительность интервала справедливости зависит от числа активных узлов (у которых включен уровень LINK) и от загруженности шины изохронным трафиком. Справедливость обеспечивает PHY, у которого имеется специальный бит разрешения арбитража. Физический уровень будет посылать запрос арбитража только при установленном бите разрешения. Этот бит изначально устанавливается после самоидентификации устройств. Далее, как только физический уровень (по запросу от канального) посылает запрос арбитража, бит сбрасывается. Повторно он установится только после того, как PHY будет видеть шину в покое в течение интервала arb_reset_gap — зазора сброса арбитража (по умолчанию 21 мкс). Этот интервал гораздо больше изохронного и асинхронного зазора; такое длительное «молчание» всех устройств означает, что у них больше нет асинхронных пакетов, разрешенных к передаче в этом интервале справедливости. Таким образом, интервал справедливости — это время между соседними зазорами сброса арбитража, и его длительность неопределенна (см. рисунок).

Усовершенствование арбитража в IEEE 1394a

Простота механизма арбитража оборачивается бесполезным расходованием времени на зазоры. Эти расходы снижают эффективную пропускную способность шины, особенно для коротких пакетов и пакетов, передаваемых на высокой скорости. Для скорости S100 на пакетах максимального размера эффективность использования шины составляет 80%, на коротких (64 байта данных) эффективность падает до 20%. При скорости S400 на длинных пакетах эффективность снижается до 50%, а на коротких — до 10%. В IEEE 1394a введен приоритетный арбитраж и ускоренные механизмы, сокращающие издержки времени на выжидание интервалов зазоров.

Приоритетный арбитраж (в IEEE 1394a) позволяет узлу за один интервал справедливости передать более одного асинхронного запроса. Число запросов, разрешенных узлу за один интервал, определяется полем pri_req его регистра FAIRNESS_BUDGET (смещение 218h в пространстве регистров CSR, другое имя того же регистра — PRIORITY_BUDGET, формат приведен на рисунке). Значение этого поля заносит диспетчер шины исходя из числа узлов и их потребностей, которые они сообщают в поле pri_max своих регистров. Диспетчер назначает узлам значения pri_req, так чтобы их сумма не превышала 63–N, где N — число узлов на шине.

Механизмы ускорения позволяют посылать пакеты запросов и ответов «с оказией», без задержек арбитража. Ускорения позволяют узлам, находящимся дальше от корня, обогнать в арбитраже более близкие к корню узлы, находящиеся в более выгодном положении. Однако и при использовании механизмов ускорения должен соблюдаться интервал справедливости. Ускорения используются узлами с «умным» PHY, способным анализировать пакеты. Ускорения могут быть реализованы двумя способами:

  • используя ускоренный арбитраж, основанный на пакетах квитирования (ackaccelerated). Здесь возможны два варианта:
  1. узел, отвечающий пакетом квитирования на какой-либо запрос (ответ), может послать свой асинхронный пакет запроса (ответа) вслед за пакетом-квитанцией, отделяя его лишь префиксом данных. Таким образом производится соединение (конкатенация) двух пакетов;
  2. узел, желающий послать пакет запроса или ответа, дожидается прохождения пакета-квитанции и с коротким зазором (40 нс, как у изохронного арбитража) посылает запрос арбитража. При этом он опередит обычный узел, который в этом случае будет выдерживать нормальный асинхронный зазор.
  • Арбитраж «на лету» (Fly-by) позволяет узлу присоединять свой пакет запроса к пакету, транслируемому им в сторону корня и не требующему квитирования (то есть к изохронным пакетам и квитанциям). При этом нельзя присоединять пакет, передаваемый на скорости S100, к пакетам, идущим на более высокой скорости (S100 передается без сигнализации о скорости, так что устройства 1394 будут ошибочно пытаться принять этот пакет на скорости пакета-«носителя»).

Во время исполнения ускоренного арбитража корневой узел не имеет возможности захватить шину. Если он работает мастером циклов (необходимым для изохронного обмена), то он может не суметь вовремя передать пакет начала цикла. Чтобы этого не происходило, узлы с ускоренным арбитражем должны иметь регистры CYCLE_TIME и запрещать ускоренный арбитраж близко к ожидаемой границе цикла, пока не получат очередной пакет начала цикла.

 

В бета-режиме IEEE 1394b введен новый метод арбитража — BOSS (Bus Owner/Supervisor/Selector), предназначенный как для чистых B-шин, все узлы которых работают в бета-режиме, так и для гибридных шин, часть узлов которых работает с традиционной DS-сигнализацией. Метод BOSS позволяет передавать запросы на право передачи во время передачи пакетов, что обеспечивает конвейеризацию работы шины и сокращает ее простои.

BOSS-арбитраж в чистой B-шине

Метод BOSS использует возможность полнодуплексного обмена каждой пары соединенных узлов, которая имеется только в бета-режиме. В этом режиме запросы на управление шиной посылаются по передающей линии; запросы представляют собой специальные 10-битные символы, отличимые от символов кодов данных. Узел может посылать запросы в любые свои порты, не занятые передачей данных. По логике работы повторителей многопортовых узлов оказывается, что к узлу, ведущему передачу данных, сигнальные пути от всех других узлов шины свободны. Исходя из этого узлу, ведущему передачу последнего пакета субакции, логично стать «боссом» (BOSS) — принимать решение о том, какому из узлов предоставить право следующей передачи. Роль «босса» передается между PHY узлов шины по следующим правилам:

  • данный PHY станет «боссом», если он является источником пакета. По этому признаку боссом станет узел, посылающий пакет квитирования или пакет ответа физического уровня;
  • данный PHY станет «боссом», когда он явно или неявно получает право передачи. Явное получение права — прием символа GRANT или GRANT_ISOCH в качестве признака завершения пакета или в ответ на запрос арбитража. Неявное получение права происходит, когда принимающий PHY может самостоятельно определить, что субакция завершена (шина находится в изохронном интервале или последний пакет был пакетом квитирования в асинхронном интервале);
  • корневой узел берет на себя роль «босса» после длительного отсутствия активности на шине (из-за потери пакета квитирования или иной ошибки);
  • PHY перестает быть «боссом» по приему пакета, а также когда он явно или неявно предоставляет право передачи другому узлу.

Вместо интервалов покоя, используемых в традиционном механизме арбитража для обозначения завершения фазы самоидентификации при конфигурировании, завершения изохронного интервала, завершения субакции и границы интервала справедливости, в бета-режиме используются маркеры. Маркер (token) — это специальный управляющий символ, передаваемый «боссом» в течение времени, достаточного для его обнаружения по всей шине. Маркер может передаваться, когда шина находится в покое или когда она удерживается в занятом состоянии потоком символов DATA_NULL (маркеры встраиваются в этот поток).

Как и в традиционном режиме, передача пакетов ведется в двух интервалах — изохронном и асинхронном. Изохронный интервал начинается, когда мастер циклов передает маркер CYCLE_START_EVEN/ODD и пакет начала цикла. Заканчивается изохронный интервал, когда текущий «босс» не имеет относящегося к текущей фазе изохронного запроса от своего LINK-уровня или от какого-либо активного порта, работающего в бета-режиме. В этом случае «босс» передает маркер ASYNC_EVEN или ASYNC_ODD, означающий начало асинхронного интервала. Переход шины в состояние нормальной работы после самоидентификации происходит по маркеру ASYNC_EVEN, который передается корневым узлом после передачи его пакетов самоидентификации.

Асинхронный период (время, не занятое под изохронные интервалы), делится на интервалы справедливости. Граница интервала справедливости отмечается маркером ASYNC_EVEN (начало четного интервала справедливости) или ASYNC_ODD (начало нечетного интервала справедливости), отличающимся от предыдущего асинхронного маркера. Четные и нечетные интервалы чередуются. Возможно, что маркер ASYNC_EVEN/ODD одновременно будет означать и завершение изохронного интервала, и начало нового интервала справедливости. Для повышения устойчивости шины к потере маркера корневой узел, обнаружив покой шины, непрерывно посылает маркеры ASYNC_EVEN/ODD.

Передача запросов в виде символов позволяет осуществлять их приоритезацию и конвейеризацию, введя множество типов запросов и фаз шины. Изохронные и асинхронные интервалы делятся на свои четные (even) и нечетные (odd) фазы, чередующиеся независимо друг от друга. Изохронные фазы меняются по концу каждого изохронного интервала цикла (по маркеру ASYNC_EVEN/ODD). Асинхронные фазы меняются на границе каждого интервала справедливости, в соответствии с маркером ASYNC_EVEN/ODD. После сброса изохронные и асинхронные фазы считаются четными.

Запросы арбитража могут предназначаться как для текущей фазы, так и для последующей (противоположной), что является конвейеризацией запросов. PHY бета-узла посылает «боссу» изохронные и асинхронные запросы с наивысшим приоритетом, полученные от своего LINK-уровня или от других бета-портов. Приоритетность зависит от текущего интервала шины и фазы.

Вслед за передачей последнего пакета субакции текущий «босс» передает право на передачу для запроса, наиболее приоритетного для данного интервала и фазы. Если к этому времени «босс» не принял запросов, относящихся к данной фазе, он передачей одного или более маркеров меняет интервал (с изохронного на асинхронный) и/или фазу асинхронного интервала:

  • если шина находится в изохронном интервале и нет изохронного запроса к текущей фазе, то «босс» завершает изохронный интервал маркером ASYNC_EVEN/ODD, не меняя текущей асинхронной фазы;
  • если шина находится в асинхронном интервале и нет запроса к текущей фазе, то «босс» маркером ASYNC_EVEN/ODD меняет текущую асинхронную фазу (начинается новый интервал справедливости);
  • если и для новой асинхронной фазы нет запросов, то «босс» передает управление шиной узлу, стоящему выше него по иерархии. В конце концов, управление (роль «босса») получит корневой узел. Асинхронная фаза не будет сменяться другой до тех пор, пока в текущей фазе не будет передан хотя бы один пакет.

В асинхронном интервале узел может послать запрос для текущей фазы, только если он имеет бюджет приоритета для текущего интервала справедливости. Если бюджет исчерпан, то узел может послать запрос для следующей фазы, на который право передачи будет дано в следующем интервале справедливости. Таким образом, сменой фаз осуществляется справедливый арбитраж без потерь времени на зазоры. Асинхронные фазы меняются только тогда, когда все узлы, имеющие пакеты для передачи в данной фазе, выполнят эти передачи.

Арбитраж в гибридной шине

В гибридной шине, состоящей из бета-узлов и традиционных узлов с DS-сигнализацией, новый механизм арбитража обеспечивает совместимость устройств, правда, с применением зазоров. Гибридная шина состоит из B-облаков (одного или нескольких), между которыми находятся фрагменты с DS-сигнализацией. При этом корневой узел может оказаться как в B-облаке, так и в DS-фрагменте.

В каждом B-облаке имеется один старший пограничный узел (senior border PHY): это последний узел, передающий в облако пакет самоидентификации без кода скорости. Старший пограничный узел облака, содержащего корневой узел, называется прокси-корнем. Этот узел будет работать дежурным арбитром, пока другие узлы не играют роль «босса». Если корнем является традиционный узел, то прокси-корня нет. P-порт старшего пограничного узла (если он не является прокси-корнем) всегда является DS-портом.

Старший пограничный узел в каждом B-облаке наблюдает за традиционными зазорами арбитража, и только он имеет право посылать асинхронные маркеры. Обнаружив зазор асинхронных транзакций, он посылает асинхронные маркеры без смены фазы. Маркер со сменой фазы он посылает, обнаружив зазор сброса арбитража. В состоянии покоя шины он посылает маркеры текущей фазы.

В ответ на запрос от B-порта старший пограничный узел начинает процедуру арбитража, используя традиционный механизм зазоров. Если старший пограничный узел является прокси-корнем, то он предоставляет право передачи B-узлу. Если старший пограничный узел не является прокси-корнем, то он посылает запрос арбитража через свой p-порт. Выиграв традиционный арбитраж, он выполняет B-арбитраж, и начинается передача бета-трафика. Как только в B-облаке начинается бета-передача, в нем включается механизм BOSS-арбитража, и этот механизм будет работать до тех пор, пока не завершится субакция и в облаке не закончатся запросы для текущей фазы.

В период передачи трафика B-облака старший пограничный узел должен обеспечить видимость занятости шины для всех узлов остальной части шины. Пакеты, передаваемые в традиционном формате, пограничный узел транслирует нормальным образом (заменяя пакет префиксом данных, если пакет передается на недопустимо высокой скорости). Пакеты бета-формата пограничный узел транслировать из облака не может, вместо них он передает префикс данных до тех пор, пока к нему не придет пакет традиционного формата. Чтобы эта передача префикса закончилась, «босс» по окончании субакции и при отсутствии запросов текущей фазы должен послать пакет традиционного формата с нулевой длиной данных.

В конце передачи бета-трафика текущий «босс» не посылает никаких маркеров, а передает право управления вышестоящему узлу. Таким образом это право достигнет старшего пограничника, который начнет формирование интервала покоя шины.

В гибридной шине маркер CYCLE_START может быть только в облаке, в котором находится мастер цикла. Это облако называется старшим B-облаком (senior B cloud). Такового может и не быть, поскольку мастер циклов может оказаться и в традиционном фрагменте шины. Остальные B-облака называются младшими (junior B cloud). Поскольку маркеры по традиционному фрагменту распространяться не могут, воспроизведение маркеров начала цикла в младших облаках проблематично. PHY узлов младшего облака узнают о начале изохронного периода от своего LINK-уровня. Поскольку информации о номере фазы у узлов младшего облака нет, изохронная транзакция запрашивается сигналом (символом) ISOCH_CURRENT. Этот запрос достигает старшего пограничного узла, который выполняет немедленный арбитраж в традиционном фрагменте шины. Запросы ISOCH_EVEN/ODD в младшем облаке не фигурируют.

Пограничный узел принимает традиционные запросы арбитража (сигналом TX_REQUEST) и преобразует их в символ запроса LEGACY_REQUEST, посылаемый в свой p-порт. Остальные свои порты он блокирует посылкой в них символа DATA_NULL. Если арбитраж выигран, то узел получит символ GRANT или GRANT_ISOCH; если проигран — DATA_PREFIX или DATA_NULL.

Яндекс.Метрика