pokk 0 18 июля, 2017 Опубликовано 18 июля, 2017 (изменено) · Жалоба Добрый день, подскажите как заставить компилятор проинлайнить функции. Изначально у меня все функции было в одном модуле, и объявлены как 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" компилятор это все компилирует но вставление тела функции я не вижу =(( Изменено 18 июля, 2017 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 18 июля, 2017 Опубликовано 18 июля, 2017 (изменено) · Жалоба 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: о, прошу прощения, вы в курсе прагмы… Изменено 18 июля, 2017 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 18 июля, 2017 Опубликовано 18 июля, 2017 · Жалоба Может не правильно их объявляю? #pragma inline=forced inline float32_t Func1(float32_t Data1,float32_t Data2){ ......... } Надеюсь это вынесено в хидер? И включена полная оптимизация? и галка с пункта "Function inlining" в свойствах проекта не снята? И нигде нет взятия адреса функции? и в хедере extern void Handler_adc(void); А это тут к чему??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 19 июля, 2017 Опубликовано 19 июля, 2017 · Жалоба Надеюсь это вынесено в хидер? Размещение всей функции в хидере? Остальное все да. А это тут к чему??? Ой прошу прошение не то указал, в общем, прерывания от АЦП разместил в модуле АЦП, а обработку самих данных завернул в функцию и решил вынести от туда в отдельный модуль, и при этом не хочу что бы это как-то влияло на быстродействие. Там функция получилась void Handler_adc(void){ ... } Нету ни входных ни выходных параметров, само то что бы её инлайнить, но увы :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 июля, 2017 Опубликовано 19 июля, 2017 · Жалоба Размещение всей функции в хидере? Остальное все да. Вызывается она из скольких мест? Попробуйте сделать её вызов только из одного места. void Handler_adc(void) Нету ни входных ни выходных параметров, само то что бы её инлайнить, но увы :( Это ISR что-ли? Если так, то естественно, что он не может быть заинлайнен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 19 июля, 2017 Опубликовано 19 июля, 2017 · Жалоба Да вызывается в одном месте. void SAI1_IRQHandler(void){ // Прерывание приема АЦП TEST_ON Handler_adc(); SAI1_Block_A->CLRFR|=SAI_xCLRFR_CFREQ; TEST_OFF NOP; } void Handler_adc(void){ ..... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 19 июля, 2017 Опубликовано 19 июля, 2017 · Жалоба Задайтесь вопросом - почему static inline ... функции размещают в .h файле. Как ответите - сразу на свой вопрос ответ найдёте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 19 июля, 2017 Опубликовано 19 июля, 2017 · Жалоба Задайтесь вопросом - почему static inline ... функции размещают в .h файле. Как ответите - сразу на свой вопрос ответ найдёте. Я бы другим вопросом тоже задался: а что вам эти инлайны, жизнь без них не мила что ли? Хотите "быстро-быстро" - дайте компилятору соответствующий ключик, чтобы оптимизировал. Ручками расставлять "инлайн" - это как помечать переменные "регистр", т.е. давно уже моветон. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 19 июля, 2017 Опубликовано 19 июля, 2017 · Жалоба Я бы другим вопросом тоже задался: а что вам эти инлайны, жизнь без них не мила что ли? Хотите "быстро-быстро" - дайте компилятору соответствующий ключик, чтобы оптимизировал. Ручками расставлять "инлайн" - это как помечать переменные "регистр", т.е. давно уже моветон. В том-то и прикол: инлайны реализуются в IARе на максимальном уровне оптимизации (; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 19 июля, 2017 Опубликовано 19 июля, 2017 · Жалоба Иногда бывает нужно. На счет максимального уровня оптимизации - это правда (но есть ньюансы). Но не только на максимальном уровне можно использовать inline. Книжки написаны про это уже лет 40 - можно прочитать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба Я бы другим вопросом тоже задался: а что вам эти инлайны, жизнь без них не мила что ли? Хотите "быстро-быстро" - дайте компилятору соответствующий ключик, чтобы оптимизировал. Ручками расставлять "инлайн" - это как помечать переменные "регистр", т.е. давно уже моветон. Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? Пардон что влез. Может чевой наоборот, убрать ? Не подерутся инлайновые галочки с галками оптимизации по размеру ? И кто победит ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? И что, не успевает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба Иногда бывает нужно. На счет максимального уровня оптимизации - это правда (но есть ньюансы). Но не только на максимальном уровне можно использовать inline. Книжки написаны про это уже лет 40 - можно прочитать. И это ТС знает (про прагму). IAR несколько лет назад всего лишь 20 лет отмечал: "In Code we trust". (; Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? Дык галочки это и есть ключи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 июля, 2017 Опубликовано 20 июля, 2017 · Жалоба Да хочу "быстро-быстро", оптимизация и так максимальная стоит и все галочки включены, какие ешё ключи ему давать ? Если Вы действительно хотите "быстро-быстро", то во-первых - ассемблер. Во-вторых: Всегда при оптимизации в первую очередь надо думать над алгоритмом. Наличие аргументов с плавающей точкой при обработке данных АЦП уже как бы даёт основания полагать, что у Вас там далеко не всё оптимально. И когда избавитесь от float, увидите, что inline даёт сущие крохи по сравнению с float. И об inline надо думать уже в последнюю очередь (при оптимизации по скорости). Иногда бывает нужно. При оптимизации по скорости, об inline стоит думать в последнюю очередь. И то - если функция совсем простая - из пары действий. inline, имхо, более полезен не для ускорения, а для например: уменьшения расхода стека на локальные переменные - вот это более важно. Вот в таком случае было бы очень полезно явно указывать компилятору, что функцию "обязательно inline-ить". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться