link700 link701 link702 link703 link704 link705 link706 link707 link708 link709 link710 link711 link712 link713 link714 link715 link716 link717 link718 link719 link720 link721 link722 link723 link724 link725 link726 link727 link728 link729 link730 link731 link732 link733 link734 link735 link736 link737 link738 link739 link740 link741 link742 link743 link744 link745 link746 link747 link748 link749 link750 link751 link752 link753 link754 link755 link756 link757 link758 link759 link760 link761 link762 link763 link764 link765 link766 link767 link768 link769 link770 link771 link772 link773 link774 link775 link776 link777 link778 link779 link780 link781 link782 link783 link784 link785 link786 link787 link788 link789 link790 link791 link792 link793 link794 link795 link796 link797 link798 link799 link800 link801 link802 link803 link804 link805 link806 link807 link808 link809 link810 link811 link812 link813 link814 link815 link816 link817 link818 link819 link820 link821 link822 link823 link824 link825 link826 link827 link828 link829 link830 link831 link832 link833 link834 link835 link836 link837 link838 link839

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

Шина IEEE 1394 — FireWire

Контексты изохронной передачи

 

Для передачи изохронных пакетов контроллер может иметь от 4 до 32 контекстов, с каждым из которых связан свой изохронный канал шины. Число контекстов можно определить, записав FFFF FFFF в регистр масок прерываний от контекстов и прочитав его значение: единицы останутся только в битах, соответствующих существующим контекстам. Контексты изохронных передач отличаются от контекстов асинхронных тем, что требуют привязки начала передачи к определенному моменту времени, а также реакции на невозможность своевременной передачи пакета.

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

  • адрес перехода в случае нормальной передачи пакета (branchAddress);
  • адрес пропуска — адрес перехода в случае пропуска цикла (skipAddress). По этому адресу программа переходит в случае, если в данном цикле передача пакета не удалась.

Каждый пакет описывается блоком из 1–8 дескрипторов, в которых используются следующие команды:

  • OUTPUT_MORE — не первая и не последняя команда в блоке, задающая адрес и длину буфера данных, которые следует поместить в собираемый пакет (рис. 1, а). Эта команда используется для помещения блока данных в середину пакета;
  • OUTPUT_MORE-Immediate — первая команда в блоке, используемая для передачи заголовка пакета с ненулевой длиной данных. Буфер (2 квадлета) находится в самом теле дескриптора (рис. 1, б). В команде задается адрес пропуска;
  • OUTPUT_LAST — последняя команда в блоке, задающая адрес и длину буфера данных, которые следует поместить в собираемый пакет, а также адрес перехода или пропуска (рис. 1, в). В дескриптор команды при передаче контроллер помещает состояние контекста и метку времени. Команда используется двояко:
         -----для помещения данных (но не заголовка) из буфера в конец пакета, при этом длина буфера ненулевая и в команде содержится адрес пропуска. В этом случае данной команде должна предшествовать команда OUTPUT_MORE или OUTPUT_MORE-Immediate;
         -----как признак отсутствия пакета для передачи в данном цикле, при этом указывается нулевая длина буфера и в команде содержится адрес перехода. В этом случае команде не должны предшествовать команды OUTPUT_MORE или OUTPUT_MORE-Immediate;
  • OUTPUT_LAST-Immediate — команда, используемая для формирования пакетов с нулевой длиной поля данных; буфер (2 квадлета) находится в самом теле дескриптора (рис. 1, г). Для такого пакета переход в любом случае происходит по одному и тому же адресу. В дескриптор команды при передаче контроллер помещает состояние контекста и метку времени;
  • STORE_VALUE — команда, обеспечивающая программный мониторинг исполнения контекста без использования прерываний. Эта команда может быть введена в начало блока дескрипторов, при ее исполнении контроллер выполняет запись определенного слова данных по указанному адресу в случае успешной отработки блока. В дескрипторе указываются адрес пропуска, адрес записываемых данных и сами данные (рис. 1, д). В случае пропуска цикла (перехода по адресу пропуска) запись данных не производится.

Назначения полей в дескрипторах команд изохронной передачи следующие:

  • cmd — код команды;
  • key — ключ команды (расширение кода);
  • b (branch control) — управление переходом: 0 — для OUTPUT_MORE или OUTPUT_MORE-Immediate , 3 — для OUTPUT_LAST или OUTPUT_LAST -Immediate, 1 и 2 — недопустимо;
  • reqCount — длина буфера (в байтах);
  • dataAddress — адрес буфера данных (нет требования выравнивания) или адрес записи для команды мониторинга;
  • i (interrupt control) — управление прерываниями: 0 — нет прерываний, 1 и 2 — недопустимо, 3 — прерывание при переходе по адресу пропуска;
  • branchAddress — адрес нормального перехода, указывающий на начало следующего блока дескрипторов;
  • skipAddress — адрес перехода по пропуску;
  • Z — длина следующего блока дескрипторов. Нулевая длина является указанием на останов контекстной программы;
  • xferStatus — состояние передачи, в котором содержатся значения младших 16 бит регистра управления контекстом на момент завершения команды;
  • timeStamp — метка времени помещения пакета в FIFO-буфер (3 младших бита second_count и 13 бит cycle_count), устанавливается аппаратно при передаче;
  • S (status control) — признак модификации полей xferStatus и timeStamp, устанавливается контроллером;
  • storeDoublet — младшее слово записываемых данных мониторинга (старшее слово — нулевое).

