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

 
 
 
Reply to this topicStart new topic
> WinAVR & float, проблемы оптимизации
GIGAWAT
сообщение Apr 3 2007, 23:36
Сообщение #1


Участник
*

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



Приветствую 8)

Имеется девайс на Mega169.
Имеется некоторый код написанный под WinAVR.
Проблема в следующем.
Провожу вычисления с извлечением корня кубического, для этого я возводил число в степень 1/3 с помошью функции pow библиотеки math, все заработало, вычисляется, НО компилятор нормально работает с переменными float и double только без оптимизации кода, а без оптимизации в память не влезает основной код (rom всего 16К).
Незнаю даже, что делать?
Может есть вариант оптимизации отдельно взятого участка кода ?
Или может вообще отказаться от вещественных типов ? (однако неохота ,ибо уже парился с этим заставляя на асме вычислять корень кубический МК(HOLTEK HT49R50), который умел аппаратно токо складывать и умножать wacko.gif ) не зря же я на архитектуру AVR переехал smile3046.gif
Вобщем нужно мнение ОТЦОВ 8) a14.gif
Заранее спасибо.

З.Ы.
Если нужны уточнения, спрашивайте wink.gif
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 4 2007, 00:00
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(GIGAWAT @ Apr 3 2007, 23:36) *
Имеется девайс на Mega169.
Имеется некоторый код написанный под WinAVR.

Какая версия WinAVR

Цитата
Проблема в следующем.
Провожу вычисления с извлечением корня кубического, для этого я возводил число в степень 1/3 с помошью функции pow библиотеки math, все заработало, вычисляется, НО компилятор нормально работает с переменными float и double только без оптимизации кода, а без оптимизации в память не влезает основной код (rom всего 16К).

Попробуйте локализовать ошибку. Пожалуйта покажите код где проявляется 'ненормальность'.

В 95% случаях код не работает при включеной оптимизации, если не используется 'volatile'.

В GCC float и double - эквивалентны.

Цитата
Может есть вариант оптимизации отдельно взятого участка кода ?

Можно ставить разные уровни оптимизации для разных файлов, для этого нужно править макефайл.

Цитата
Или может вообще отказаться от вещественных типов ?

Это правильная мысль. Если можете не использовать float в своем проекте, не используйте.

Анатолий.
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Apr 4 2007, 00:34
Сообщение #3


Участник
*

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



1) Версия WinAVR-20060421.

2)Кусочек кода:

#include <math.h>
float x1;
float rezult;
main()
{
x1=pow(25,0.333);
rezult=x1*2;
}
Неработает собственно при любой попытке обращения к float.

3)Насчет разбивки по файлам и раздельной оптимизации, это хорошая мысль.

4)Я бы отказался, но я так и не нашел варианта как можно сделать числа с запятой (хотя бы с фиксированнной).
Когда я делал тоже самое на асме, я просто домножал целое число на 100 и принимал последние два числа, как бы за "числа после запятой". Так вот и вычислял домножением и делением на сто. Убого конечно, грамоздко (650 строк кода на асме cranky.gif ), но работало, формула четко просчитывалась.
Но неохота мне тоже самое мутить на С. Это же несерьезно blush.gif
Эсли вы знаете как заменить float, будте добры, подскажите rolleyes.gif

Плюс конечно неприятно, что при наличии пачки математических функций их можно просто выбросить на свалку истории, только из-за глюков оптимизации wacko.gif

Сообщение отредактировал GIGAWAT - Apr 4 2007, 00:35
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 4 2007, 01:24
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(GIGAWAT @ Apr 4 2007, 00:34) *
2)Кусочек кода:

#include <math.h>
float x1;
float rezult;
main()
{
x1=pow(25,0.333);
rezult=x1*2;
}
Неработает собственно при любой попытке обращения к float.


Что 'неработает', обясните. Что вы понимаете под 'попыткa обращения к float'?

Вы не видети вызова функции pow? Так его и не должно быть - это называеться вычисления во время компиляции. Оба аргумента функции 'pow' известны компилятору, о он ее вычисляет во время компиляции и результат присваивает переменной 'x1'. C rezult аналогично.

