Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: плавающая точка
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dimka76
пример проекта умножения с плавающей точкой.
работает быстрее, чем стандартная Си операция благодаря использованию аппаратного умножителя.
Подходит только для серии Mega
Kuzmi4
так вроде ж есть тема специально для исходников сверху.....
Или вывыложили потестить??
05.gif
dimka76
Цитата(Kuzmi4 @ Aug 16 2007, 17:13) *
так вроде ж есть тема специально для исходников сверху.....
Или вывыложили потестить??
05.gif


Я туда тоже выложил, но сначала сюда - по ошибке 05.gif
m16
плавучка на 8-ми битнике? глупости всё это . целочисленки за глаза хватает и пошустрее будет
Proton
Цитата(dimka76 @ Aug 16 2007, 18:48) *
работает быстрее, чем стандартная Си операция благодаря использованию аппаратного умножителя.

Причём тут аппаратный умножитель? ИАР его уже давно использует. Выигрыш действительно есть 173цикла против 210 ИАРовских, но это не за счёт умножителя, а за счёт уменьшения гибкости реализации(перемножение только фиксированных переменных).
dimka76
Цитата(Proton @ Aug 16 2007, 18:42) *
Причём тут аппаратный умножитель? ИАР его уже давно использует. Выигрыш действительно есть 173цикла против 210 ИАРовских, но это не за счёт умножителя, а за счёт уменьшения гибкости реализации(перемножение только фиксированных переменных).



Попробуйте написать такой код:

void main(void)
{
float a = 4.56789;
float b = 10.45321; // или любые другие цифры

a = a*b;
}

И посмотрите сгенерированный IARом ассемблерный код. И никаких mul вы там не увидите.
А время выполнения составит порядка 600 тактов. На asme порядка 200 - 300 тактов.
mse
Аналогичная библиотека пролетала года три-четыре назад. Подключалась к ИАР
Kuzmi4
А продолжении темы - так а давайте кто нибудь потестит этот код и други - например тут про иар было заявление и выложит результаты.. Ну что б пустого трёпа не возникало....
Я думаю всем будет интересно... smile.gif
Dog Pawlowa
Цитата(Kuzmi4 @ Aug 17 2007, 09:44) *
А продолжении темы - так а давайте кто нибудь потестит этот код и други - например тут про иар было заявление и выложит результаты.. Ну что б пустого трёпа не возникало....
Я думаю всем будет интересно... smile.gif

Ну, интерес преувеличен.
Обычно - или тупо плавучка, встроенная в компилятор, или целочисленная арифметика с тщательной проверкой, чтобы не было выхода за диапазон. Разбираться с какой-то левой библиотекой ? 05.gif
Ни за что! smile.gif
_artem_
Цитата(dimka76 @ Aug 17 2007, 08:04) *
Попробуйте написать такой код:

void main(void)
{
float a = 4.56789;
float b = 10.45321; // или любые другие цифры

a = a*b;
}

И посмотрите сгенерированный IARом ассемблерный код. И никаких mul вы там не увидите.
А время выполнения составит порядка 600 тактов. На asme порядка 200 - 300 тактов.


Хорошо бы это проверить тем у кого покупной иар стоит а не еволюейшн.
aleksey_g
iar 430a не купленный, лицензия сгенерирована.
Оптимизация отключена. мега48 195 тактов.
MUL используется вовсю.
Вот кусок (не весь) полученного кода:
+000003A2: 9F04 MUL R16,R20 Multiply unsigned
+000003A3: 01F0 MOVW R30,R0 Copy register pair
+000003A4: 9F05 MUL R16,R21 Multiply unsigned
+000003A5: 0DF0 ADD R31,R0 Add without carry
+000003A6: 2D71 MOV R23,R1 Copy register
+000003A7: 1F73 ADC R23,R19 Add with carry
+000003A8: 9F14 MUL R17,R20 Multiply unsigned
+000003A9: 0DF0 ADD R31,R0 Add without carry
+000003AA: 1D71 ADC R23,R1 Add with carry
+000003AB: 1C22 ROL R2 Rotate Left Through Carry
+000003AC: 9F06 MUL R16,R22 Multiply unsigned
+000003AD: 0D70 ADD R23,R0 Add without carry
+000003AE: 1C21 ADC R2,R1 Add with carry
+000003AF: 1C33 ROL R3 Rotate Left Through Carry
+000003B0: 9F15 MUL R17,R21 Multiply unsigned
+
_artem_
aleksey_g, большое спасибо. Mда, у меня тоже mul есть.

