nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Тестирование поиска "центральных" точек (2)

В прошлый раз остановились на том, что была правильно найдена одна из двух центральных точек, и мы вернулись из процедуры.

Далее она должна переместиться на нужную позицию (на индекс 1), а затем мы возьмёмся за вторую точку. Сейчас глянем, что там происходит...


А для понимания приведём дамп памяти по окончании предыдущего этапа:
sortDump.png

И оказывается, в коде опять допущена ошибка, на этот раз совсем идиотская, до 8 посчитать не сумел...


На всякий случай снова приведу листинг:

FindCentralPoints proc
2B  F3B4                  [SP++]      Call(FindCentralPoint)  ;классический вызов процедуры, т.к она использует стек [SP] и [SP+1], недопустимо чтобы затёрла адрес возврата
2C  FCB8                  [SP]        Call(SwapPoints)        ;вызов без инкремента стека, чтобы можно было в неё запрыгивать из условных переходов, зная что SP останется где надо
2D  A70F                  ijk         0x00A5  ;{Inv, k, i, j} когда-нибудь надо ввести синтаксис, чтобы указывать биты don't care, чуть поможет компилятору
2E  FCB8                  [SP]        Call(SwapPoints)
2F  F3B4                  [SP++]      Call(FindCentralPoint)
30  A110                  j           3
31  FCB8                  [SP]        Call(SwapPoints)
FindCentralPoints endp
32  B011  endless:        JMP endless
FindCentralPoint proc
33  A712                  ijk         0x04C5  ;одним махом всех иниц. {Inv, k, i, j}
34  8A13  @@k_loop:       C           25933       ;число 0,7914 в формате Q1.15
35  90C9                  MUL         [X+2i+k]    ;Fy6 на первой итерации, Fx6 на второй
36  8A14                  C           6835        ;число 0,2086 в формате Q1.15
37  92E9                  FMA         [Z+2i+k]    ;Fy7 на первой итерации, Fx7 на второй
38  D880                  [Y+k]       Acc
39  AA15                  kLOOP       @@k_loop
3A  F016                  [SP+1]      32767       ;текущий минимум, инициализируем максимальным значением
3B  A204  @@outer_cycle:  k           1
3C  FC03                  [SP]        0       ;сумма квадратов
3D  8900                  NOP         0 ;AUTOMATICALLY INSERTED BY TRANSLATOR TO PREVENT HAZARD
3E  80CA  @@inner_cycle:  Acc         [X+2j+k]    ;Fy[i] если k=1,  Fx[i] если k=0
3F  83D8                  SUB         [Y+k]       ;Cy если k=1, Cx если k=0
40  9C80                  SQRD2       Acc
41  82FC                  ADD         [SP]
42  FC80                  [SP]        Acc
43  AA17                  kLOOP       @@inner_cycle
44  83F0                  SUB         [SP+1]
45  BC18                  JGE         @@skip
46  F0FC                  [SP+1]      [SP]
47  A0A1                  i           j
48  A919  @@skip:         jLOOP       @@outer_cycle
49  B0FF                  JMP         [--SP]  ;ret
FindCentralPoint endp
SwapPoints  proc
4A  A204                  k           1
4B  8900                  NOP         0   ;хотим избежать warning'ов
4C  8AEA  @@swap:         C           [Z+2j+k]
4D  EAC9                  [Z+2j+k]    [X+2i+k]
4E  C983                  [X+2i+k]    C
4F  AA1A                  kLOOP       @@swap
50  B0FC                  JMP         [SP]
SwapPoints  endp    


Первый вызов SwapPoints прошёл очень удачно, мы поменяли местами точки с индексами 0 и 1, так и задумывалось.

А вот на втором вызове предполагалось, что мы поменяем местами две крайние точки, с индексами 6 и 7. Но почему-то я поставил i=j=5, в результате чего обменялись 5 и 6. Не знаю, как так вышло.

Строку
    ijk  0x00A5


заменяем на
    ijk  0x00C6


компилируем и синтезируем по-новой, и смотрим ещё разок:


Да, в этот раз меняются местами именно 6 и 7, как и надо. После чего повторно вызывается FindCentralPoint.

Его выполнение мы уже внимательно наблюдали, так что сразу перейдём в самый конец:



Индекс 4 мы задали сами - именно туда мы хотим поместить вторую "центральную" точку. А индекс 5 - это где мы её нашли. Если вспомнить, какая была нумерация после сортировки:
sort01.png

то ВСЁ ВЕРНО!

Наконец, получим дамп памяти по окончании этой процедуры:


и опять, для сравнения, дамп в начале её работы:
sortDump.png


Изобразим на рисунке, как эти точки теперь нумеруются:


Да, именно так мы и планировали. Центральные точки всегда должны занимать индексы 1 и 4, крайние: 6 и 7, а остальные отсортированы в направлении от точки 7 к точке 6.

Мы почти у цели...
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Тестируем 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