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

 
 
> научить 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 28)
scifi
сообщение Jul 12 2012, 08:30
Сообщение #2


Гуру
******

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



Можно попробовать Multifile Compilation (--mfc).
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 12 2012, 08:46
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Я как то бодался с этой фигней в итоге написал обработчик на ассемблере


--------------------
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 12 2012, 08:50
Сообщение #4


Гуру
******

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


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

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


Гуру
******

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


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

Группа: Свой
Сообщений: 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 12 2012, 09:39
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (megajohn @ Jul 12 2012, 12:22) *
Как правильно ?
Поместить тело функции в заголовочный файл модуля, чтобы компилятор знал, что же именно встраивать в точку вызова?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 12 2012, 09:41
Сообщение #9


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

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



Цитата(scifi @ Jul 12 2012, 12:30) *
Можно попробовать Multifile Compilation (--mfc).


EWAVR_CompilerReference.pdf
EWAVR_UserGuide.pdf

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


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


Гуру
******

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



Цитата(megajohn @ Jul 12 2012, 13:41) *
EWAVR_CompilerReference.pdf
EWAVR_UserGuide.pdf

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

Что интересно, у меня есть Яр для Coldfire, у него тоже ничего такого в мануалах не написано. А суслик есть - проверено. Работает так же, как, например, в Яр для Арм.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 12 2012, 11:39
Сообщение #11


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


IAR все делает правильно. Если надо экономить - инлайнте функции.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 12 2012, 12:40
Сообщение #12


Гуру
******

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



Цитата(megajohn @ Jul 12 2012, 12:41) *
EWAVR_CompilerReference.pdf
EWAVR_UserGuide.pdf

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

Как не знают?
Пункт "Summary of compiler options":
Цитата
--mfc Enables multi-file compilation
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 12 2012, 14:13
Сообщение #13


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

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



Цитата(_Артём_ @ 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


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


Гуру
******

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



Цитата(megajohn @ Jul 12 2012, 17:13) *
Нету в моем

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

Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 13 2012, 06:01
Сообщение #15


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

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



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


Да, то что доктор прописал. Сразу с 1кб флеши высвободился из 20кб


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
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 Текстовая версия Сейчас: 16th August 2025 - 23:23
Рейтинг@Mail.ru


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