nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

И про "стековые" переменные

Это ещё одна головная боль QuatCore: в нём всего один указатель стека, SP, тогда как в архитектуре x86 есть ещё и BP (Base Pointer), см. провокационный вопрос, поэтому локальные переменные выходят [BP], [BP+4], [BP+8] или что-нибудь в этом духе, тогда как SP сразу ставится выше всех этих переменных, что позволяет вызывать другие функции без страха, что они затрут нам локальные переменные.

В QuatCore такого разделения нет, и до сих пор я выбирал: либо обхожусь без вызова функций и в это время могу использовать [SP] и [SP+1] как локальные переменные, либо вызываю функции, а временные данные храню как-нибудь ещё: в регистрах (благо, их не так уж мало) или в "глобальных переменных".

Но если сделать волевой выбор и зафиксировать регистры k=0 и j=1, то жизнь становится несколько интереснее!


Вот команды со стеком, одинаковые как на чтение, так и на запись:

[SP+1]  [SP+2i+1]  [SP+2j+1]	[SP++]
[SP+i]  [SP+3i]    [SP+2j+i]	[i-1+SP++]
[SP+k]  [SP+2i+k]  [SP+2j+k]	[--SP+k]
[SP]    SP	   [SP+2j]	[--SP]


Нельзя сказать, что каждую команду я индивидуально подбирал, это "декартово произведение", когда двумя битами мы выбираем базовый регистр (в данном случае SP), другими двумя битами первый индексный регистр (сейчас это +1, +i, +k или 0) и ещё двумя битами: второй индексный регистр (0, +2i, +2j и -1), и в дополнение на четвёртой строке делается инкремент/декремент SP.

Реально я пока использовал [SP++] в качестве PUSH, [--SP] в качестве POP, SP чтобы инициализировать стек, [SP] и [SP+1] в качестве локальных переменных, и в паре мест более сложные выражения вроде [SP+i] или [SP+k], чтобы посчитать компоненты кватерниона во временном хранилище (то бишь, в стеке), а лишь потом переписать их на законное место, что позволяет преобразовывать векторы и кватернионы "на месте".

Многие варианты оказались совсем не задействованы. Посмотрим, во что они превратятся, если j=1 и k=0. Убрав все варианты с i, получим:

            [SP+1]
[SP+2j+1] = [SP+3]
            [SP++]
[SP+k]    = [SP] - неинтересно, у нас и так он есть!
[SP+2j+k] = [SP+2]
[--SP+k]  = [--SP] - неинтересно!
            [SP]
[SP+2j]   = [SP+2] - уже было, ну и ладно
            [--SP]


Улов не слишком велик, потому что здесь мы заменили слагаемое 4j / Treug[j] куда более безобидной "-1", чтобы получить свои законные [SP++] и [--SP], но при этом и [SP] и [SP+1] и многие другие (см. магические квадраты. Кто-то хорошо отмечал новый год!), поэтому до пяти посчитать не получается.

Но хотя бы можно досчитать с нуля до трёх! Это уже подспорье, ведь если мы будем хранить переменные в [SP+2] и [SP+3], то можем надеяться: вызов небольшой процедуры их не затрёт :) А может быть, и [SP+1] уцелеет,


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

А так-то я уже близок: как только напишу эту программу и реализую интерфейс между QuatCore и видеопроцессором, и отлажу всё это безобразие - смогу уже в простейшем виде свой макет запустить, с камерой, ЖК-экранчиком и всеми делами. Потом ещё надо будет два "алгоритма сопровождения" реализовать, одна часть - это нахождение яркостных центров с субпиксельной точностью, вторая - нахождение всех 6 степеней свобод через линеаризованную задачу безусловной оптимизации...
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

  • Я создал монстра!

    Вот нормальная счастливая пара разъёмов ОНЦ-БС-1-10/14-Р12-2-В и ОНЦ-БС-1-10/14-В1-2-В: У розетки кроме основного выступа, отмечающего "верх",…

  • Нахождение двух самых отдалённых точек

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

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 3 comments