|
|
  |
Disable inline |
|
|
|
Apr 24 2014, 10:10
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Уважаемые, подскажите - как сказать IAR-у чтобы он не inline-ил функцию? А то что-то на вскидку не нашёл в доке на компилятор.... Можно конечно поставить __root, но сиё не очень правильно, ибо будет включать код функции даже когда она не используется, а этого не хотелось-бы.
Чтобы не было лишних вопросов, поясню "зачем": Имеется некая функция в которой в начале кратковременно нужно использовать большой объём стека (под временный большой массив). Далее этот массив не используется никак. И после этого из этой функции вызывается много других с глубоким уровнем вложенности (большим расходом стека на вызовы). А если описать этот массив как простой локальный, то выделенный под него объём стека далее висит мёртвым грузом. IAR это дело почему-то не оптимизирует, хотя мог-бы сделать ADD SP, #... Хотя включена максимальная оптимизация.
Выхожу из этого выделяя область функции, где идёт использование временного массива, в отдельную функцию. Но если не применять __root, то, при максимальной оптимизации, компилятор инлайнит её и включает её фрейм стека во фрейм стека вызывающей функции и получаем исходное положение с потерянным неиспользуемым объёмом стека. Или может кто знает лучшее решение такой проблемы чем inline-функция?
|
|
|
|
|
Apr 24 2014, 11:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Цитата(jcxz @ Apr 24 2014, 15:09)  PS: И вообще - что это за недоработка в IAR-е - не срезать неиспользуемый фрейм стека обычным ADD SP, #..., а тянуть его по всей функции? а если написать так и компилировать в c89 ? Код void func( void ) {
{ использовать большой стек }
тут должен вернутся
} ведь в C89 выделение на стеке переменных начинается по { и высвобождается по }
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
Apr 25 2014, 03:16
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(SSerge @ Apr 24 2014, 17:56)  #pragma inline = never О! Спасибо! Это работает. Интересно - а почему в даташите на IAR нету этой прагмы?  Цитата(megajohn @ Apr 24 2014, 17:15)  ведь в C89 выделение на стеке переменных начинается по { и высвобождается по } Хм... Учту это на будущее. Но к сожалению во-первых: у нас проект уже большой и собирается под IAR5.50, где нет C89. и во-вторых: написан он под C++, а при такой компиляции даже IAR6.50 не даёт включить C89.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|