|
|
  |
WinAVR & float, проблемы оптимизации |
|
|
|
Apr 3 2007, 23:36
|
Участник

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

|
Приветствую 8) Имеется девайс на Mega169. Имеется некоторый код написанный под WinAVR. Проблема в следующем. Провожу вычисления с извлечением корня кубического, для этого я возводил число в степень 1/3 с помошью функции pow библиотеки math, все заработало, вычисляется, НО компилятор нормально работает с переменными float и double только без оптимизации кода, а без оптимизации в память не влезает основной код (rom всего 16К). Незнаю даже, что делать? Может есть вариант оптимизации отдельно взятого участка кода ? Или может вообще отказаться от вещественных типов ? (однако неохота ,ибо уже парился с этим заставляя на асме вычислять корень кубический МК(HOLTEK HT49R50), который умел аппаратно токо складывать и умножать  ) не зря же я на архитектуру AVR переехал Вобщем нужно мнение ОТЦОВ 8) Заранее спасибо. З.Ы. Если нужны уточнения, спрашивайте
|
|
|
|
|
Apr 4 2007, 00:00
|
Знающий
   
Группа: Участник
Сообщений: 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 в своем проекте, не используйте. Анатолий.
|
|
|
|
|
Apr 4 2007, 00:34
|
Участник

Группа: Участник
Сообщений: 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 строк кода на асме  ), но работало, формула четко просчитывалась. Но неохота мне тоже самое мутить на С. Это же несерьезно Эсли вы знаете как заменить float, будте добры, подскажите Плюс конечно неприятно, что при наличии пачки математических функций их можно просто выбросить на свалку истории, только из-за глюков оптимизации
Сообщение отредактировал GIGAWAT - Apr 4 2007, 00:35
|
|
|
|
|
Apr 4 2007, 01:24
|
Знающий
   
Группа: Участник
Сообщений: 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 строк кода на асме  ), но работало, формула четко просчитывалась. Но неохота мне тоже самое мутить на С. Это же несерьезно  Так и нужно делать. только на С это будет пару строк, работать в 10 раз быстрее чем с float и занимать на 2 KB меньше кода. Цитата Плюс конечно неприятно, что при наличии пачки математических функций их можно просто выбросить на свалку истории, только из-за глюков оптимизации  В данном примере я вижу правильную и хорошую работу оптимизатора. Анатолий.
Сообщение отредактировал aesok - Apr 4 2007, 01:28
|
|
|
|
|
Apr 4 2007, 11:36
|
Участник

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

|
Да уж, накосячил я с примером кода Вот: #include <math.h> float x1; float rezult; char=temp; main() { temp=25; x1=pow(temp, 0.333); rezult=x1*2; } Вот так повеселее 8) Суть в том, что когда оптимизация включена компилятор просто проскакивает строки с float и ничего не далает 8(. ОДНАКО проблему я решил По вашей рекомендации добавил к переменным float приставочку volatile, и все заработало с оптимизацией -0s, но при этом участок кода с float само сабой особо не уменьшается, осталось проверить, хватит ли места в памяти. Насчет вычислений без применения float, вы меня конечно порадовали, а то я считал, что у меня был принципиально неправильный подход в решении данной задачи. Спасибо за вашу помощ.
Сообщение отредактировал GIGAWAT - Apr 4 2007, 11:39
|
|
|
|
|
Apr 4 2007, 12:14
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(GIGAWAT @ Apr 4 2007, 11:36)  ОДНАКО проблему я решил По вашей рекомендации добавил к переменным float приставочку volatile, и все заработало с оптимизацией -0s, ... Я вам этого не рекомендовал, модифакатор volatile используеться для отключения оттимизации доступа к переменной. И должен применятьса только тогда, когда это дейсвительно нужно. Прочитайте FAQ #1 в avr-libc-user-manual. Анатолий.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|