В контекстной программе должны быть описаны пакеты для каждого цикла. Если для данного цикла нет данных, в контексте должен быть описан пакет нулевой длины (командой OUTPUT_LAST-Immediate). Если канал в каком-то цикле не должен передавать пакет, это описывается единственной командой OUTPUT_LAST с нулевой длиной буфера. Останов контекстной программы происходит при переходе, для которого указан Z = 0.

Для определения цикла, с которого должна активизироваться работа контекста, в управляющем регистре контекста (рис. 2) введены дополнительные поля:

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

Каждая контекстная программа обычно связана со своим изохронным каналом, номер канала присутствует в заголовках передаваемых пакетов (формируется программно).

Пакеты всех контекстов DMA изохронной передачи укладываются в один и тот же буфер FIFO, из которого они выбираются LINK-уровнем для передачи в шину. Пакеты соседних циклов в FIFO отделяются друг от друга специальным разделителем. Контроллер может укладывать пакеты в FIFO с опережением до двух циклов. В каждом цикле шины LINK-уровень из FIFO забирает на передачу пакеты до очередного разделителя, а контроллер DMA укладывает в FIFO очередные пакеты из контекстов. Возможна ситуация, когда за очередной цикл LINK-уровень не может выбрать все пакеты до разделителя. При этом контроллер DMA не может поместить в буфер очередные пакеты — это и есть пропуск цикла. Как правило, такая ситуация возникает из-за сброса шины. Ветвления контекстной программы позволяют отрабатывать эту ситуацию различными способами, как это иллюстрирует рис. 3:

  • пропускать передачи пакета в случае пропуска цикла (контекст A) — адрес пропуска и адрес перехода указывают на один и тот же блок дескрипторов пакета для следующего цикла;
  • настойчиво передавать каждый пакет (контекст B) — адрес пропуска в дескрипторе указывает на начало того же блока дескрипторов. При этом, естественно, появляется задержка доставки данных;
  • в случае пропуска любого цикла послать (настойчиво) специальный завершающий пакет и остановить контекстную программу (контекст C) — адрес пропуска во всех дескрипторах цепочки указывает на дескриптор завершающего пакета;
  • останавливать передачу по пропуску любого цикла (контекст D) — адрес пропуска во всех дескрипторах цепочки указывает на нуль-дескриптор.

Квадраты на рис. 3, а обозначают блоки дескрипторов контекста; выходящие из них прямые стрелки (снизу) указывают на нормальные переходы, изогнутые (сверху) — на переходы по пропускам. На рис. 3, б показаны состояния FIFOбуфера на моменты начала каждого цикла. Здесь показаны пакеты, собранные по соответствующим блокам дескрипторов, и разделители циклов. Как видно из рисунка, сброс на шине (BUS RESET) и процесс идентификации дерева и узлов (ID) прерывают передачу изохронных пакетов. В результате этого по шине передаются изохронные пакеты следующим образом:

  • для контекста А: A1, A2, <пропуск двух циклов>, A3, A6, A7, — из-за сброса пропущены два цикла и потеряны (позже!) два пакета;
  • для контекста B: B1, <пропуск двух циклов>, B2, B3, B4, B5, — из-за сброса пропущены два цикла (задержка доставки), но пакеты не потеряны
  • для контекста C: C1, <пропуск двух циклов>, C2, C3, Cx (специальный пакет, сигнализирующий останов), останов — из-за сброса пропущены два цикла, чуть позже передача останавливается с предварительным уведомлением слушателей;
  • для контекста D: D1, <пропуск двух циклов>, D2, D3, останов — из-за сброса пропущены два цикла, чуть позже передача останавливается без предупреждения.

Если во время передачи FIFO-буфер переопустошается (underrun), то передаваемый пакет теряется (в его дескрипторе поле состояния не обновляется), а программы всех оставшихся контекстов продвигаются по ветке пропуска цикла.

Программа хоста помещает пакеты изохронной передачи данных в буферы, описанные блоками дескрипторов. Формат пакетов данных (рис. 4) почти соответствует формату потоковых пакетов IEEE 1394. Отличие заключается в переносе поля длины пакета data_length во второй квадлет ради помещения в первый квадлет кода скорости spd (эта информация при передаче нужна раньше всего). Поля CRC заголовка и данных контроллер строит сам при передаче.