Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: научить IAR AVR 5.5 оптимизировать сохранение регистров
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
megajohn
в прерывании вызываю функцию, которая в другом файле/модуле инкрементирует байт.
Дык IAR нагенерил код, который перед вызовом функции сохраняет в стек не менее 16 регистров, и после выполнения восстанавливает. А в той функции юзается только один R16.
Пробовал с макчсимальной оптимизицией по скорости и коду. Это костыль от IAR как нибудь обходится ?

scifi
Можно попробовать Multifile Compilation (--mfc).
prottoss
Я как то бодался с этой фигней в итоге написал обработчик на ассемблере
Палыч
Цитата(megajohn @ Jul 12 2012, 12:15) *
в прерывании вызываю функцию, которая в другом файле/модуле инкрементирует байт.


Если функция вида
Код
void F(void) { ++X; }
то, почему бы её не сделать
Код
#pragma inline

megajohn
помнится, вызов inline Между модулями в IAR не допустим и вызвает ошибку компиляции/линковки.

пока помог обращение через extern
Палыч
Цитата(megajohn @ Jul 12 2012, 13:03) *
помнится, вызов inline Между модулями в IAR не допустим и вызвает ошибку компиляции/линковки.

"просто вы не умеете их готовить..." (С) из рекламы

Цитата(megajohn @ Jul 12 2012, 13:03) *
пока помог обращение через extern
Тоже выход... Можно считать, что это тот же "inline", но "руками"...
megajohn
Цитата(Палыч @ Jul 12 2012, 13:14) *
"просто вы не умеете их готовить..." (С) из рекламы


я уже и так
inline static void app_init( void )

и так
#pragma inline = forced
void app_init( void )

но не работает. Как правильно ?
Сергей Борщ
QUOTE (megajohn @ Jul 12 2012, 12:22) *
Как правильно ?
Поместить тело функции в заголовочный файл модуля, чтобы компилятор знал, что же именно встраивать в точку вызова?
megajohn
Цитата(scifi @ Jul 12 2012, 12:30) *
Можно попробовать Multifile Compilation (--mfc).


EWAVR_CompilerReference.pdf
EWAVR_UserGuide.pdf

ничего такого не знают
scifi
Цитата(megajohn @ Jul 12 2012, 13:41) *
EWAVR_CompilerReference.pdf
EWAVR_UserGuide.pdf

ничего такого не знают

Что интересно, у меня есть Яр для Coldfire, у него тоже ничего такого в мануалах не написано. А суслик есть - проверено. Работает так же, как, например, в Яр для Арм.
Rst7
QUOTE
в прерывании вызываю функцию, которая в другом файле/модуле инкрементирует байт.
Дык IAR нагенерил код, который перед вызовом функции сохраняет в стек не менее 16 регистров, и после выполнения восстанавливает. А в той функции юзается только один R16.


IAR все делает правильно. Если надо экономить - инлайнте функции.
_Артём_
Цитата(megajohn @ Jul 12 2012, 12:41) *
EWAVR_CompilerReference.pdf
EWAVR_UserGuide.pdf

ничего такого не знают

Как не знают?
Пункт "Summary of compiler options":
Цитата
--mfc Enables multi-file compilation
megajohn
Цитата(_Артём_ @ Jul 12 2012, 16:40) *
Как не знают?
Пункт "Summary of compiler options":


Нету в моем

"EWAVR_UserGuide.pdf"
EDITION NOTICE
Fifth edition: May 2009
Part number: UAVR-5
This guide describes version 5.x of the IAR Embedded Workbench® IDE for Atmel®
Corporation’s AVR microcontroller.
Internal reference: R8, 5.3, IMAE.

"EWAVR_CompilerReference.pdf"
EDITION NOTICE
Fourth edition: February 2005
Part number: CAVR-4
This guide applies to version 4.x of AVR IAR Embedded Workbench®.

вышлите плз свои версии на megajohn@inbox.ru
_Артём_
Цитата(megajohn @ Jul 12 2012, 17:13) *
Нету в моем

Да, в описании 5-го действительно нет, но есть на вкладке General Options - C/C++ compiler options.

megajohn
Цитата(_Артём_ @ Jul 12 2012, 18:42) *
Да, в описании 5-го действительно нет, но есть на вкладке General Options - C/C++ compiler options.


Да, то что доктор прописал. Сразу с 1кб флеши высвободился из 20кб
demiurg_spb
Дык, против лома нет приёмаsm.gif
_Артём_
Цитата(megajohn @ Jul 12 2012, 12:22) *
я уже и так
inline static void app_init( void )

и так
#pragma inline = forced
void app_init( void )

но не работает. Как правильно ?


Правильно вроде так
Код
#pragma inline = forced
inline void app_init( void )
{
}


UDP:
Такой вариант получается тоже правильный:
Код
#pragma inline = forced
void InterruptFunction( void ) // вызывается в прерывании
{}

InterruptFunction надо располагать в h-файле и тогда не все 16 регистров сохраняются (у меня штук 6), в отличие от случая если InterruptFunction находится в с-файле.

_Артём_
Ещё нашёл два варианта inline:
1.
Код
#define PRAGMA(x) _Pragma( #x )
#define INLINE PRAGMA( inline=forced ) static

2.
Код
#define INLINE _Pragma("inline=forced") inline


Но какой из них правильней и предпочтительней?
scifi
Цитата(_Артём_ @ Jul 13 2012, 22:44) *
Но какой из них правильней и предпочтительней?

