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

 
 
> asm на AVR, оптимальные конструкции
_Ivana
сообщение Jan 28 2012, 15:48
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Пишу третий в жизни проект, на AVR, на asm. До того было 2 успешных - на asm и на C. Писать надо именно на asm - по разным причинам. Я понимаю что можно написать на С и посмотреть что там сделает компилятор с оптимизатором, но пока хочется поковыряться самому sm.gif Общую логику и алгоритм работы уже составил, осталось красиво реализовать это на asm - оптимально не по размеру кода а по скорости при любых ветках ветвлений - то есть, если кусок кода будет делаться 50 тактов в 99 случаях и 1000 тактов в 1, то пусть лучше он каждый раз делается гарантированно по 500 тактов sm.gif
Возникают в изобилии коротенькие логически законченные куски для перевода в asm. Например
Код
signed long int S = 0;
float s = 0, ds = 0;
signed char P = 0;
......
s = s + ds;
if (s < 0) {
    s = 1 - s;
    S = S - 1;
    P = P - 1;
    if (P < 0) {P = 3}
    }
elseif (s >= 1) {
    s = s - 1;
    S = S + 1;
    P = P + 1;
    if (P > 3) {P = 0}
    }

В asm s и ds будут в формате с плавающей запятой. Думаю что буду использовать sbrc/sbrs их старшего бита - знака мантиссы. Позже напишу код который придумаю - покритикуете помидорами. А вот насчет
Код
    P = P - 1;
    if (P < 0) {P = 3}
..........
    P = P + 1;
    if (P > 3) {P = 0}
    }

придумал - я просто делаю inc/dec rP а потом мне надо найти красивую команду чтобы просто занулить его старшие 6 разрядов - пока точно не знаю какую - and или lsl rP, 6 + lsr rP, 6

Или еще пример
Код
float s, ds;
unsigned char m;
......
if (ds < 1/128) m = 128
elseif (ds < 1/64) m = 64
elseif (ds < 1/32) m = 32
elseif (ds < 1/16) m = 16
elseif (ds < 1/8) m = 8
elseif (ds < 1/4) m = 4
elseif (ds < 1/2) m = 2
else m = 1

Написано коряво, только суть. Теперь буду думать как это красиво на asm написать...

Если есть что сказать - почитаю sm.gif За возможные синтаксические ошибки не пинайте - думаю, смысл понятен и так.

Сообщение отредактировал _Ivana - Jan 28 2012, 15:54
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Ivana
сообщение Jan 30 2012, 23:03
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Цитата
вычисления полинома 3 порядка в плавучке отнимают не более 1000 тактов, и это на Си

это, если я не ошибаюсь, и если "в лоб" и все параметры в плавучке - 6 умножений и 3 сложения, не считая перемещений-копирований аргументов и записи промежуточных результатов в ОЗУ. Сильно сомневаюсь что это влезет в 1000 тактов... Может вычисление не "в лоб" а хитрыми итерационными методами?...

А насчет упрощений - вы правы. Например, если частоту расчета взять кратной степени 2, то умножение на dt сведется к делению на 2^N, что проще и быстрее и в плавучке (я ж функцию дописал sm.gif ) и тем более в фиксе - просто сдвиг вправо... Сейчас частота = 8кГц, удастся ли привести её к 8192 - не знаю, врядли. А чем грозит "допущение", что умножение на dt при 8кГц я буду делать через сдвиг на 13 бит вправо - пока не понимаю rolleyes.gif
А еще, если убедить заказчика не менять ускорение в процессе движения, то элементарные приращения скорости будут постоянны и предполагаемый тормозной путь я смогу получить накопительно с начала движения а не рассчитывать его каждую итерацию, боясь что изменилось ускорение и теперь он другой... Но согласится ли заказчик на это?...

И конечно же "консерватория". Пытаюсь выжимать требуемую логику за меньше asm команд, собственно про это и тема, в первом посте 2 Си-шных примера, которые хотел перевести максимально компактно на asm - пока не получается красиво.

ЗЫ ступил - через пару минут понял, что полином 3 порядка это 5 умножений и 3 сложения sm.gif

