nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Таблица памяти данных ВИПС

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

Никакие ЕСПД не страшны: попросят полную распечатку кодов - распечатаю, так и быть, мне одной страницы не жалко :)

И всё буквально перед глазами:


И то, из 512 байт данных (256 слов) пока задействована хорошо если половина.

Красным выделены области, которые с точки зрения наших математических алгоритмов должны восприниматься как константы (хотя можно их и перезаписать, если по каналу МКО, он же МКИО, короче, Mil-Std-1553, пришлют уточнённые значения).

Зелёным - пока свободная область.

Желтым - "тестовые" данные. Два кватерниона (small quat и big quat) мы туда поместили просто чтобы "поиграться" с процедурами перемножения и поворота, а матрице аффинного преобразования дали "своё собственное место" просто чтобы не запутаться - так-то у нас есть целая матрица 6х6, которая пока не задействована, можно было бы в ней кусочек себе присмотреть, они никогда не используются совместно!

Синим выделены адреса, к которым можно обратиться "непосредственно", к остальным надо подбираться. Пока нам эти области не нужны, но в таблице показан укуренный способ, как можно было бы к ним обратиться, используя константы в памяти. Скажем, если мы хотим обратиться по адресу 78h, то сначала занесём в регистр X (или любой другой, даже SP) значение -9. Поскольку разрядность регистров X,Y,Z,SP совпадает с шириной шины адреса (на данный момент - 8 бит), то в него войдёт значение 247 (F7h). Теперь занесём в X значение [X], т.е 16-битное значение, лежащие по адресу F7h. Там у нас лежит константа 5752. Но снова, в регистр войдёт только младший байт, а это будет 78h. Теперь к этой области можно обращаться, а можно туда целый массив засунуть, и обращаться через индексные регистры. Не знаю, насколько это удачная идея, можно и проще поступить. К примеру, мы ровно один раз скорее всего сделаем присвоение указателю стека SP, в самом начале программы, так что можно в эту конкретную операцию включить смещение либо множитель, чтобы стек закопался поглубже, а в начале "труднодоступной памяти" (но так, чтобы начало ещё выглядывало в "синюю" область) положить длинный массив какой-нибудь телеметрии :)

Внизу забавная картинка - симметричная матрица 6х6. Поскольку она симметричная, можно хранить лишь 21 элемент. Но если хранить их "один за другим", то с адресацией просто задолбаешься - это я уже пробовал, разбирался с фортрановским кодом для линейной алгебры (разложение Холецкого, LDL-разложение, обращение треугольной матрицы, умножение треугольной матрицы на себя же транспонированную "на месте"), это просто какой-то ужас... Чтобы справиться с этой "треугольной адресацией", нужно под десяток индексных переменных, и при каждом перемещении по матрице обновлять пяток из них.

Поэтому решил сделать адресацию самую обычную, "прямоугольную", причём с удобным множителем 8, а в свободные места напихать прочих вещей. Почти получилось :)

a11, a12, a22, ... , a66 - та самая матрица. Поначалу это матрица системы линейных уравнений, но потом мы её обращаем, что даёт (с точностью до константы) ковариационную матрицу шума измерений.

K1..K6 - первоначально вектор системы линейных уравнений ("правая часть"), но после решения системы здесь хранятся малые поправки к радиус-вектору и малый поворот - поправка к ранее измеренной ориентации.

QuatA..QuatZ - понятное дело, кватернион взаимной ориентации.

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

state - текущий "режим работы" - то ли "в активном поиске", то ли захват, то ли сопровождение.
HasData - признак наличия корректных данных, по радиус-вектора (из него получается дальность, курс и тангаж),
QValid - признак, что выдаваемый кватернион обладает точностью, указанной по ТЗ,
VValid - признак, что выдаваемая скорость сближения обладает точностью, указанной по ТЗ,
Vel - сама скорость сближения,
ShortR - признак, что мы перешли на мишень ближней дистанции (это должно происходить примерно с 15 метров, когда другие мишени вот-вот начнут выходить за поле зрения).

Exp, Tx, Ty, Tz выражает наш радиус-вектор в "плавающей точке" с общей экспонентой,
TxOut - слово, в котором объединяется 4-битная Exp и старшие 12 бит Tx, чтобы компактно выдать "наружу".

В области "только для чтения" мы видим матрицу 3х4 для нахождения коэффициентов аффинного преобразования (её мы уже использовали), а ещё трёхмерные координаты ("в метрах") мишеней дальней и ближней дистанции. Сначала заданы 4 точки для работы "вдали" (когда мы не можем разглядеть отдельных уголковых отражателей), это MDD3, MDD1, MBD, MDD2. В таком порядке, потому что удобнее работать. А затем (когда память уже с FF перешла в 00) 8 точек для работы "вблизи" - из них составлена мишень ближней дистанции, МБД.

Ещё мы видим весовые коэффициенты для манхэттенской и чебышевской метрик, чтобы получить из них хорошее приближение к эвклидовой, а ещё коэффициент для перехода от пикселей к радианам и наоборот.
Tags: ПЛИС, кватернионы-это просто (том 1), математика, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Ремонт лыжных мостиков

    Вернулся с сегодняшнего субботника. Очень продуктивно: отремонтировали все ТРИ мостика! Правда, для этого надо было разделиться, благо народу…

  • Гетто-байк

    В субботу во время Великой Октябрьской резни бензопилой умудрился петуха сломать в велосипеде. По счастью, уже на следующий день удалось купить…

  • А всё-таки есть польза от ковариаций

    Вчера опробовал "сценарий", когда варьируем дальность от 1 метра до 11 метров. Получилось, что грамотное усреднение - это взять с огромными весами…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 5 comments