|
IAR Inline, Как заставить ? |
|
|
|
Jul 18 2017, 09:52
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Добрый день, подскажите как заставить компилятор проинлайнить функции. Изначально у меня все функции было в одном модуле, и объявлены как 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 - Jul 18 2017, 09:52
|
|
|
|
|
Jul 18 2017, 11:36
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(pokk @ Jul 18 2017, 12:52)  Может не правильно их объявляю? Код #pragma inline=forced inline float32_t Func1(float32_t Data1,float32_t Data2){ ......... } Надеюсь это вынесено в хидер? И включена полная оптимизация? и галка с пункта "Function inlining" в свойствах проекта не снята? И нигде нет взятия адреса функции? Цитата(pokk @ Jul 18 2017, 12:52)  и в хедере Код extern void Handler_adc(void); А это тут к чему???
|
|
|
|
|
Jul 19 2017, 02:47
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Цитата Надеюсь это вынесено в хидер? Размещение всей функции в хидере? Остальное все да. Цитата А это тут к чему??? Ой прошу прошение не то указал, в общем, прерывания от АЦП разместил в модуле АЦП, а обработку самих данных завернул в функцию и решил вынести от туда в отдельный модуль, и при этом не хочу что бы это как-то влияло на быстродействие. Там функция получилась Код void Handler_adc(void){ ... } Нету ни входных ни выходных параметров, само то что бы её инлайнить, но увы
|
|
|
|
|
Jul 19 2017, 08:43
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(pokk @ Jul 19 2017, 05:47)  Размещение всей функции в хидере? Остальное все да. Вызывается она из скольких мест? Попробуйте сделать её вызов только из одного места. Цитата(pokk @ Jul 19 2017, 05:47)  void Handler_adc(void) Нету ни входных ни выходных параметров, само то что бы её инлайнить, но увы  Это ISR что-ли? Если так, то естественно, что он не может быть заинлайнен.
|
|
|
|
|
Jul 19 2017, 08:51
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Да вызывается в одном месте. Код void SAI1_IRQHandler(void){ // Прерывание приема АЦП TEST_ON Handler_adc(); SAI1_Block_A->CLRFR|=SAI_xCLRFR_CFREQ; TEST_OFF NOP; } Код void Handler_adc(void){ ..... }
|
|
|
|
|
Jul 20 2017, 01:41
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Цитата(scifi @ Jul 19 2017, 20:46)  Я бы другим вопросом тоже задался: а что вам эти инлайны, жизнь без них не мила что ли? Хотите "быстро-быстро" - дайте компилятору соответствующий ключик, чтобы оптимизировал. Ручками расставлять "инлайн" - это как помечать переменные "регистр", т.е. давно уже моветон. Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ?
|
|
|
|
|
Jul 20 2017, 06:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(pokk @ Jul 20 2017, 04:41)  Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? Пардон что влез. Может чевой наоборот, убрать ? Не подерутся инлайновые галочки с галками оптимизации по размеру ? И кто победит ?
|
|
|
|
|
Jul 20 2017, 07:30
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(x893 @ Jul 19 2017, 21:19)  Иногда бывает нужно. На счет максимального уровня оптимизации - это правда (но есть ньюансы). Но не только на максимальном уровне можно использовать inline. Книжки написаны про это уже лет 40 - можно прочитать. И это ТС знает (про прагму). IAR несколько лет назад всего лишь 20 лет отмечал: "In Code we trust". (; Цитата Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? Дык галочки это и есть ключи.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jul 20 2017, 08:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(pokk @ Jul 20 2017, 04:41)  Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? Если Вы действительно хотите "быстро-быстро", то во-первых - ассемблер. Во-вторых: Всегда при оптимизации в первую очередь надо думать над алгоритмом. Наличие аргументов с плавающей точкой при обработке данных АЦП уже как бы даёт основания полагать, что у Вас там далеко не всё оптимально. И когда избавитесь от float, увидите, что inline даёт сущие крохи по сравнению с float. И об inline надо думать уже в последнюю очередь (при оптимизации по скорости). Цитата(x893 @ Jul 19 2017, 20:19)  Иногда бывает нужно. При оптимизации по скорости, об inline стоит думать в последнюю очередь. И то - если функция совсем простая - из пары действий. inline, имхо, более полезен не для ускорения, а для например: уменьшения расхода стека на локальные переменные - вот это более важно. Вот в таком случае было бы очень полезно явно указывать компилятору, что функцию "обязательно inline-ить".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|