Сообщение отредактировал _Ivana - Jan 30 2012, 23:08
Go to the top of the page
 
+Quote Post
MaslovVG
сообщение Feb 3 2012, 08:27
Сообщение #3


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

Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134



Цитата(_Ivana @ Jan 31 2012, 03:03) *
ЗЫ ступил - через пару минут понял, что полином 3 порядка это 5 умножений и 3 сложения sm.gif

А если преобразовать полином к виду ((ах+в)x+c)x+d то получим три умножения три сложения
Go to the top of the page
 
+Quote Post
=GM=
сообщение Feb 3 2012, 08:53
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Ещё вот подумал об использовании фиксированной точки по сравнению с плавающей. В большинстве практических задач известен диапазон обрабатываемых величин и, как ни странно, диапазон не такой уж большой. Если взять к примеру 40-битную фиксированную точку, то диапазон предcтавимых чисел составит 240 дБ. Можно с Сатурна сообщения обрабатывать :-). В то же время быстродействие обработки фиксточки на порядок выше по сравнению с плавающей. Так что, стоит покумекать и принормировать свою задачу к определенному диапазону.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
maksimp
сообщение Feb 5 2012, 18:34
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(=GM= @ Feb 3 2012, 11:53) *
Ещё вот подумал об использовании фиксированной точки по сравнению с плавающей. В большинстве практических задач известен диапазон обрабатываемых величин и, как ни странно, диапазон не такой уж большой. Если взять к примеру 40-битную фиксированную точку, то диапазон предcтавимых чисел составит 240 дБ. Можно с Сатурна сообщения обрабатывать :-). В то же время быстродействие обработки фиксточки на порядок выше по сравнению с плавающей. Так что, стоит покумекать и принормировать свою задачу к определенному диапазону.

В плавучке мантисса занимает 23 бита плюс один не хранимый всегда равный 1. Итого 3 байта. Чтобы перемножить два числа нужно перемножить мантиссы. AVR выполняет умножение байт на байт за одну команду, чтобы перемножить два 3-байтовых числа нужно 9 команд умножения. И порядки сложить.
В плавучке вычисление spline = ds + tmp * (cs + tmp * (bs + as*tmp)); - то есть 6 операций - занимает 860 тактов (см ссылку выше в теме). то есть 146 тактов на операцию.

А чтобы перемножить два 40 битных числа с фиксированной точкой, то есть 5 байтных, нужно 25 команд умножения. Каждая команда умножения даёт два байта результата, которые нужно прибавить к промежуточному результату (для всех кроме 5 первых умножений). То есть нужно почти в 2 раза больше команд сложения ещё, 40 штук вроде. Итого уже 25*2+40*1=90 тактов. Это без учёта пересылок, вызова функций и т.д.

Таким образом 40 битная фиксированная точка может оказаться и вовсе не быстрее плавучки. И по крайней мере не на порядок быстрее.

Цитата(_Ivana @ Jan 30 2012, 18:48) *
я и так вынужден хранить в плавучке только дробные части чисел а целые - в отдельных байтах, чтобы не терять абсолютную точность!


Выглядит сомнительно. Плавучка не теряет точности целой части от того что появляется дробная. Вы точно убедились что это необходимо?

