Все о подвале своими руками. Сдать теорию после лишения возврат прав после лишения.
Конфигурирование шины IEEE 1394 выполняется в различных ситуациях:
Конфигурирование состоит из трех последовательных этапов.
Конфигурирование шины приводит ее в состояние, пригодное для передачи полезного трафика. Конфигурирование шины осуществляется исключительно аппаратными средствами PHY-уровня каждого узла (LINK-уровень конфигурируемых узлов может быть и отключен). Программные средства в этом процессе не участвуют. Благодаря чисто аппаратной реализации автоконфигурирование производится настолько быстро, что возможно сохранение непрерывности изохронных потоков.
В первоначальной версии шины самое большое время во всей процедуре конфигурирования занимал сброс. В физический уровень 1394 вносились усовершенствования, направленные на минимизацию потерь времени при сбросе. Остальные этапы конфигурирования происходят быстрее, но в случае образования петлевого соединения идентификация дерева никогда не закончится. Эта ситуация обнаруживается любым узлом, и сообщение о ней доводится до пользователя. В 1394b приняты меры по автоматическому исключению петлевых соединений.
Свойства любого узла сконфигурированной шины наблюдаемы и управляемы через его архитектурные регистры и память конфигурации. Они доступны со стороны шины через асинхронные транзакции к определенным адресам. Архитектурные регистры определяют поведение узла на шине. Память конфигурации раскрывает «прикладную ценность» узла и обеспечивает его уникальную идентификацию, не зависящую от непостоянного физического идентификатора.
Сброс шины приводит к ряду эффектов:
Сброс шины может быть вызван любым устройством. Сброс распространяется всеми узлами беспрепятственно, поскольку его сигнал по праву доминирования единиц превалирует над всеми другими сигналами. После сигнала сброса, длительность которого Treset = 167 мкс (или 1,4 мкс — короткий сброс, см. ниже), узлы выдерживают паузу Twait = 0,16 мкс, после чего начинается процесс идентификации дерева.
Сигнал сброса вырабатывается по ряду причин:
В случае изменения топологии сброс вырабатывается по крайней мере два раза подряд. Первый раз его сигнализирует узел-новичок, подключаемый к шине. Второй раз сброс подаст узел, к которому он подключился, поскольку он обнаружит изменение состояния порта. Два сброса подряд — это сигнал к установке стандартного зазора арбитража (gap_cnt=63); новое оптимальное значение зазора должно определяться по новой топологии.
При подключении/отключении устройств в разъемах возникает дребезг контактов — серия замыканий и размыканий, которая может длиться десятки и сотни миллисекунд. В 1394 это порождает так называемый шторм сбросов, что парализует работу шины на длительное время (сотни миллисекунд). В 1394a эту проблему решили введением защиты от дребезга: узел посылает сброс по обнаружении смены состояний не сразу, а через 330–350 мс (когда дребезг закончится).
Соединяемые узлы воспринимают факт смены состояния не одновременно — разница в моментах определения изменения может составлять десятки миллисекунд (они проверяют замыкание разных цепей). В 1394a приняты меры, чтобы устройство, определившее факт смены позднее, не давало лишнего сброса. Порт, который во время выжидания интервала защиты от дребезга обнаружил сигнал сброса (от более быстрого устройства), должен прекратить выжидание и начать трансляцию сигнала сброса.
Из-за особенностей интерфейса PHY–LINK сигнал сброса должен быть весьма длительным, чтобы уведомление о нем получили LINK-уровни всех узлов. Сигнал сброса приходит в любой момент времени. В узле, ведущем передачу пакета, интерфейсом PHY–LINK владеет LINK. Таким образом, PHY не имеет возможности сигнализировать LINK’у о сбросе, пока передача пакета не будет завершена. Из-за этого длительность сигнала сброса должна быть больше длительности максимального пакета, поэтому принято Treset = 166,7 мкс. Поскольку во время сброса трафик по шине передаваться не может, такой длинный сброс приводит к потерям изохронных данных (может быть потерян целый 125-микросекундный цикл шины). В 1394a эту проблему решили, введя новый вариант сброса — короткий сброс (Short Bus Reset) длительностью 1,3–1,4 мкс. Короткий сброс узел может подать, только выиграв арбитраж (Arbitrated Bus Reset), — это гарантия того, что ни один узел в это время не передает пакет. Однако применение короткого сброса имеет свою специфику:
Три различных варианта сброса шины по факту подключения узла приведены на рисунке. Из диаграммы видно, как усовершенствование механизма сброса позволяет сократить время простоя шины с сотен миллисекунд (1394) до 167 мкс (1394a) и даже до 1,56 мкс (короткий сброс в 1394a).
Во время идентификации дерева узлы выстраиваются в иерархическую структуру и выбирается корень шины. Для узлов идентификация дерева сводится к определению статуса активных портов: присвоение им типов: c-порт (к которому подключен дочерний узел) или p-порт (которым он подключается к родительскому). Этап идентификации дерева начинается после сброса. Для идентификации используется сигнализация арбитража.
В начале идентификации дочерние узлы ищут своих родителей, посылая им сигнал уведомления Parent_Notify, а родители признают свои дочерние узлы сигналом Child_Notify. Сигнал Parent_Notify безусловно посылают узлы-листья (имеющие всего по одному порту). Узлы-ветви могут послать сигнал Parent_Notify только на один из своих портов, при условии, что на все остальные активные порты пришли аналогичные сигналы. При этом порты, на которые пришел сигнал Parent_Notify, помечаются как c-порты. На эти порты посылается уведомление Child_Notify, но не раньше, чем когда сигнал Parent_Notify будет обнаружен на всех активных портах, кроме одного. Порт, на который пришел сигнал Child_Notify, помечается как p-порт; он перестает посылать сигнал Parent_Notify, что является подтверждением приема сигнала Child_Notify.
Узел, у которого на все порты приходят сигналы Parent_Notify, становится корнем. Все его порты становятся c-портами. Он посылает на эти порты сигнал Child_Notify, а получив подтверждение (снятые сигналы Parent_Notify), и сам прекращает подавать сигналы Child_Notify. На этом идентификация дерева заканчивается, и шина переходит к этапу самоидентификации узлов.
Возможна ситуация, когда два соединенных узла пытаются друг в друге найти своих родителей, посылая сигнал Parent_Notify. При этом столкновение данных сигналов приводит к приему каждым портом состояния Root_Contention — признака состязания за роль корня. В этом случае оба узла перестают подавать сигнал на эти порты и через случайный интервал проверяют их состояние. Узел, обнаруживший состояние покоя на данном порте, посылает сигнал Parent_Notify. Узел, обнаруживший этот сигнал, посылает сигнал Child_Notify и становится корнем. В начале состязания каждый узел случайным образом устанавливает для себя время задержки из двух вариантов:
Тот узел, который окажется быстрее, корнем не станет (он раньше начнет искать родителя). Если оба участника выберут одинаковое время, то они опять столкнутся и повторят состязание с новыми значениями задержки.
На том, что в состязании за роль корня побеждает самый медленный участник, построен механизм принудительного назначения корня. У каждого PHY есть бит RHB, единица в котором заставляет этот узел задерживать подачу сигнала поиска родителей на 83–167 мкс от начала идентификации дерева. Специальный пакет физического конфигурирования позволяет установить этот бит у заданного узла и сбросить у всех остальных, что обеспечит победу данному узлу в последующих выборах корня по ближайшему сигналу сброса. Если вдруг окажется, что бит RHB установлен у нескольких узлов, то они разыграют право стать корнем по вышеописанному правилу случайных состязаний.
На рисунке приведены пошаговые сценарии роста дерева, на каждом шаге определяется очередной уровень иерархии узлов. Стрелками на рисунке обозначены сигналы Parent_Notify, определяющие роли портов и узлов. На рисунке изображены три различных пошаговых сценария вырастания дерева:
В случае образования петли процесс идентификации дерева «зависает». Эта ситуация выявляется по срабатывании тайм-аута арбитража (167 мкс); она сигнализируется через LINK приложению и пользователю, который должен принять меры к разрыву петли (физическим переключением кабелей). В 1394b приняты меры по автоматической борьбе с петлями путем запрещения работы какого-либо порта по результатам проверки.
На этапе самоидентификации узлы назначают себе уникальные идентификаторы, согласуют скоростные возможности и (не обязательно) выбирают диспетчера изохронных ресурсов. Самоидентификация выполняется под управлением корневого узла, организующего последовательное предоставление прав на самоидентификацию всем узлам сети. Получив это право, узел посылает пакет (или серию пакетов) самоидентификации, которые распространяются по всей шине. Закончив посылку пакетов, узел обменивается со своим родителем информацией о доступной скорости. В результате этого обмена пара соединенных портов становится сконфигурированной. Сконфигурированный порт — это активный порт, для которого установлен его тип (c-порт или p-порт) и согласована скорость.
Промежуточные узлы-ветки и корневой узел организуют передачу права самоидентификации всем узлам по порядку. Порядок, в котором узлы выполняют самоидентификацию, определяется нумерацией портов в промежуточных узлах (ветках и корне). Первым будет самоидентифицироваться конечный узел (лист), который подключен к порту корня с наименьшим номером и путь к которому лежит в узлах-ветках через порты с наименьшими номерами. Этот узел получит PHY_ID=0. Последним идентифицируется корень — он получает наибольший идентификатор.
На следующем рисунке приведены два варианта назначения идентификаторов, соответствующие деревьям, взятым из первого рисунка (а и в).
Право на самоидентификацию получает узел, которому по p-порту приходит сигнал Self_ID_Grant, а все его c-порты (если таковые есть) уже сконфигурированы. В ответ на предназначенный ему Self_ID_Grant узел отвечает передачей (вверх) префикса данных. Когда в ответ на это узел увидит снятие сигнала Self_ID_Grant, он посылает пакет(ы) самоидентификации. Пакет самоидентификации всегда передается на скорости S100. Пакет содержит информацию, описывающую физические свойства узла:
При числе портов более трех узел посылает серию пакетов самоидентификации. Пакеты самоидентификации слышат все узлы, по ним они могут строить карту топологии и карту скоростей. Прослушивая пакеты самоидентификации, узлы определяют диспетчера изохронных ресурсов — им станет узел с максимальным номером PHY_ID, у которого в пакете самоидентификации установлены биты C и L. Завершив передачу пакетов самоидентификации, узел посылает в p-порт сигнал Ident_Done. На это родительский узел отвечает префиксом данных и помечает свой соответствующий c-порт как сконфигурированный. При подаче сигнала Ident_Done узел с помощью смещения уровней сообщает доступную ему скорость работы; его родитель при передаче префикса данных аналогичным образом сообщает свою. Таким образом, на завершающем этапе самоидентификации узла его p-порт и соединенный с ним c-порт родительского узла согласуют и устанавливают максимально возможную скорость обмена друг с другом.
Промежуточный узел-ветка, получивший сверху сигнал Self_ID_Grant, транслирует его на свой несконфигурированный c-порт с наименьшим номером; на остальные порты он посылает префикс данных. Получив префикс данных с c-порта, промежуточный узел прекращает подачу сигнала Self_ID_Grant (вниз) и транслирует префикс данных вверх. Далее, если после прохождения пакета самоидентификации на c-порт приходит сигнал Ident_Done, узел ответит ему префиксом данных с указанием своей скорости и пометит данный порт как сконфигурированный. Когда промежуточный узел, у которого все c-порты сконфигурированы, снова получит сигнал Self_ID_Grant, он сам отправит пакет(ы) самоидентификации (во все активные порты), а затем и сигнал Ident_Done.
Корневой узел посылает сигнал Self_ID_Grant в порт с наименьшим номером из числа активных несконфигурированных. На остальные порты он посылает префикс данных. Как только с порта, на который корень посылает Self_ID_Grant, он получит префикс данных, подача сигнала Self_ID_Grant прекращается. Когда корень обнаружит покой шины (после прохождения пакетов самоидентификации от узла, которому досталось это право), он снова пошлет сигнал Self_ID_Grant, опять же на несконфигурированный порт с наименьшим номером. Если самоидентифицировался узел, подключенный к корню, то корень получит сигнал Ident_Done и пометит данный порт как сконфигурированный. Теперь корень пошлет Self_ID_Grant на следующий порт. Как только все порты перейдут в сконфигурированное состояние, корень пошлет свой пакет самоидентификации, на чем процесс самоидентификации и закончится — шина переходит в фазу нормального арбитража.
Шина IEEE 1394 основана на стандарте ISO/IEC13213, известном под названием «CSR-архитектура», и наследует его основные регистры и структуры данных в памяти конфигурации. Архитектурные регистры CSR занимают первые 512 байт в начальном адресном пространстве узла. Часть регистров CSR-архитектуры в IEEE 1394 не используется, их описание здесь опущено.
Регистр состояния и управления STATE (см. рисунок ниже) доступен для чтения по двум адресам — State_Clear (000h) и State_Set (004h). Некоторые биты доступны лишь для чтения (RO), другие биты допускают программный сброс (записью единиц в биты State_Clear) и аналогичную установку (через регистр State_Set). Назначение полей регистра состояния и управления:
Регистр идентификатора узла NODE_IDS (см. следующий рисунок) содержит поля:
Регистр команды сброса Reset_Start (00Ch) служит для подачи команды сброса (операцией записи), при этом значим только бит nt (no test, бит 31), единица в котором отменяет начальное тестирование узла при сбросе.
Регистры тайм-аута расщепленных транзакций позволяют задать предельное время ожидания ответа на запрос транзакции в пределах 8 с с дискретностью 125 мкс. Начальное значение — 100 мс, по сбросу не изменяется. В младших трех битах SPLIT_TIMEOUT_HI (018h) содержится число секунд, в старших 13 битах SPLIT_TIMEOUT_LO (01Ch) содержится число 125-микросекундных интервалов.
Регистры тестирования (необязательные) служат для запуска теста (TEST_START, 028h), передачи параметров теста (ARGUMENT_HI, 020h, ARGUMENT_LO, 022h) и сообщения состояния выполнения (TEST_STATUS, 02Ch).
Регистры прерываний (необязательные) служат для управления прерываниями, вызываемыми транзакциями записи в регистр INTERRUPT_TARGET (050h). Каждый бит этого регистра соответствует одному из условий (событий) прерывания; самый старший бит соответствует прерыванию с самым высоким приоритетом. Регистр INTERRUPT_MASK позволяет селективно выбирать условия, вызывающие сигнализацию прерывания приложению (процессору) данного узла (единичное значение бита маски разрешает прерывание по данному условию). Прерывания по шине могут посылаться широковещательно (адресуясь к регистру INTERRUPT_TARGET при Dest_ID = 63) или направленно, с указанием в целевом адресе идентификатора требуемого узла.
Регистры синхронизации (Clock_Value, Clock_Tick_Period, Clock_Strobe_Arrived, Clock_Info) в IEEE 1394, как правило, не используются — их функции выполняет регистр CYCLE_TIME).
Регистры сообщений (необязательные) Message_Request, Message_Response служат для передачи и приема широковещательных сообщений, адресованных всем узлам шины или всем блокам узла.