Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Disable inline
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
jcxz
Уважаемые, подскажите - как сказать IAR-у чтобы он не inline-ил функцию?
А то что-то на вскидку не нашёл в доке на компилятор....
Можно конечно поставить __root, но сиё не очень правильно, ибо будет включать код функции даже когда она не используется, а этого не хотелось-бы.

Чтобы не было лишних вопросов, поясню "зачем":
Имеется некая функция в которой в начале кратковременно нужно использовать большой объём стека (под временный большой массив).
Далее этот массив не используется никак. И после этого из этой функции вызывается много других с глубоким уровнем вложенности (большим расходом стека на вызовы).
А если описать этот массив как простой локальный, то выделенный под него объём стека далее висит мёртвым грузом.
IAR это дело почему-то не оптимизирует, хотя мог-бы сделать ADD SP, #... Хотя включена максимальная оптимизация.

Выхожу из этого выделяя область функции, где идёт использование временного массива, в отдельную функцию. Но если не применять __root, то, при
максимальной оптимизации, компилятор инлайнит её и включает её фрейм стека во фрейм стека вызывающей функции и получаем исходное положение
с потерянным неиспользуемым объёмом стека.
Или может кто знает лучшее решение такой проблемы чем inline-функция?
scifi
Вынести функцию в отдельный файл, компилировать этот файл отдельно, чтобы у компилятора не было возможности заинлайнить. Линкер у яра не инлайнит, ЕМНИП.
jcxz
Да, тоже в принципе вариант, хотя не очень красивый - таких мест в проге может быть много и плодить из-за этого кучу файлов....
Тем более - что та часть кода, которая выносится в отдельную функцию, работает с кучей static объектов, локальных в данном файле и не хочется
это всё делать видимым во всём проекте или создавать отдельные ещё дополнительные хидеры описывающие эти static-объекты и видимые только
в исходном файле и в дополнительном файле.

Хотя это конечно вариант.

PS: И вообще - что это за недоработка в IAR-е - не срезать неиспользуемый фрейм стека обычным ADD SP, #..., а тянуть его по всей функции?
Ведь при вызовах функций с передачей аргументов через стек он нормально это делает - создаёт доп. фрейм, а после возврата - удаляет его...
megajohn
Цитата(jcxz @ Apr 24 2014, 15:09) *
PS: И вообще - что это за недоработка в IAR-е - не срезать неиспользуемый фрейм стека обычным ADD SP, #..., а тянуть его по всей функции?


а если написать так и компилировать в c89 ?
Код
void func( void )
{

{
использовать большой стек
}

тут должен вернутся


}


ведь в C89 выделение на стеке переменных начинается по { и высвобождается по }
SSerge
#pragma inline = never
jcxz
Цитата(SSerge @ Apr 24 2014, 17:56) *
#pragma inline = never

О! Спасибо! Это работает.
Интересно - а почему в даташите на IAR нету этой прагмы? wacko.gif

Цитата(megajohn @ Apr 24 2014, 17:15) *
ведь в C89 выделение на стеке переменных начинается по { и высвобождается по }

Хм... Учту это на будущее.
Но к сожалению
во-первых: у нас проект уже большой и собирается под IAR5.50, где нет C89.
и во-вторых: написан он под C++, а при такой компиляции даже IAR6.50 не даёт включить C89.
crying.gif
scifi
Цитата(megajohn @ Apr 24 2014, 15:15) *
ведь в C89 выделение на стеке переменных начинается по { и высвобождается по }

Где это написано? ИМХО, просто выдумка.
megajohn
Цитата(scifi @ Apr 25 2014, 08:45) *
Где это написано? ИМХО, просто выдумка.


угу, ведь если массив вне области видимости то его не должно быть за скобками и SP должон вернутся на своё место

лень в дизасм лезти
scifi
Цитата(megajohn @ Apr 25 2014, 09:13) *
лень в дизасм лезти

Дизасм - это особенности конкретного компилятора в конкретном режиме работы. А вы написали "C89", то есть ссылаетесь на стандарт языка Си. Вот я и попросил выдержку из текста стандарта.
На самом деле очевидно, что это была фантазия. В стандарте ничего такого не написано. Там даже ни разу не применяется слово "стек". Не вводите людей в заблуждение.
Сергей Борщ
Цитата(megajohn @ Apr 25 2014, 08:13) *
и SP должон вернутся на своё место
Не должОн. Вы же хотите, чтобы даже кривовато написанная программа была быстрой и маленькой. Оптимизатор имеет право объединить все эти теребления SP и в целях экономии времени выполнения и памяти кода один раз зарезервировать память и один раз освободить. А в промежутках использовать память от уже не нужных переменных под новые не трогая SP.
megajohn
Цитата(Сергей Борщ @ Apr 25 2014, 10:03) *
Вы же хотите, чтобы даже кривовато написанная программа была быстрой и маленькой.
...
использовать память от уже не нужных переменных под новые не трогая SP.


чтобы она была быстрой и маленькой, все возможные операции производятся на регистрах, а если не хватает - то уже на стеке.
После работы, с большим блоком на стеке, нужно восстановить регистры, а восстанавливать без смещения SP - это чревато нарушением собсвенно самого стека

Сергей Борщ
Цитата(megajohn @ Apr 25 2014, 09:24) *
нужно восстановить регистры, а восстанавливать без смещения SP - это чревато нарушением собсвенно самого стека
Не надо считать компилятор тупее, чем он есть на самом деле. Разумеется, он все это учтет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.