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

 
 
 
Reply to this topicStart new topic
> Как заставить IAR
_Артём_
сообщение Mar 25 2007, 00:09
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



не использовать команду CALL при вызове inline-функции?
Но не используя макросы.
Go to the top of the page
 
+Quote Post
Alex11
сообщение Mar 25 2007, 00:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



#pragma inline=forced
Это если собственная функция объявлена как inline, а если встроенная, то может и не помочь.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 25 2007, 01:56
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alex11 @ Mar 24 2007, 23:44) *
#pragma inline=forced
Это если собственная функция объявлена как inline, а если встроенная, то может и не помочь.


То есть функция вида

inline void SomeFunction(void)
{
// тело функции
}

не будет откомпилирована как inline-функция? Почему?
Кстати функция своя, а не встроенная
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 25 2007, 03:11
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(_Артём_ @ Mar 25 2007, 00:56) *
не будет откомпилирована как inline-функция? Почему?
Кстати функция своя, а не встроенная
Режим компиляции С или С++? Если С, то static void SomeFunction(void); если С++, то как сказал Alex11
Код
#pragma inline=forced
inline void SomeFunction(void)
{
// тело функции
}
или
_Pragma("inline=forced") inline void SomeFunction(void)
{
// тело функции
}
Но это определение функции должно быть в той же единице компиляции, что и место вызова (т.е. не в другом С/С++ файле).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 25 2007, 11:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Для 'С++' компиляторов inline штатный прибамбас, посему:
inline void SomeFunction(void)
Для 'C' компиляторов возможность инлайнить функции поддерживается опционально, как кому удобнее. Конкретно у IAR поддерживается через #pragma inline, причем #pragma перед объявлением прототипа функции.
Квалификатор inline у 'C' компиляторов обычно такой smile.gif :
#define inline

Это:
Цитата(Сергей Борщ @ Mar 25 2007, 02:11) *
#pragma inline=forced
inline void SomeFunction(void)

уже попытка сделать "масло масляное".

Цитата(_Артём_ @ Mar 24 2007, 23:09) *
не использовать команду CALL при вызове inline-функции?

Почитать документацию на IAR компилятор, там все подробно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 25 2007, 12:03
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ Mar 25 2007, 10:40) *
Для 'С++' компиляторов inline штатный прибамбас, посему:
Это:
... Тут поскипана цитата, восстанавливать лень, жалобы к Esquire...
уже попытка сделать "масло масляное".
А вот вам фиг! "просто" inline выражает компилятору наше желание заинлайнить. Но он, руководствуясь своими соображениями (а конкретно - количеством вызовов данной функции в данном файле) может наше желание проигнорировать и оставить вызов функции. _Pragma("inline=forced") или #pragma inline=forced заставляет компилятор отставить самодеятельность и делать как сказано.
Цитата(zltigo @ Mar 25 2007, 10:40) *
Почитать документацию на IAR компилятор, там все подробно.
Воистину
Цитата
Whether the inlining actually takes place is subject to the compiler’s heuristics. Specifying #pragma inline=forced disables the compiler’s heuristics and forces the inlining. If the inlining fails for some reason, for example if it cannot be used with the function type in question (like printf), an error message is emitted.
tongue.gif
Цитата(zltigo @ Mar 25 2007, 10:40) *
Для 'C' компиляторов возможность инлайнить функции поддерживается опционально, как кому удобнее.
Угу. Как там насчет документации было выше? wink.gif
Цитата
#pragma inline[=forced] This is similar to the C++ keyword inline, but has the advantage of being available in C code.
В вопросе явно был указан IAR. А объявление функции как static при одном-двух вызовах в единице компиляции часто приводит к встраиванию и без прагмы.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 25 2007, 12:25
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Mar 25 2007, 11:03) *
А вот вам фиг! "просто" inline выражает компилятору наше желание заинлайнить. Но....

Что фиг? Зачем к категоричной
#pragma inline=forced
добавлено еще и ключевое слово inline?
Вот я и говорю "масло маслянное". Кроме того, inline, в IARовском 'C' еще и сообщение об ошибке вызовет.



Цитата(Сергей Борщ @ Mar 25 2007, 11:03) *
Угу. Как там насчет документации было выше? wink.gif

Не понял sad.gif В 'C' компиляторах нет унифицированного способа (а то и возможности) приказать инлайнить функции. Конкретно в IAR есть через прагму. Ну и?
Цитата
В вопросе явно был указан IAR. А объявление функции как static при одном-двух вызовах в единице компиляции часто приводит к встраиванию и без прагмы.

Или нет, или да ...
Не совсем понимаю о чем мы начали говорить?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 25 2007, 12:35
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(zltigo @ Mar 25 2007, 11:25) *
Что фиг? Зачем к категоричной
#pragma inline=forced
добавлено еще и ключевое слово inline?
Вот я и говорю "масло маслянное".

Я читал сверху вниз и фразы
Цитата
Для 'С++' компиляторов inline штатный прибамбас, посему:
inline void SomeFunction(void)
и
Цитата
Это:
уже попытка сделать "масло масляное
воспринял именно в таком порядке, т.е. "если есть inline, то зачем еще и #pragma"

Отвечу и на обратное - ключевое слово inline поддерживается всеми C++ компиляторами, поэтому должно быть указано там, где желаемо встраивание (для портируемости). А прагма может быть в виде
#define INLINE _Pragma("inline=forced")
или
#define INLINE
в зависимости от используемого компилятора.
Цитата(zltigo @ Mar 25 2007, 11:25) *
Кроме того, inline, в IARовском 'C' еще и сообщение об ошибке вызовет.
Имеет право. Тогда #define inline _Pragma("inline=forced")


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 25 2007, 13:51
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Mar 25 2007, 11:35) *
#define inline _Pragma("inline=forced")

Кстати, о =forced. Я бы не стал его огульно использовать. Я всегда и раньше насилия интуитивно избегал, а тут буквально несколько недель назад писал (конкретно IAR ARM)обработчик FIQ по работе с 7,5 MHz Slave SPI, ну и был там кусочек кода не очень-то и сложный - вариации на тему SLIP передачи вызвывемый трижды. Макрос городить не стал - запутанный, зато заинлайнил. В ощем-то все задышало и по скорости почти прошло и для дальнейшего улучщения полез я в листинг. Удивился, что на НЕ заинлайнилось, ну думаю, я сейчас его заставлю и будет мне полное счастье. Заставил =forced и .... провалился по скорости до полной неработоспособности. Подробное рассмотрение результата показало заметное ухудшение общей оптимизации, появление локальных переменных для которых места в регистрах не хватило. В общем накладные расходы на вызов функции оказались много менее страшным злом для компилятора.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 25 2007, 16:07
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alex11 @ Mar 25 2007, 00:44) *
#pragma inline=forced
Это если собственная функция объявлена как inline, а если встроенная, то может и не помочь.


Спасибо, помогло...
Go to the top of the page
 
+Quote Post

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

 


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


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