Например TDA7294

Форум РадиоКот • Просмотр темы - квадратный корень на асме AVR
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 19:38:42

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 40 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Вс апр 03, 2011 00:53:43 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
Дык и так можно
Код:
        subi    mask0, 0
        sbci    mask1, 0
        sbci    mask2, 0
        sbci    mask3, 0
        brne loop

А если маска в R24...R27, то и так тоже
Код:
        sbiw    mask0, 0
        sbci    mask2, 0
        sbci    mask3, 0
        brne loop


p.s. В любом случае -- это прямой перенос на asm алгоритма, сделанного под C.
Который делалася так, чтобы продемонстрировать идею РПП и получить разумно-быструю функцию для любой архитектуры без необходимости что-то дотачивать (это всё поначалу вообще на AT89C55 гонялось).
На асме можно и по-другому сделать, посмотрите тему в RU.ALGORITHMS -- с чего тема началась. Там «цифра за цифрой», что не очень уобно реализуется на C, но на асме, мне кажется, может позволить частично объединить регистры (как при делении, когда две переменные сдвигаются вместе и частное вдвигается на место делимого).
Кажется, именно такой алгоритм на асме для AVR где-то вте же годы написал Александр Труш, только там из 3-байтового числа корень извлекался.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Вс апр 03, 2011 08:08:00 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
:-)
Сейчас скомпилил в avr-gcc указанный С-шный исходник, так тело цикла 1:1 тому, что я дал выше (начиная от метки loop и заканичая сдвигом mask на два), а вот с организацией цикла он прави не прав одновремённо. У AVR-то регистров немеряно.
Конец цикла он проверяет не по 0 в mask, а тупо по счётчику, так как при данном начальном значении mask и сдвигах на 2 тело цикла будт пройдено 16 раз (кстати, в дів раза меньше, чем при делении 32/32, так что способ извлечения корня y = (x + y/x) / 2, требующий нескольких делений, явно отстаёт). Но он почемуто решил, что счётчик нужно сделать двухбайтовым.
Так что можно ещё так изменить
Код:
   ... инициализация
   ldi   counter, 16    ; <----------

loop:
   movw ...
   ...
skip:
   ...
   rol   mask3      ; конец сдвига маски

   dec   counter    ; <----------
   brne loop
Ещё тройка тактов в цикле экономится, на всём корне при 16МГц тактовой ещё микросекунды три выиграется. С учётом всех изменений микросекунд в 40 в наихудшем случае влезет. В среднем, думаю, 35.
И именно из этого уже ничего не выжать. Надо смтреть в сторону «цифра за цифрой» (бит за битом), читайте Винокурова в той теме.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Вс апр 03, 2011 09:10:30 
Жалко столько регистров использовать )). У меня ж они не только для расчёта используются. Ща проверим быстродействие.
И всё таки какой древний алгоритм, а раз выжил - значит хороший.


Вернуться наверх
   
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Вс апр 03, 2011 09:45:23 
Программа была переделана по вашим рекомендациям. Скорость расчёта улучшилась с 65 до 35 мкс. Вот конечная версия. На этом можно остановиться, я думаю. Всем большое спасибо.


Вложения:
CalcSquareRoot.asm [3.77 KiB]
Скачиваний: 725
Вернуться наверх
   
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Вс апр 03, 2011 11:23:07 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
Ну так если регистры очень нужны где-то ещё, то всё равно будет по скорости лучше и по объёму кода не хуже в начале четыре регистра push-нуть, задействовать их для вычислений, потом назад pop-нуть.

Вот глянул первоначальный вариант - там sqr инициализируетя нулями (4*sts = 16байт, но половина из них уйдёт и на инициализацию регистров) потом в цикле дважды считывается (8*lds = 32 байта) и один раз сохраняется (4*sts = 16 байт). По об́ъёму кода это во много раз больше, чем 4*push+4*pop (16байт). Ну а по скорости так само собой. Доп расхода памяи на стек нет, на это уйдёт та память, которая была нужна для временной переменной sqr, причём в другое время этот стек будет для чего-то другого использован.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Вс апр 03, 2011 11:34:50 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
orinoko писал(а):
И всё таки какой древний алгоритм
:shock: Если алгоритм древний, то я тогда какой? :)))

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Вс апр 03, 2011 11:56:31 
avreal писал(а):
orinoko писал(а):
И всё таки какой древний алгоритм
:shock: Если алгоритм древний, то я тогда какой? :)))

А если это вы автор этого алгоритма, то вы замечательный человек :) . Надеюсь, вы мне простите тогда, что я заюзал ваши авторские права.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Пт май 06, 2011 13:52:07 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 33
Зарегистрирован: Ср мар 02, 2011 07:47:39
Сообщений: 834
Откуда: Уфа
Рейтинг сообщения: 0
народ мне интересно а если число 33 битное, то какое число нужно записать в mask по первому примеру? Я так догадываюсь что 0x400000000??


Вернуться наверх
 
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Пт май 06, 2011 14:03:47 
Не факт. И, мне почему-то кажется, что исходное число должно иметь чётное количество бит


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Пт май 06, 2011 15:34:21 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
Число с нечётным числом бит всегда можно превратить в число с чётным их числом, добавив слева нулевой бит :-)

В маске поднят младший бит из самой старшей пары бит.
Для 10-битного числа маска будет 0x100
33-битное число рассматривайте как 34-битное, маска будет 0x100000000ULL

p.s. Маска представляет собой квадрат числа с единственной единичкой. Начальная маска -- квадрат числа с единичкой в старшем разряде (максимального) ожидаемого корня.
Так и получается, что маска прыгает через два бита и всегда в младшем бите из пары.
0x8000 (старшая единичка в 16-битном числе результата) в квадрате давало маску 0x40000000.
Если описания по ссылкам почитать, это должно быть ясно.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Ср май 11, 2011 12:57:22 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 33
Зарегистрирован: Ср мар 02, 2011 07:47:39
Сообщений: 834
Откуда: Уфа
Рейтинг сообщения: 0
Хм я так понимаю у этого алгоритма есть небольшя погрешность?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Ср май 11, 2011 14:40:56 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 33
Зарегистрирован: Ср мар 02, 2011 07:47:39
Сообщений: 834
Откуда: Уфа
Рейтинг сообщения: 0
Народ хелп!! При числе 2С52С0000 и больше выдаёт какую-то хрень((


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Ср май 11, 2011 15:27:34 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 840
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5592
Откуда: Minsk
Рейтинг сообщения: 0
Psych писал(а):
Хм я так понимаю у этого алгоритма есть небольшя погрешность?

При целочисленном извлечении корней погрешность будет обязательно, если только аргумент не является точным квадратом.
Psych писал(а):
Народ хелп!! При числе 2С52С0000 и больше выдаёт какую-то хрень((


Стартертопика интересовал 32-битный аргумент. А число 2С52С0000 уже 34-битное.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Ср май 11, 2011 15:40:25 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
Psych писал(а):
Народ хелп!! При числе 2С52С0000 и больше выдаёт какую-то хрень((
Алгоритм работает нормально, если какая-то программа выдаёт хрень -- надо искать в ней ошибку.
Раз число вылезло за 32 бита, нужно подправить типы и маску.
Код:
#include <inttypes.h>
#include <stdio.h>

uint32_t isqrt64(uint64_t from) {
     uint64_t mask = 0x4000000000000000ULL;
     uint64_t sqr = 0, temp;
     do {
         temp = sqr | mask;
         sqr >>= 1;
         if( temp <= from ) {
             sqr |= mask;
             from -= temp;
         }
     } while( mask >>= 2 );
     if( sqr < from && sqr < UINT32_MAX) ++sqr;
     return (uint32_t)sqr;
}

#define TST(a) printf("sqrt(0x%" PRIX64 ") = 0x%" PRIX32 "\n", (uint64_t)a, isqrt64(a) );

int main()
{
        TST( 4 );
        TST( 0x10000UL );
        TST( 0x100000000ULL );
        TST( 0x2C52C0000ULL );
        TST( 0x3FFFFFFFFULL );
        TST( 0x4F0000000ULL );
}
И выдача программы:
Код:
sqrt(0x4) = 0x2
sqrt(0x10000) = 0x100
sqrt(0x100000000) = 0x10000
sqrt(0x2C52C0000) = 0x1AA16
sqrt(0x3FFFFFFFF) = 0x20000
sqrt(0x4F0000000) = 0x238D8
Всё честно.

Вот делаем маску изначально меньше и ограничиваем маской диапазон входных чисел в 34 бита, куда влезет 2C52C0000 (макс. значение 34-битного входа 3 FFFF FFFF, а с учётом округления алгоритм будет выдавать правильные ответы до 4 0002 0000, но это ему просто повезёт по причине реально 64-битных вычислений):
Код:
#include <inttypes.h>
#include <stdio.h>

uint32_t isqrt64(uint64_t from) {
     uint64_t mask = 0x100000000ULL;
     uint64_t sqr = 0, temp;
     do {
         temp = sqr | mask;
         sqr >>= 1;
         if( temp <= from ) {
             sqr |= mask;
             from -= temp;
         }
     } while( mask >>= 2 );
     if( sqr < from && sqr < UINT32_MAX) ++sqr;
     return (uint32_t)sqr;
}

#define TST(a) printf("sqrt(0x%" PRIX64 ") = 0x%" PRIX32 "\n", (uint64_t)a, isqrt64(a) );

int main()
{
        TST( 4 );
        TST( 0x10000UL );
        TST( 0x100000000ULL );
        TST( 0x2C52C0000ULL );
        TST( 0x3FFFFFFFFULL );
        TST( 0x4F0000000ULL );
}
Код:
sqrt(0x4) = 0x2
sqrt(0x10000) = 0x100
sqrt(0x100000000) = 0x10000
sqrt(0x2C52C0000) = 0x1AA16
sqrt(0x3FFFFFFFF) = 0x20000
sqrt(0x4F0000000) = 0x20000
В последней строке ответ неправильный, но тут уже не выдержан диапазон аргумента, а алгоритм ни при чём.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Ср май 11, 2011 18:59:18 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 33
Зарегистрирован: Ср мар 02, 2011 07:47:39
Сообщений: 834
Откуда: Уфа
Рейтинг сообщения: 0
Блин уже голова трещит....и все равно нифга не канает((

Собственно делаю вычиление: x=sqrt(a^2+b^2+c^2)

Теперь предположим что a=b=c=#F500 --- все нормально, результат правильный(и до него тоже)

А если a=b=c=#F600 () и далее , то все уже фигня выходит((

Маску менял и так и эдак...одна фигня((


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Ср май 11, 2011 19:34:26 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 33
Зарегистрирован: Ср мар 02, 2011 07:47:39
Сообщений: 834
Откуда: Уфа
Рейтинг сообщения: 0
Народ поясните подробнее while(mask>>=2)?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Ср май 11, 2011 20:33:29 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 33
Зарегистрирован: Ср мар 02, 2011 07:47:39
Сообщений: 834
Откуда: Уфа
Рейтинг сообщения: 0
Все вопрос решен. Сам даже незнаю как, но все заработало :shock:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Чт май 12, 2011 01:13:32 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
Это плохо. То, что непонятно как само заработало, с тем же успехо само и перестанет. Кто в доме хозяин? :-)

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Чт май 12, 2011 06:36:33 
Опытный кот
Аватар пользователя

Карма: 6
Рейтинг сообщений: 33
Зарегистрирован: Ср мар 02, 2011 07:47:39
Сообщений: 834
Откуда: Уфа
Рейтинг сообщения: 0
avreal писал(а):
Это плохо. То, что непонятно как само заработало, с тем же успехо само и перестанет. Кто в доме хозяин? :-)

Че эт перестанет то?! :)) . Уже проверил на всяких разных числах. Просто я чето поменял... и забыл че поменял))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: квадратный корень на асме AVR
СообщениеДобавлено: Чт май 12, 2011 09:36:21 
Опытный кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 52
Зарегистрирован: Чт дек 31, 2009 19:27:45
Сообщений: 842
Откуда: Бровари, Україна
Рейтинг сообщения: 0
Это и плохо, что забыл :))) Грабли нужно помнить.
В следующий раз при редактировании может нечаянно назад поменяться. Впрочем, тогда и память может освежиться.

_________________
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 40 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y