Elektrod & Glacier
Glacier Glacier
Я тут думала, как нам сделать такую сеть, чтобы она выдержала и жару, и радиацию – ну, типа для зондов в глубоком космосе. Как тебе идея спроектировать для этого какой-нибудь модульный протокол резервирования?
Elektrod Elektrod
Звучит как неплохая отправная точка, но избыточность нужно распределять продуманнее, чем простое утроение оборудования. Тройная модульная избыточность с модулем голосования большинства справится с одномоментными сбоями, но если все три узла находятся в одной температурной зоне, локальный перегрев может вывести их все сразу. Держи запасные модули в термоизолированном отсеке и используй асинхронное голосование, чтобы разброс тактовых частот не вызвал дополнительный отказ. Не забудь о радиационно-стойкой прошивке – самопроверяющие контрольные суммы или избыточность в логике управления помогут избежать запираний. Какую топологию ты предполагала?
Glacier Glacier
Привет, Я думаю, лучше выбрать топологию, похожую на дерево – где каждый листовой узел – это локальный кластер, который подключается к центральному координатору. Так, если один кластер выйдет из строя из-за перегрева, остальные продолжат работать и перенаправят трафик. Асинхронное голосование, о котором ты говорил, можно разместить между листовыми узлами и координатором, чтобы удостовериться, что выходные данные каждого кластера проверены перед распространением. Я продумаю прошивку так, чтобы она перепроверяла критические пути и выявляла признаки неконтролируемого запуска до того, как они повлияют на систему. Главное – обеспечить тепловую и радиационную изоляцию для каждого кластера, но при этом позволить им общаться по маломощной, малозадержковой шине. Что скажешь насчет протокола шины?
Elektrod Elektrod
Слушай, чтобы шина была энергоэффективной, с минимальной задержкой и выдержала космическую радиацию, она должна быть простой и надёжной. SpaceWire – это отраслевой стандарт для дальнего космоса. Это последовательная, полнодуплексная линия с защитой CRC и встроенной поддержкой резервирования. Можно запустить два канала SpaceWire параллельно, каждый со своим драйвером и приемником, и добавить небольшой контроллер, который будет решать, какому каналу доверять, основываясь на CRC и индикаторах состояния линии. Если нужно что-то ещё легче, то радиационно-стойкая линия CAN-FD тоже вариант. Она устойчива к изменению битов благодаря 64-битному CRC, и можно вывести дополнительную линию CAN для двойной модульной избыточности. Главное – делать топологию шины модульной: каждый локальный кластер подключается к местному повторителю, а повторитель выдаёт информацию на главный координатор по двум параллельным линиям. Так, если одна линия выйдет из строя из-за перегрузки или локального перегрева, другая продолжит передачу данных. Не забудь про сторожевой таймер в прошивке шины, который проверяет состояние линии каждые несколько миллисекунд и может инициировать переключение, если одна сторона покажет ненормально высокие показатели ошибок. И не забудь про простой пакет "биения сердца", чтобы каждый узел знал, что шина работает. Короче говоря, выбирай проверенный космический последовательный протокол, дублируй линии и добавь легковесный контроллер, который проверяет CRC и состояние линии, прежде чем передавать трафик дальше. Это, конечно, муторно, но это не позволит сети выйти из строя из-за вспышки радиации.
Glacier Glacier
Звучит убедительно, особенно идея с двойной связью арбитра. Давай теперь набросаем прошивку для репитера и определимся с timing heartbeat'а. Это должно поддерживать шину в рабочем состоянии, даже если один канал выйдет из строя.
Elektrod Elektrod
Конечно, давайте зафиксируем логику повторителя в простой конечный автомат: слушаем на обоих каналах, если одна контрольная сумма не совпадает или задержка превышает порог – поднимаем флаг и перенаправляем данные по рабочему пути. Для сердцебиения, интервалы в 1 миллисекунду – это избыточно; 10–20 миллисекунд достаточно, чтобы поддерживать связь, не тратя энергию. Добавь 32-битный счетчик в каждый пакет, чтобы принимающая сторона могла обнаруживать пропущенные сигналы и инициировать переключение на резервный канал. Так у нас связь будет стабильной, даже если один из каналов выйдет из строя.
Glacier Glacier
Этот цикл вполне достаточно быстрый. 32-битный счётчик быстро поймает пропущенные импульсы, а окно в 10-20 миллисекунд обеспечивает баланс между скоростью обнаружения и энергопотреблением. Теперь формализуем переходы состояний на схеме. Нужно сохранить название Glacier. Готово. Этот цикл вполне достаточно быстрый. 32-битный счётчик быстро поймает пропущенные импульсы, а окно в 10-20 миллисекунд обеспечивает баланс между скоростью обнаружения и энергопотреблением. Теперь формализуем переходы состояний на схеме.
Elektrod Elektrod
Понял. Вот как это можно описать простыми словами: 1. **Ожидание (IDLE)** – загрузка, ожидание команды запуска. 2. **Активен (ACTIVE)** – обычная работа, обе линии работают. 3. **Отправлен пульс (HEARTBEAT_SENT)** – на шину отправляется пакет со счётчиком на 32 бита. 4. **Получен пульс (HEARTBEAT_RECEIVED)** – удалённый узел увеличивает счётчик и возвращает его. 5. **Сбой соединения (LINK_FAIL)** – если обнаружена ошибка CRC или ответа нет в течение 10–20 миллисекунд, помечаем соединение как неисправное. 6. **Переключение (SWITCH)** – перенаправляем весь трафик через исправную линию, оставляем неисправную в режиме ожидания. Переходы: - IDLE → ACTIVE при запуске. - ACTIVE → HEARTBEAT_SENT по таймеру. - HEARTBEAT_SENT → HEARTBEAT_RECEIVED при подтверждении. - HEARTBEAT_SENT → LINK_FAIL в случае ошибки или таймаута. - LINK_FAIL → SWITCH для использования другой линии. - SWITCH → ACTIVE после проверки исправности основной линии. Возвращаемся к HEARTBEAT_SENT из ACTIVE после каждого успешного обмена данными. Это поддерживает шину активной и обеспечивает отзывчивость прошивки.