ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
740708 Топик полностью
Николай Коровин (04.03.2017 03:29 - 20.03.2018 08:43, просмотров: 1740) ответил Evgeny_CD на Я много раз пытался придумать "идеальную шину для связи embedded устройств". И каждый раз калькулятор, сука империалистическая, таки разбивал мои розовые мечты вдребезги. И твою он тоже разобъет :)
Сто́ит так сто́ит (прикреплено). Впервые на арене нашего цирка — простейшая архитектура BoaW для одиночной скоростной дифференциальной пары. Эдакая PCIe x1 Мусохрановского разлива. Устройства имеют последовательную нумерацию. Пакет начинается с адреса (или нескольких, при мультикасте). Адрес начинается с нуля и имеет фиксированную длину. Если вместо нуля встретилась единица — значит, началось тело, оно имеет свой подзаголовок (адрес отправителя и размер). Протокол — пакетный, с ручным подтверждением доставки (вылитый UDP). Предусмотрен служебный пакет «повторите сообщение», не похожий на пользовательские пакеты: он имеет или нулевую длину, или фиксированную малую, чтобы в нём было где указать, скажем, идентификатор потерянной датаграммы, которую требуется повторить. Поскольку ему не нужен обратный адрес, можно или сделать его совпадающим с адресом назначения (такое сочетание, бессмысленное в обычных пакетах, является уникальным маркером служебного пакета), или, наоборот, использовать его в качестве неуникального идентификатора пакета (для уникального — разрядность маловата, только разве что последние отправленные различать) , а маркером тогда выступает нулевая длина полезной нагрузки. В случае, если устройство было не готово принять датаграмму (переполнение или неготовность буфера, аппаратное прерывание высшего приоритета), такой пакет можно отправить вручную, но его основное назначение — автоматическая отправка, если линия была занята и датаграмма была утеряна, после чего линия освободилась. Напротив, подтверждение успешной доставки — целиком дело вкуса и здесь никак не регламентируется. Это обычный короткий пакет, содержащий, например, CRC и ID всех успешно принятых пакетов за последнее время, или что-то другое. Разруливание ситуаций, когда не пришла ни «похоронка», ни подтверждение — производится согласно здравому смыслу и разумным таймаутам. Итак, допустим, в полудуплексную диффлинию постучался с какой-то стороны пакет. Поскольку нумерация последовательная, мы можем быть уверены, что при мультикасте наш адрес (А. К. А. номер устройства) будет первым в списке, если он там вообще есть. Поэтому датаграмма просто проходит через сдвиговый регистр длиной с адрес, а селектор адреса (тоже простой регистр) реагирует на каждые N бит. Если обнаруживается номер данного устройства, то замыкается коммутация, отправляющая пакет в, собственно, приёмный буфер данного устройства (на рисунке остальные адреса мультикаста обрубаются, хотя можно этого и не делать, если они представляют какой-то интерес; но в любом случае информации о том, кому сообщение отмультикастилось до нас, у нас не будет). Если (сразу или после нашего) обнаруживается какой-то ещё адрес, то замыкается другая коммутация, и сообщение, начиная с первого бита, относящегося к «не нашему» адресу, отправляется на диффлинию «с другой стороны» устройства. Если та занята, то датаграмма, вместо трансляции её в линию, умирает в селекторе обратного адреса. Если эта датаграмма не была уже сама по себе служебной (уведомляющей о том, что освободилась ранее занятая линия), то на её основе формируется служебная датаграмма. Когда обе линии освободятся, она отправляется незадачливому отправителю (это позволяет линии хоть как-то работать в тех случаях, когда два девайса её достаточно плотно забивают; отправка «на авось» парализовала бы коллизиями всё остальное, а отправка «по отмашке» позволяет с хотя бы небольшой пропускной способностью работать тогда, когда два болтуна затыкаются ненадолго). Очевидно, наиболее эффективна BoaW тогда, когда диффпара не одна, а полтора десятка. При этом море адовой разводки превращается в стройную параллельную «лапшу». Такой вариант будет не очень сильно отличаться от описанного, просто вместо одного драйвера будет группа, а вместо сигнала «линия свободна» — сигнал «хотя бы одна линия свободна». Кроме этого, нужно добавить пакет «прекратить транзакцию», который «затыкает» устройство, пытающееся вещать в занятую линию. Такой пакет отправляется «навстречу» в случае, если свободных линий нет. Конечно, всё это при определённой перегрузке «забивается», но забивается при определённой перегрузке, в общем-то, что угодно. Извлечение адреса вызывает небольшой лаг на каждом устройстве, но, учитывая его размеры и размеры пакета, при предполагаемых скоростях диффлиний это весьма несерьёзный лаг. Для медленных линий я предполагал аналоговую коммутацию ключом, не имеющую такой проблемы, но медленные линии как-то не так интересны. Размыкание можно производить «слева-справа» или «сверху». В случае «сверху» вся эта петрушка реализуется на объединяющей плате, напротив каждого слота, адреса инициализированы жёстко. В случае «слева-справа» при извлечении устройства дифференциальная линия соединяется перемычкой. Думаю, реализовать это на ПЛИС достаточно просто, так что, наверное, если эта штука вообще начнёт жить — она начнёт жить в виде некоей ко́ры, если у кого-то возникнет потребность таковую сделать.
image