А ещё в требуемой заказчиком mega48P запросто может нехватить программной памяти! Её там всего 4 кб. Мало.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Ivana   asm на AVR   Jan 28 2012, 15:48
- - SasaVitebsk   Написано сумбурно и ничего не понятно. Но если у в...   Jan 28 2012, 17:27
- - _Ivana   Продолжая сумбурные имхоизлияния: Действительно, К...   Jan 28 2012, 21:13
|- - =GM=   Цитата(_Ivana @ Jan 28 2012, 21:13) Продо...   Feb 3 2012, 07:48
|- - demiurg_spb   Цитата(=GM= @ Feb 3 2012, 10:48) зависит ...   Feb 3 2012, 08:09
|- - =GM=   У товарища автора 13 идентичных каналов. Так что, ...   Feb 3 2012, 08:24
- - _Ivana   Пообщался с умными людьми, они мне вправили мозги ...   Jan 29 2012, 09:41
- - _Pasha   Ы! avr-libc Берем , курим папочку /libm/fplib/...   Jan 29 2012, 11:31
- - zombi   Не буду утверждать на 100% что это правильно, но у...   Jan 29 2012, 11:49
|- - _Pasha   Цитата(zombi @ Jan 29 2012, 14:49) Нифига...   Jan 29 2012, 12:07
- - _Ivana   _Pasha спасибо, покурю. Но одно из требований зака...   Jan 29 2012, 12:02
- - sigmaN   Если честно, то я не понимаю зачем плавучка на AVR...   Jan 30 2012, 01:14
|- - _Артём_   Цитата(sigmaN @ Jan 30 2012, 03:14) Если ...   Jan 30 2012, 04:23
|- - maksimp   Цитата(sigmaN @ Jan 30 2012, 04:14) Мне к...   Jan 30 2012, 05:53
|- - _Pasha   Цитата(sigmaN @ Jan 30 2012, 05:14) Если ...   Jan 30 2012, 07:20
- - Xenia   Те, кто согласны AVR32 тоже считать AVR-кой , могу...   Jan 30 2012, 07:44
- - _Ivana   Спасибо всем отписавшимся, а sigmaN - отдельное С...   Jan 30 2012, 15:48
- - _Pasha   Насколько я помню, вычисления полинома 3 порядка в...   Jan 30 2012, 21:32
|- - _Pasha   Цитата(_Ivana @ Jan 31 2012, 03:03) Сильн...   Jan 31 2012, 04:27
|- - _Pasha   Цитата(_Ivana @ Jan 31 2012, 03:03) Сильн...   Jan 31 2012, 04:27
|- - =GM=   Цитата(maksimp @ Feb 5 2012, 18:34) В пла...   Feb 7 2012, 14:37
- - sigmaN   ЦитатаА куда девать численные методы, которые не о...   Jan 31 2012, 21:00
- - _Ivana   _Pasha, спасибо за ссылку, сейчас нет возможности ...   Jan 31 2012, 21:30
- - sigmaN   Ну удачи Ваи. Надеюсь оно того стоит... Думаю зак...   Feb 1 2012, 00:50
- - WHALE   Может вам стоит подумать об оверклокинге? Если не...   Feb 1 2012, 05:19
- - _Pasha   Если товарисч заказчег не понимает, я бы ограничил...   Feb 1 2012, 05:51
- - _Ivana   =GM= P в моем случае - это фаза (четверть) периода...   Feb 3 2012, 17:19
- - sigmaN   В плавучке...Ойй не нравится мне ваш заказчик... )...   Feb 4 2012, 01:49
- - _Ivana   ЦитатаВыглядит сомнительно. Плавучка не теряет точ...   Feb 5 2012, 19:53
- - sigmaN   Программная память = flash в данном случае. И её д...   Feb 5 2012, 23:39
- - _Ivana   Верно - я прокололся Просто чаще встречался с огр...   Feb 6 2012, 10:54
- - _Ivana   Возможно вас это позабавит, но я написал на 1С сим...   Feb 11 2012, 09:15
- - sigmaN   1С? Нда.. Месье однако знает толк в извращениях и ...   Feb 11 2012, 22:33
- - _Ivana   Про Протеус и Маткад слышал, но ни разу не видел и...   Feb 11 2012, 23:49
- - ReAl   Оффтоп — просто вспомнилось. Где-то когда-то в эха...   Feb 12 2012, 12:01
|- - Ruslan1   Маленькое замечание. В старозатертые времена у Май...   Feb 12 2012, 20:24
|- - demiurg_spb   Цитата(Ruslan1 @ Feb 12 2012, 23:24) Може...   Feb 13 2012, 05:22
|- - Ruslan1   Цитата(demiurg_spb @ Feb 13 2012, 07:22) ...   Feb 13 2012, 16:01
|- - _Pasha   Цитата(Ruslan1 @ Feb 13 2012, 20:01) Хм. ...   Feb 13 2012, 16:52
- - _Ivana   С наличием плавучей библиотеки то как раз проблем ...   Feb 13 2012, 16:32


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

 


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


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