Вот что у меня в main, два присваивания констант переменным:
Код
   54:    8c eb           ldi    r24, 0xBC; 188
  56:    9f ee           ldi    r25, 0xEF; 239
  58:    aa e3           ldi    r26, 0x3A; 58
  5a:    b0 e4           ldi    r27, 0x40; 64
  5c:    80 93 60 00     sts    0x0060, r24
  60:    90 93 61 00     sts    0x0061, r25
  64:    a0 93 62 00     sts    0x0062, r26
  68:    b0 93 63 00     sts    0x0063, r27
x1=pow(25,0.333);
rezult=x1*2;
  6c:    8c eb           ldi    r24, 0xBC; 188
  6e:    9f ee           ldi    r25, 0xEF; 239
  70:    aa eb           ldi    r26, 0xBA; 186
  72:    b0 e4           ldi    r27, 0x40; 64
  74:    80 93 64 00     sts    0x0064, r24
  78:    90 93 65 00     sts    0x0065, r25
  7c:    a0 93 66 00     sts    0x0066, r26
  80:    b0 93 67 00     sts    0x0067, r27


Давайте другой пример.

Цитата
4)Я бы отказался, но я так и не нашел варианта как можно сделать числа с запятой (хотя бы с фиксированнной).
Когда я делал тоже самое на асме, я просто домножал целое число на 100 и принимал последние два числа, как бы за "числа после запятой". Так вот и вычислял домножением и делением на сто. Убого конечно, грамоздко (650 строк кода на асме cranky.gif ), но работало, формула четко просчитывалась.
Но неохота мне тоже самое мутить на С. Это же несерьезно blush.gif

Так и нужно делать. только на С это будет пару строк, работать в 10 раз быстрее чем с float и занимать на 2 KB меньше кода.


Цитата
Плюс конечно неприятно, что при наличии пачки математических функций их можно просто выбросить на свалку истории, только из-за глюков оптимизации wacko.gif


В данном примере я вижу правильную и хорошую работу оптимизатора.

Анатолий.

Сообщение отредактировал aesok - Apr 4 2007, 01:28
Go to the top of the page
 
+Quote Post
GIGAWAT
сообщение Apr 4 2007, 11:36
Сообщение #5


Участник
*

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



Да уж, накосячил я с примером кода tongue.gif

Вот:

#include <math.h>

float x1;
float rezult;
char=temp;
main()
{
temp=25;
x1=pow(temp, 0.333);
rezult=x1*2;
}

Вот так повеселее 8)
Суть в том, что когда оптимизация включена компилятор просто проскакивает строки с float и ничего не далает 8(.
ОДНАКО проблему я решил cool.gif
По вашей рекомендации добавил к переменным float приставочку volatile, и все заработало с оптимизацией -0s, но при этом участок кода с float само сабой особо не уменьшается, осталось проверить, хватит ли места в памяти.

Насчет вычислений без применения float, вы меня конечно порадовали, а то я считал, что у меня был принципиально неправильный подход в решении данной задачи.
Спасибо за вашу помощ. wink.gif

Сообщение отредактировал GIGAWAT - Apr 4 2007, 11:39
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 4 2007, 12:14
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(GIGAWAT @ Apr 4 2007, 11:36) *
ОДНАКО проблему я решил cool.gif
По вашей рекомендации добавил к переменным float приставочку volatile, и все заработало с оптимизацией -0s, ...


Я вам этого не рекомендовал, модифакатор volatile используеться для отключения оттимизации доступа к переменной. И должен применятьса только тогда, когда это дейсвительно нужно. Прочитайте FAQ #1 в avr-libc-user-manual.

Анатолий.
Go to the top of the page
 
+Quote Post
tocha
сообщение Aug 21 2007, 16:46
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 92
Регистрация: 16-05-05
Из: Kiev
Пользователь №: 5 080



Нужно посчитать кубический корень. Подскажите, кто, каким алгоритмом пользуется. Заранее благодарен.
Go to the top of the page
 
+Quote Post

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

 


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


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