Перейти к содержанию
    

Добрый день, подскажите как заставить компилятор проинлайнить функции.

 

Изначально у меня все функции было в одном модуле, и объявлены как static + inline, и компилятор их на самом деле инлайнил, но со временем модуль разросся, и теперь хочу некоторые выделить в отдельный модуль, но увы IAR 7.5 не хочит их инлайнить даже при "Multi-file Compilation"

 

Может не правильно их объявляю?

 

#pragma inline=forced
inline float32_t Func1(float32_t Data1,float32_t Data2){
.........
}

и в хедере

extern void Handler_adc(void);

При включенной галки "Multi-file Compilation" компилятор это все компилирует но вставление тела функции я не вижу =((

Изменено пользователем pokk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR C/C++ Development Guide

"Inlining is normally performed only on the High optimization level. Specifying

#pragma inline=forced will enable inlining of the function in question also on the

Medium optimization level."

 

Шикарный Index в этой DevGuide - много полезного и интересного (;

 

PS: о, прошу прощения, вы в курсе прагмы…

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может не правильно их объявляю?

#pragma inline=forced
inline float32_t Func1(float32_t Data1,float32_t Data2){
.........
}

Надеюсь это вынесено в хидер? И включена полная оптимизация? и галка с пункта "Function inlining" в свойствах проекта не снята? И нигде нет взятия адреса функции?

 

и в хедере

extern void Handler_adc(void);

А это тут к чему???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надеюсь это вынесено в хидер?

Размещение всей функции в хидере? Остальное все да.

 

А это тут к чему???

Ой прошу прошение не то указал, в общем, прерывания от АЦП разместил в модуле АЦП, а обработку самих данных завернул в функцию и решил вынести от туда в отдельный модуль, и при этом не хочу что бы это как-то влияло на быстродействие. Там функция получилась

void  Handler_adc(void){
...
}

Нету ни входных ни выходных параметров, само то что бы её инлайнить, но увы :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Размещение всей функции в хидере? Остальное все да.

Вызывается она из скольких мест? Попробуйте сделать её вызов только из одного места.

 

void Handler_adc(void)

Нету ни входных ни выходных параметров, само то что бы её инлайнить, но увы :(

Это ISR что-ли? Если так, то естественно, что он не может быть заинлайнен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вызывается в одном месте.

void SAI1_IRQHandler(void){   // Прерывание приема АЦП
    TEST_ON
    Handler_adc();  
    SAI1_Block_A->CLRFR|=SAI_xCLRFR_CFREQ;
    TEST_OFF
    NOP;
}

 

void Handler_adc(void){
.....
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задайтесь вопросом - почему static inline ... функции размещают в .h файле.

Как ответите - сразу на свой вопрос ответ найдёте.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задайтесь вопросом - почему static inline ... функции размещают в .h файле.

Как ответите - сразу на свой вопрос ответ найдёте.

Я бы другим вопросом тоже задался: а что вам эти инлайны, жизнь без них не мила что ли? Хотите "быстро-быстро" - дайте компилятору соответствующий ключик, чтобы оптимизировал. Ручками расставлять "инлайн" - это как помечать переменные "регистр", т.е. давно уже моветон.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы другим вопросом тоже задался: а что вам эти инлайны, жизнь без них не мила что ли? Хотите "быстро-быстро" - дайте компилятору соответствующий ключик, чтобы оптимизировал. Ручками расставлять "инлайн" - это как помечать переменные "регистр", т.е. давно уже моветон.

В том-то и прикол: инлайны реализуются в IARе на максимальном уровне оптимизации (;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иногда бывает нужно.

На счет максимального уровня оптимизации - это правда (но есть ньюансы).

Но не только на максимальном уровне можно использовать inline.

Книжки написаны про это уже лет 40 - можно прочитать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы другим вопросом тоже задался: а что вам эти инлайны, жизнь без них не мила что ли? Хотите "быстро-быстро" - дайте компилятору соответствующий ключик, чтобы оптимизировал. Ручками расставлять "инлайн" - это как помечать переменные "регистр", т.е. давно уже моветон.

Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ?

Пардон что влез.

Может чевой наоборот, убрать ?

Не подерутся инлайновые галочки с галками оптимизации по размеру ? И кто победит ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ?

И что, не успевает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иногда бывает нужно.

На счет максимального уровня оптимизации - это правда (но есть ньюансы).

Но не только на максимальном уровне можно использовать inline.

Книжки написаны про это уже лет 40 - можно прочитать.

И это ТС знает (про прагму).

 

IAR несколько лет назад всего лишь 20 лет отмечал: "In Code we trust". (;

 

Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ?

Дык галочки это и есть ключи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ?

Если Вы действительно хотите "быстро-быстро", то во-первых - ассемблер.

Во-вторых: Всегда при оптимизации в первую очередь надо думать над алгоритмом. Наличие аргументов с плавающей точкой при обработке данных АЦП уже как бы даёт основания полагать, что у Вас там далеко не всё оптимально.

И когда избавитесь от float, увидите, что inline даёт сущие крохи по сравнению с float. И об inline надо думать уже в последнюю очередь (при оптимизации по скорости).

 

Иногда бывает нужно.

При оптимизации по скорости, об inline стоит думать в последнюю очередь. И то - если функция совсем простая - из пары действий.

inline, имхо, более полезен не для ускорения, а для например: уменьшения расхода стека на локальные переменные - вот это более важно. Вот в таком случае было бы очень полезно явно указывать компилятору, что функцию "обязательно inline-ить".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...