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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> научить IAR AVR 5.5 оптимизировать сохранение регистров, при вызове между модулями
demiurg_spb
сообщение Jul 13 2012, 07:59
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Дык, против лома нет приёмаsm.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 13 2012, 12:10
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #21


Гуру
******

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



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

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


Гуру
******

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



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

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

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

Да, согласен - не врегда нужно ужимать программу и да, отвлекает.
Но часто заранее известно что нужно ужимать.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 13 2012, 20:57
Сообщение #23


Гуру
******

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



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

Может быть, не знаю. Но сильно сомневаюсь. Тут уже на конкретных примерах надо смотреть.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 13 2012, 22:32
Сообщение #24


Гуру
******

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



Цитата(scifi @ Jul 13 2012, 23:57) *
Может быть, не знаю. Но сильно сомневаюсь.

А что там сомневаться: заложили, допустим, в проект мегу 48 - программа вписана может быть, но ясно что на пределе (хотели в себестоимость уменьшить).
Если б взяли мегу 88/168, то места с запасом - но не интересно по цене.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 14 2012, 10:48
Сообщение #25


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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. «а вот заработает — посмотрим, какой из переменных какой диапазон нужен на самом деле»


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 15 2012, 17:54
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 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
_Артём_
сообщение Jul 16 2012, 13:03
Сообщение #28


Гуру
******

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



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

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

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


Нет. Для АВР не подставляет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 16 2012, 13:24
Сообщение #29


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 19:48
Рейтинг@Mail.ru


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