реклама на сайте
подробности

 
 
> научить IAR AVR 5.5 оптимизировать сохранение регистров, при вызове между модулями
megajohn
сообщение Jul 12 2012, 08:15
Сообщение #1


Профессионал
*****

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



в прерывании вызываю функцию, которая в другом файле/модуле инкрементирует байт.
Дык IAR нагенерил код, который перед вызовом функции сохраняет в стек не менее 16 регистров, и после выполнения восстанавливает. А в той функции юзается только один R16.
Пробовал с макчсимальной оптимизицией по скорости и коду. Это костыль от IAR как нибудь обходится ?



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Jul 12 2012, 08:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(megajohn @ Jul 12 2012, 12:15) *
в прерывании вызываю функцию, которая в другом файле/модуле инкрементирует байт.


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

Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 12 2012, 09:03
Сообщение #3


Профессионал
*****

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



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

пока помог обращение через extern


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 12 2012, 09:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

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

Цитата(megajohn @ Jul 12 2012, 13:03) *
пока помог обращение через extern
Тоже выход... Можно считать, что это тот же "inline", но "руками"...
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 12 2012, 09:22
Сообщение #5


Профессионал
*****

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



Цитата(Палыч @ Jul 12 2012, 13:14) *
"просто вы не умеете их готовить..." (С) из рекламы


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

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

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


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 13 2012, 12:10
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 находится в с-файле.

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 13 2012, 18:44
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

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


Но какой из них правильней и предпочтительней?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 13 2012, 19:38
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

С точки зрения переносимости кода правильнее применять макросы, так как в стандартном языке Си нет такой штуки, как inline.
С точки зрения вредной преждевременной оптимизации вообще не надо применять ни inline, ни макросы. Применять их надо начинать только тогда, когда доказано, что от них будет реальная (а не воображаемая) польза.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 13 2012, 20:00
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

Есть случаи где преждевреммая оптимизация не будет преждевременной: например какая-то функция вызывается только в одном месте (например в прерывании) - тут сразу ясно что inline даст экономию по размеру кода и скорости исполнения.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 13 2012, 20:13
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Даже оставляя в стороне тот факт, что хороший компилятор (а Яр обычно такие и делает) в такой ситуации сам сделает inline без подсказки, это по-прежнему преждевременная оптимизация: прежде чем экономить код и время исполнения, нужно убедиться, что эта экономия нужна. Далеко не каждая программа реально ограничена по размеру кода или времени исполнения. Преждевременная оптимизация вредна, так как отвлекает внимание и время на несущественные задачи (выгадать байт или микросекунду там, где это никому не нужно).
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 15 2012, 17:54
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



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

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

На ИАР АВР никак не получается сделать inline автоматом, только определяя функции в инклудах с/без #pragma inline=forced.
Или я как-то неправильно делаю?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 16 2012, 05:51
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(_Артём_ @ Jul 15 2012, 21:54) *
Есть примеры компиляторов которые сами делают function inlining?

К примеру, static функция, если вызывается только однажды, подставляется в месте вызова. Это яр для арм, а также coldfire. Если включить оптимизацию по скорости, я бы ожидал, что маленькую функцию будет подставлять, даже если она вызывается много раз. Но не проверял, скажу честно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- megajohn   научить IAR AVR 5.5 оптимизировать сохранение регистров   Jul 12 2012, 08:15
- - scifi   Можно попробовать Multifile Compilation (--mfc).   Jul 12 2012, 08:30
|- - megajohn   Цитата(scifi @ Jul 12 2012, 12:30) Можно ...   Jul 12 2012, 09:41
|- - scifi   Цитата(megajohn @ Jul 12 2012, 13:41) EWA...   Jul 12 2012, 09:55
|- - _Артём_   Цитата(megajohn @ Jul 12 2012, 12:41) EWA...   Jul 12 2012, 12:40
|- - megajohn   Цитата(_Артём_ @ Jul 12 2012, 16:40) Как ...   Jul 12 2012, 14:13
|- - _Артём_   Цитата(megajohn @ Jul 12 2012, 17:13) Нет...   Jul 12 2012, 14:42
|- - megajohn   Цитата(_Артём_ @ Jul 12 2012, 18:42) Да, ...   Jul 13 2012, 06:01
|- - demiurg_spb   Дык, против лома нет приёма   Jul 13 2012, 07:59
- - prottoss   Я как то бодался с этой фигней в итоге написал обр...   Jul 12 2012, 08:46
|- - Сергей Борщ   QUOTE (megajohn @ Jul 12 2012, 12:22) Как...   Jul 12 2012, 09:39
||- - _Артём_   Цитата(scifi @ Jul 13 2012, 23:13) Даже о...   Jul 13 2012, 20:47
|||- - scifi   Цитата(_Артём_ @ Jul 14 2012, 00:47) Но ч...   Jul 13 2012, 20:57
|||- - _Артём_   Цитата(scifi @ Jul 13 2012, 23:57) Может ...   Jul 13 2012, 22:32
||- - _Артём_   Цитата(scifi @ Jul 16 2012, 08:51) К прим...   Jul 16 2012, 13:03
||- - demiurg_spb   Цитата(_Артём_ @ Jul 16 2012, 17:03) Оказ...   Jul 16 2012, 13:24
|- - ReAl   Цитата(scifi @ Jul 13 2012, 22:38) в стан...   Jul 14 2012, 10:48
- - Rst7   QUOTE в прерывании вызываю функцию, которая в друг...   Jul 12 2012, 11:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 04:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016