nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Двойная буферизация для МКО - зло!

Поначалу хотел реализовать в своём "контроллере МКО".

Вот есть у нас "полётное задание" - массив данных, где задано множество флажков ("разрешить переход в сопровождение", "разрешить захват ближней дистанции", "разрешить захват дальней дистанции", "разрешить стереорежим"), настроек (размер окна для нахождения скорости сближения, использовать ли мишени дальней дистанции, когда начали различать отдельные отражатели ближней дистанции и пр), параметры перехода из системы координат прибора в систему координат корабля: вектор параллельного переноса и кватернион поворота.

Когда только включается питание, память уже инициализируется значениями из ПЗУ, некими "значениями по умолчанию", позволяющими убедиться в работоспособности прибора и СКОРЕЕ ВСЕГО соответствующими некой типовой работе. И любая приходящая посылка с подадресом 1_0001 = 17 будет переписывать этот массив.

Но при нынешней реализации, мы его начнём переписывать, не дожидаясь окончания передачи. И вот проверим контрольную сумму - а она не совпадает! Получается, и старые (сколько-нибудь рабочие значения) запороли, и новые так и не приняли!

Суть двойной буферизации - мы принимаем данные во временную область памяти, убеждаемся в их правильности - и только потом переписываем. Если контрольная сумма не сошлась - остаёмся со старыми данными.


Такой подход предлагается в микросхеме 1895ВА2Т, там классическая двойная буферизация: памяти на самом деле вдвое больше, на каждый подадрес выделяется две области. В одну записываются данные, принимаемые в данный момент, с другой идёт доступ к процессору. Если новые данные были верны, эти области "меняются местами" (по сути, данные остаются на своих местах, меняются лишь "указатели", буквально одним битом).

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

Но ладно бы со сложностью: если надо - выполним! Я начал размышлять о всей нашей процедуре стыковки, и склоняюсь к выводу, что целее будем, если такую буферизацию не делать!

Это всё из того же соображения: гораздо лучше не выдавать никаких данных, чем выдавать НЕВЕРНЫЕ данные, особенно если это СЛЕГКА неверные данные, достаточные чтобы на первый взгляд не заметить проблемы, достаточные чтобы относительно точно навести космический корабль на станцию, но не с той скоростью и не с теми углами.

В принципе, наличие буферизации вообще должно оставаться вопросом второстепенным. Если полётное задание пришло с ошибкой, мы должны указать об этом в ответном слове, и нам его пошлют повторно. А если там что-то изначально сформировали неправильно (CRC заготавливали не "на ходу", а, к примеру, "на земле", и где-то ошиблись), то после 3 попыток передачи по основному каналу и 3 попыток по резервному просто скажут "извините, не склалось" - перейдут на резервный комплект, попробуют с ним. Для него задание будет чуть другим (он же расположен в другом месте), может там всё в порядке - и заработает на резервном.

Но мало ли, почему-то бортовая система решила, что всё в порядке, и начала работу с нами. Тогда, с дистанции 300 метров особой разницы никто не заметит. Пусть даже система координат сдвинута на 0,84 метра - с такой дистанции этого особо не заметишь. Дальность покажет правильно, углы, с точностью до 0,16° - тоже! Будет решено: всё в порядке, осуществляем сближение. Расхождения станут заметны только вблизи, станет понятно, что он "куда-то не туда целится". Думаю, разрешится всё нормально, но всё-таки вблизи оно очень нервно, да и топлива уже израсходуется солидно, приятного мало.

А вот если данные затёрлись, но мы знаем, что данные сейчас неверны - то уже на 300 метрах сообщим об ошибке, и может даже успеется разобраться, в чём же там дело, заложить исправленные данные - и успешно долететь.

Примерно то же самое насчёт конфигурации мишеней, и даже со стереорежимом, когда соседний комплект присылает нам свои измеренные координаты. Там в "старых данных" также никакого толку нет, по ним мы уже посчитали данные и выдали в своё время. А если новые данные ошибочны - значит сейчас просто стереорежим прекращаем, выдаём только по своим собственным измерениям.

Понятно, я не говорю, что в принципе такая буферизация плоха. Легко можно придумать случай, где как раз удобнее иметь самые свежие корректные данные. Но здесь такого нет.

Кстати, в заголовке массива действительно смысл есть большой. Я могу представить, как мы случайно восприняли на свой счёт сообщение, адресованное кому-то ещё. Но чтобы при этом ещё и 16-битный заголовок совпал, с кодами Рида-Мюллера, это какое-то глобальное невезение должно быть.


В общем, с чистой совестью делать эту буферизацию не буду :) Впрочем, тут и без неё ещё есть, чем заняться, вот проверкой сообщений хотя бы. И "Синхронизация (с СД)" у нас до сих пор не реализована!
Tags: ПЛИС, работа, странные девайсы
Subscribe

  • Тестируем atan1 на QuatCore

    Пора уже перебираться на "железо" потихоньку. Решил начать с самого первого алгоритма, поскольку он уже был написан на ассемблере. В программу внёс…

  • Формулы приведения, что б их... (и atan на ТРЁХ умножениях)

    Формулу арктангенса на 4 умножениях ещё немножко оптимизировал с помощью алгоритма Ремеза: Ошибка уменьшилась с 4,9 до 4,65 угловой секунды, и…

  • Алгоритм Ремеза в экселе

    Вот и до него руки дошли, причина станет ясна в следующем посте. Изучать чужие библиотеки было лениво (в том же BOOSTе сам чёрт ногу сломит), писать…

  • atan на ЧЕТЫРЁХ умножениях

    Мишка такой человек — ему обязательно надо, чтоб от всего была польза. Когда у него бывают лишние деньги, он идёт в магазин и покупает какую-нибудь…

  • Ай да Пафнутий Львович!

    Решил ещё немного поковыряться со своим арктангенсом. Хотел применить алгоритм Ремеза, но начал с узлов Чебышёва. И для начала со своего "линейного…

  • atan(y/x) на двух умножениях!

    Чего-то никак меня не отпустит эта тема, всё кажется, что есть очень простой и эффективный метод, надо только его найти! Сейчас вот такое…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments