реклама на сайте
подробности

 
 
> Извлечение корня и возведение в квадрат в AVR, как быстрее
yanita
сообщение Jul 14 2008, 11:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 9-02-08
Из: Украина
Пользователь №: 34 891



Здравствуйте всем.
У меня возникла следующая задача. В цепи обратной связи мне надо произвести ряд арифметических преобразований, в том числе излечение корня и возведение в квадрат. Как это можно сделать максимально быстро на одном из микроконтроллеров AVR (извлечь корень и возвести в квадрат)?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
777777
сообщение Jul 14 2008, 11:36
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(yanita @ Jul 14 2008, 15:06) *
У меня возникла следующая задача. В цепи обратной связи мне надо произвести ряд арифметических преобразований, в том числе излечение корня и возведение в квадрат. Как это можно сделать максимально быстро на одном из микроконтроллеров AVR (извлечь корень и возвести в квадрат)?


А числа целые или с плавающей точкой? Если с плавающей, то написать на Си, а если целые (или с фиксированной точкой), то искать "алгорим Ньютона" для извлечения корня.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 14 2008, 11:59
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(777777 @ Jul 14 2008, 14:36) *
А числа целые или с плавающей точкой? Если с плавающей, то написать на Си, а если целые (или с фиксированной точкой), то искать "алгорим Ньютона" для извлечения корня.
У AVR нет аппаратного деления. Оно реализовано через вычитания и сдвиги. И корень можно вычислять через вычитания и сдвиги.
Только при этом для деления число проходов цикла равно числу разрядов числа, а для корня - в два раза меньше. Правда, там ещё другие расходы есть (дополнительные операции ИЛИ, ещё один сдвиг), да и сдвиг на два у AVR реализуется как два сдвига на 1, итого вычисление корня по времени будет не в два раза быстрее программного деления, а близко к нему.
А "по Ньютону" нужно будет несколько делений, что будет в несколько раз дольше.
Обратите внимание на обсуждение по первой приведенной мной ссылке - там корень через вычитания/сдвиги оказался не медленнее "Ньютона" даже на 80386, который имеет аппаратное деление (впрочем, не слишком быстрое, но всё равно быстрее, чем программное через вычитания и сдвиги).

p.s. Александр Труш когда-то публиковал корень именно для AVR именно на асме. И где-то его недавно цитировали. Надо поискать.

Нашёл в своих завалах.
Ага, ещё и 24-битный аргумент. Видать, ему надо было именно столько (например, сумма не слишком болшьшого количества квадратов 10-битных отсчётов АЦП - 16 дико мало, 32 дико много).

Код
;*******************************************************************************
*********************
;*
;*           Подпрограмма вычисления квадратного корня для 24-ти битного аргумента                  *
;*          (c) 1998 Alexander Trush   http://trush.da.ru   trush@ropnet.ru   2:5020/392.40
;*
;    Вы можете свободно использовать, распространять, модифицировать этот
;    код до тех пор, пока вы указываете моё авторство и распространяете
;    это требование. Кроме того, я хотел бы получать уведомление о
;    применении этого кода по e-mail (trush@kbotd.ru).

sqrt24:         ldi     mask,1; Используем маску в регистре, т.к. команды EORI нет...
        ldi     count,12; Последний бит значения корня не требует специального
            ; подхода - есть запас от потери битов аж 4 бита
        clr16   work_h, work_l
        clr16   dist_h, dist_l; Очистка накопителя значения корня


sqrt24_1:       cpi     src_h, 64
        cpc     work_l, dist_l
        cpc     work_h, dist_h
        brcs    sqrt24_2
          subi  src_h, 64
          sbc   work_l, dist_l
          sbc   work_h, dist_h
sqrt24_2:       rol     dist_l      
        rol     dist_h      
        eor     dist_l, mask; Инверсия младшего бита значания корня,
            ; т.к. при заёме должны писать 0, и 1 при отсутствии
        lsl     src_l; Сдвиг аргумента на 2 бита
        rol     src_m; work_h:work_l:src_h:src_m:src_l <<= 2
        rol     src_h
        rol     work_l
        rol     work_h

        lsl     src_l
        rol     src_m
        rol     src_h
        rol     work_l
        rol     work_h

        dec     count; Получили ли все биты значения корня кроме последнего?..
        brne    sqrt24_1

        cp      dist_l, work_l
        cpc     dist_h, work_h
        adc     dist_l, src_m; Команды ADCI нет, а src_m точно здесь равен 0
        adc     dist_h, src_m
        ret
;******************************************************************************


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
777777
сообщение Jul 15 2008, 10:22
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(ReAl @ Jul 14 2008, 15:59) *
Код
        clr16   work_h, work_l
        clr16   dist_h, dist_l; Очистка накопителя значения корня


Еще бы выяснить, что такое clr16...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- yanita   Извлечение корня и возведение в квадрат в AVR   Jul 14 2008, 11:06
- - defunct   #include <math.h> корень - sqrt квадрат x*x...   Jul 14 2008, 11:28
- - ReAl   Цитата(yanita @ Jul 14 2008, 14:06) Здрав...   Jul 14 2008, 11:30
|- - mse   Цитата(ReAl @ Jul 14 2008, 15:59) ... Вид...   Jul 15 2008, 07:28
||- - ReAl   Цитата(mse @ Jul 15 2008, 10:28) 24р это ...   Jul 15 2008, 13:30
- - Kovrov   ну наверное это clr work_h clr work_l   Jul 15 2008, 11:37
- - jasper   Быстрый, но не очень точный способ извлечения корн...   Jul 16 2008, 06:38
- - alexander55   Цитата(yanita @ Jul 14 2008, 15:06) В цеп...   Jul 16 2008, 09:42
|- - _Pasha   Цитата(alexander55 @ Jul 16 2008, 12:42) ...   Jul 17 2008, 08:46
- - SpyBot   Неплохо бы уточнить, чем измеряем. Возможно, можно...   Jul 16 2008, 13:58
|- - alexander55   Цитата(SpyBot @ Jul 16 2008, 17:58) Непло...   Jul 17 2008, 04:41
- - yanita   Спасибо всем за помощь. Дело в том, что я не особо...   Jul 17 2008, 14:48
- - defunct   Цитата(yanita @ Jul 17 2008, 17:48) Вот и...   Jul 17 2008, 21:29


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 04:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016