reducted ...
dimka76
Цитата(aleksey_g @ Aug 17 2007, 13:01) *
iar 430a не купленный, лицензия сгенерирована.
Оптимизация отключена. мега48 195 тактов.
MUL используется вовсю.
Вот кусок (не весь) полученного кода:
+000003A2: 9F04 MUL R16,R20 Multiply unsigned
+000003A3: 01F0 MOVW R30,R0 Copy register pair
+000003A4: 9F05 MUL R16,R21 Multiply unsigned
+000003A5: 0DF0 ADD R31,R0 Add without carry
+000003A6: 2D71 MOV R23,R1 Copy register
+000003A7: 1F73 ADC R23,R19 Add with carry
+000003A8: 9F14 MUL R17,R20 Multiply unsigned
+000003A9: 0DF0 ADD R31,R0 Add without carry
+000003AA: 1D71 ADC R23,R1 Add with carry
+000003AB: 1C22 ROL R2 Rotate Left Through Carry
+000003AC: 9F06 MUL R16,R22 Multiply unsigned
+000003AD: 0D70 ADD R23,R0 Add without carry
+000003AE: 1C21 ADC R2,R1 Add with carry
+000003AF: 1C33 ROL R3 Rotate Left Through Carry
+000003B0: 9F15 MUL R17,R21 Multiply unsigned
+



а какие настройки проекта


Цитата(aleksey_g @ Aug 17 2007, 13:01) *
iar 430a не купленный, лицензия сгенерирована.
Оптимизация отключена. мега48 195 тактов.
MUL используется вовсю.
Вот кусок (не весь) полученного кода:
+000003A2: 9F04 MUL R16,R20 Multiply unsigned
+000003A3: 01F0 MOVW R30,R0 Copy register pair
+000003A4: 9F05 MUL R16,R21 Multiply unsigned
+000003A5: 0DF0 ADD R31,R0 Add without carry
+000003A6: 2D71 MOV R23,R1 Copy register
+000003A7: 1F73 ADC R23,R19 Add with carry
+000003A8: 9F14 MUL R17,R20 Multiply unsigned
+000003A9: 0DF0 ADD R31,R0 Add without carry
+000003AA: 1D71 ADC R23,R1 Add with carry
+000003AB: 1C22 ROL R2 Rotate Left Through Carry
+000003AC: 9F06 MUL R16,R22 Multiply unsigned
+000003AD: 0D70 ADD R23,R0 Add without carry
+000003AE: 1C21 ADC R2,R1 Add with carry
+000003AF: 1C33 ROL R3 Rotate Left Through Carry
+000003B0: 9F15 MUL R17,R21 Multiply unsigned
+


а подскажите где лекарство брали
Proton
Цитата(dimka76 @ Aug 16 2007, 12:04) *
Попробуйте написать такой код:

void main(void)
{
float a = 4.56789;
float b = 10.45321; // или любые другие цифры

a = a*b;
}

Код писал и даже привёл результаты его выполнения в тактах. Или Вы считаете что если изменить сомножители аппаратный умножитель не будет использоваться?

Цитата(dimka76 @ Aug 16 2007, 18:48) *
пример проекта умножения с плавающей точкой.
Подходит только для серии Mega

А по какой причине происходит дискриминация семейства tiny? Ведь оперативки требуется около 70 байт, практически у всех контроллеров семейства tiny её больше. Компилируется и работает это всё на них без проблем, или может я что-то не так делаю?
dimka76
Цитата(Proton @ Aug 17 2007, 20:10) *
Код писал и даже привёл результаты его выполнения в тактах. Или Вы считаете что если изменить сомножители аппаратный умножитель не будет использоваться?
А по какой причине происходит дискриминация семейства tiny? Ведь оперативки требуется около 70 байт, практически у всех контроллеров семейства tiny её больше. Компилируется и работает это всё на них без проблем, или может я что-то не так делаю?


У меня IAR 4.11 и при использовании операций с плавающей точкой компилятор не использует аппаратный умножитель. При любых сочетаниях сомножителей.
У тини нет аппаратного умножителя.
pokos
У меня IAR 4.12, тоже не использует умножитель.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.