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

 
 
> научить 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
ReAl
сообщение Jul 14 2012, 10:48
Сообщение #9


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

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

Сообщений в этой теме
- 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, 22:38) С точк...   Jul 13 2012, 20:00
||- - scifi   Цитата(_Артём_ @ Jul 14 2012, 00:00) Есть...   Jul 13 2012, 20:13
||- - _Артём_   Цитата(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 13 2012, 23:13) Даже о...   Jul 15 2012, 17:54
||- - scifi   Цитата(_Артём_ @ Jul 15 2012, 21:54) Есть...   Jul 16 2012, 05:51
||- - _Артём_   Цитата(scifi @ Jul 16 2012, 08:51) К прим...   Jul 16 2012, 13:03
||- - demiurg_spb   Цитата(_Артём_ @ Jul 16 2012, 17:03) Оказ...   Jul 16 2012, 13:24
- - Rst7   QUOTE в прерывании вызываю функцию, которая в друг...   Jul 12 2012, 11:39


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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 20:53
Рейтинг@Mail.ru


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