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

 
 
> Keil, оптимизация математики, почему так и что делать?
demiurg_spb
сообщение Apr 29 2011, 08:32
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Опции компиляции:
Код
--feedback ".\obj\xxxx.fed" -c --cpu Cortex-M3 -D__MICROLIB  -g -O3 -Otime --apcs=interwork --split_sections --asm --interleave --C99  --asm --interleave -I "C:\Keil\\ARM\INC" -I

Пример:
Код
float func(float x)
{
    return (x*pow(0.1, 0.01));
}

Этот негодяй прилинковывает функцию pow и по ходу дела считает её в рантайме, а не на этапе компиляции.
С gcc таких сюрпризов не припоминаю.
Есть идеи куда копать?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Apr 29 2011, 14:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



А если попробовать сделать так:
Код
static float pow_01_001(void)
{  
   return (pow(0.1, 0.01));
}

float func(float x)
{
     return (x*pow_01_001());
}


--------------------
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 30 2011, 08:27
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(prottoss @ Apr 29 2011, 18:40) *
А если попробовать сделать так:
Код
static float pow_01_001(void)...
Попробовал - нет разницы.

Цитата(scifi @ Apr 29 2011, 18:23) *
Нет, не только. Ещё assert_static().
Я STATIC_ASSERT(...) регулярно применяю, и в этом случае тоже пришлось. Может кому пригодится:
CODE
/*
* ASSERTION - УТВЕРЖДЕНИЕ
*
* Example of usage:
* STATIC_ASSERT(sizeof(int) > 4); // produce error in ARM or X86 machine
*
*/

#ifndef _STATIC_ASSERT_H_
#define _STATIC_ASSERT_H_

#ifdef __cplusplus
template<bool> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
# define STATIC_ASSERT(expr) (CompileTimeError<(expr) != 0>())
#else
# define MY_JOIN_3_H(A,B,C) A##B##C
# define MY_JOIN_3(A,B,C) MY_JOIN_3_H(A,B,C)
# define STATIC_ASSERT_H(expr) typedef int MY_JOIN_3(static_assert_,__LINE__,_h) [(expr) ? 1 : -1]
# define STATIC_ASSERT(expr) STATIC_ASSERT_H(expr)
#endif

#endif //_STATIC_ASSERT_H_

Цитата(ReAl @ Apr 30 2011, 03:05) *
В сторону Klen-овой сборки arm-gcc ? rolleyes.gif
Я бы и рад, но на новом месте работы keil и бастаsad.gif

2DevL: Да, шаблоны - вещь приятная и полезная, но проект без плюсов...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Apr 30 2011, 08:46
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(demiurg_spb @ Apr 30 2011, 15:27) *
Попробовал - нет разницы.
А если вообще попробовать static float pow_01_001(void) упрятать в другой юнит?

Или запихать в цикл do{...}while(0)


--------------------
Go to the top of the page
 
+Quote Post



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

 


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


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