Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как заставить IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
_Артём_
не использовать команду CALL при вызове inline-функции?
Но не используя макросы.
Alex11
#pragma inline=forced
Это если собственная функция объявлена как inline, а если встроенная, то может и не помочь.
_Артём_
Цитата(Alex11 @ Mar 24 2007, 23:44) *
#pragma inline=forced
Это если собственная функция объявлена как inline, а если встроенная, то может и не помочь.


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

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

не будет откомпилирована как inline-функция? Почему?
Кстати функция своя, а не встроенная
Сергей Борщ
Цитата(_Артём_ @ 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)
{
// тело функции
}
Но это определение функции должно быть в той же единице компиляции, что и место вызова (т.е. не в другом С/С++ файле).
zltigo
Для 'С++' компиляторов 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 компилятор, там все подробно.
Сергей Борщ
Цитата(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 при одном-двух вызовах в единице компиляции часто приводит к встраиванию и без прагмы.
zltigo
Цитата(Сергей Борщ @ 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 при одном-двух вызовах в единице компиляции часто приводит к встраиванию и без прагмы.

Или нет, или да ...
Не совсем понимаю о чем мы начали говорить?
Сергей Борщ
Цитата(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")
zltigo
Цитата(Сергей Борщ @ Mar 25 2007, 11:35) *
#define inline _Pragma("inline=forced")

Кстати, о =forced. Я бы не стал его огульно использовать. Я всегда и раньше насилия интуитивно избегал, а тут буквально несколько недель назад писал (конкретно IAR ARM)обработчик FIQ по работе с 7,5 MHz Slave SPI, ну и был там кусочек кода не очень-то и сложный - вариации на тему SLIP передачи вызвывемый трижды. Макрос городить не стал - запутанный, зато заинлайнил. В ощем-то все задышало и по скорости почти прошло и для дальнейшего улучщения полез я в листинг. Удивился, что на НЕ заинлайнилось, ну думаю, я сейчас его заставлю и будет мне полное счастье. Заставил =forced и .... провалился по скорости до полной неработоспособности. Подробное рассмотрение результата показало заметное ухудшение общей оптимизации, появление локальных переменных для которых места в регистрах не хватило. В общем накладные расходы на вызов функции оказались много менее страшным злом для компилятора.
_Артём_
Цитата(Alex11 @ Mar 25 2007, 00:44) *
#pragma inline=forced
Это если собственная функция объявлена как inline, а если встроенная, то может и не помочь.


Спасибо, помогло...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.