С точки зрения переносимости кода правильнее применять макросы, так как в стандартном языке Си нет такой штуки, как inline.
С точки зрения вредной преждевременной оптимизации вообще не надо применять ни inline, ни макросы. Применять их надо начинать только тогда, когда доказано, что от них будет реальная (а не воображаемая) польза.
_Артём_
Цитата(scifi @ Jul 13 2012, 22:38) *
С точки зрения вредной преждевременной оптимизации вообще не надо применять ни inline, ни макросы. Применять их надо начинать только тогда, когда доказано, что от них будет реальная (а не воображаемая) польза.

Есть случаи где преждевреммая оптимизация не будет преждевременной: например какая-то функция вызывается только в одном месте (например в прерывании) - тут сразу ясно что inline даст экономию по размеру кода и скорости исполнения.
scifi
Цитата(_Артём_ @ Jul 14 2012, 00:00) *
Есть случаи где преждевреммая оптимизация не будет преждевременной: например какая-то функция вызывается только в одном месте (например в прерывании) - тут сразу ясно что inline даст экономию по размеру кода и скорости исполнения.

Даже оставляя в стороне тот факт, что хороший компилятор (а Яр обычно такие и делает) в такой ситуации сам сделает inline без подсказки, это по-прежнему преждевременная оптимизация: прежде чем экономить код и время исполнения, нужно убедиться, что эта экономия нужна. Далеко не каждая программа реально ограничена по размеру кода или времени исполнения. Преждевременная оптимизация вредна, так как отвлекает внимание и время на несущественные задачи (выгадать байт или микросекунду там, где это никому не нужно).
_Артём_
Цитата(scifi @ Jul 13 2012, 23:13) *
Даже оставляя в стороне тот факт, что хороший компилятор (а Яр обычно такие и делает) в такой ситуации сам сделает inline без подсказки

ИАР конечно хороший компилятор, но без подсказки inline не сделает (для АВР).

Цитата(scifi @ Jul 13 2012, 23:13) *
прежде чем экономить код и время исполнения, нужно убедиться, что эта экономия нужна. Далеко не каждая программа реально ограничена по размеру кода или времени исполнения. Преждевременная оптимизация вредна, так как отвлекает внимание и время на несущественные задачи (выгадать байт или микросекунду там, где это никому не нужно).

Да, согласен - не врегда нужно ужимать программу и да, отвлекает.
Но часто заранее известно что нужно ужимать.
scifi
Цитата(_Артём_ @ Jul 14 2012, 00:47) *
Но часто заранее известно что нужно ужимать.

Может быть, не знаю. Но сильно сомневаюсь. Тут уже на конкретных примерах надо смотреть.
_Артём_
Цитата(scifi @ Jul 13 2012, 23:57) *
Может быть, не знаю. Но сильно сомневаюсь.

А что там сомневаться: заложили, допустим, в проект мегу 48 - программа вписана может быть, но ясно что на пределе (хотели в себестоимость уменьшить).
Если б взяли мегу 88/168, то места с запасом - но не интересно по цене.
ReAl
Цитата(scifi @ Jul 13 2012, 22:38) *
в стандартном языке Си нет такой штуки, как inline.

Цитата
6.7.4 Function specifiers
Syntax

1 function-specifier:
inline
С момента принятия стандарта C99 прошла дюжина лет. С тех пор «стандартный» С мог бы и иметь inline. «старостандартный» может и не иметь. Но я давно с такими не работал.

Цитата( @ Jul 13 2012, 23:13) *
это по-прежнему преждевременная оптимизация
Как правило, применение inline столь же очвидно, как и применение для конкретного контроллера 8 (16) - битного типа вместо 16 (32) - битного.
Хотя можно не заниматься преждевременной оптимизацией и для всех переменных брать long. «а вот заработает — посмотрим, какой из переменных какой диапазон нужен на самом деле»
_Артём_
Цитата(scifi @ Jul 13 2012, 23:13) *
Даже оставляя в стороне тот факт, что хороший компилятор (а Яр обычно такие и делает) в такой ситуации сам сделает inline без подсказки,

Есть примеры компиляторов которые сами делают function inlining?

На ИАР АВР никак не получается сделать inline автоматом, только определяя функции в инклудах с/без #pragma inline=forced.
Или я как-то неправильно делаю?
scifi
Цитата(_Артём_ @ Jul 15 2012, 21:54) *
Есть примеры компиляторов которые сами делают function inlining?

К примеру, static функция, если вызывается только однажды, подставляется в месте вызова. Это яр для арм, а также coldfire. Если включить оптимизацию по скорости, я бы ожидал, что маленькую функцию будет подставлять, даже если она вызывается много раз. Но не проверял, скажу честно.
_Артём_
Цитата(scifi @ Jul 16 2012, 08:51) *
К примеру, static функция, если вызывается только однажды, подставляется в месте вызова. Это яр для арм, а также coldfire.

Оказалось, что для АВР тоже работает. Но функция обязательно должна быть static.

Цитата(scifi @ Jul 16 2012, 08:51) *
Если включить оптимизацию по скорости, я бы ожидал, что маленькую функцию будет подставлять, даже если она вызывается много раз.


Нет. Для АВР не подставляет.
demiurg_spb
Цитата(_Артём_ @ Jul 16 2012, 17:03) *
Оказалось, что для АВР тоже работает. Но функция обязательно должна быть static.
Это для всего работает. Это в концепции Си задумано.
Все функции идеологически должны быть либо extern либо static. Третьего не дано, да и мне даже и в голову не приходит для чего это может быть нужно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.