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

 
 
> 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
 
Start new topic
Ответов
GIGAWAT
сообщение Apr 4 2007, 00:34
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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



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

 


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


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