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

 
 
> #define FUNCTION() vs. inline Function(), второе более "модно", а почему?
ViKo
сообщение Sep 3 2015, 08:13
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Собственно, весь вопрос в заголовке темы. Помню фразы, что в C++ роль макроопределений много меньше, чем в C. Стало быть, надо ориентироваться на inline функции?

К примеру, задать бит в порту можно с одинаковым успехом обоими вариантами. Для единообразия пошел по второму:
Код
__forceinline void FpRq_off(void)
{
  GPIOA->BSRR = FPRQ_H;
}

Но, скажем, функцию задержки, вычисляющую начальное значение счетчика в зависимости от времени, делаю комбинацией макрофункции со встроенной функцией.

Код
#define DELAY(VALUE, UNIT)    \
  DelayFourCycles(((VALUE) * UNIT * (SYSCLK / 1000000) + 3999) / 4000)

#pragma push
#pragma O3
__forceinline void DelayFourCycles(uint32_t FC)
{
__asm {
LOOP:
    SUBS FC, FC, #1
    BNE LOOP
  }
}
#pragma pop


Хочу просветления. Или уже...? rolleyes.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Valentine Logino...
сообщение Sep 4 2015, 05:39
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Inline-функции, как было сказано, позволяют сделать меньше ошибок: проверка типов + отладка в пошаговом режиме. Всегда можно вспомнить пример про вызов макроса MAX(a++, cool.gif.

Как сделать в виде функции макрос ТС зависит от того как определены PORTA, PORTB etc. Скорее всего static inline void GpioConf(GPIO_TypeDef port, uin32_t...) {...}. Не?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 4 2015, 07:37
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Valentine Loginov @ Sep 4 2015, 08:39) *
Как сделать в виде функции макрос ТС зависит от того как определены PORTA, PORTB etc. Скорее всего static inline void GpioConf(GPIO_TypeDef port, uin32_t...) {...}. Не?

Немного некомфортно, что inline функцию нужно вставлять в заголовочный файл *.h, а не в *.c. Чтобы ее можно было использовать в другом файле.
А сколько переменных можно передать в функцию? ничего не треснет? biggrin.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 4 2015, 08:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Sep 4 2015, 10:37) *
Немного некомфортно, что inline функцию нужно вставлять в заголовочный файл *.h, а не в *.c. Чтобы ее можно было использовать в другом файле.

А что, с макросами как-то иначе sm.gif. Смущает .h? так назовите .c - какие проблемы?
QUOTE
А сколько переменных можно передать в функцию? ничего не треснет? biggrin.gif

Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 4 2015, 08:38
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ Sep 4 2015, 11:30) *
А что, с макросами как-то иначе sm.gif. Смущает .h? так назовите .c - какие проблемы?

Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает. rolleyes.gif
Цитата
Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных.

Там не будет использоваться стек, эти переменные заменяются макроопределениями.
Код
/*! GPIO Mode Type */
typedef enum {
  MD_IN,            //!< Input *
  MD_GO,            //!< General purpose output
  MD_AF,            //!< Alternate function
  MD_AN                //!< Analog  
} GPIO_MODE_t;
и т.д.

Я так думаю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 4 2015, 09:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ViKo @ Sep 4 2015, 11:38) *
Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает. rolleyes.gif

Не понимаю в чем обман.
QUOTE
Там не будет использоваться стек, эти переменные - макроопределения.

Вы это как-бы подумайте, прежде, чем такое писать. Функции глубоко безразлично, она по любому получает переменные в стеке или/и в регистрах.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   #define FUNCTION() vs. inline Function()   Sep 3 2015, 08:13
- - dimka76   Например с точки зрения удобства. С инлайн фукциям...   Sep 3 2015, 08:25
|- - zltigo   QUOTE (dimka76 @ Sep 3 2015, 11:25) С инл...   Sep 3 2015, 11:58
- - ViKo   Еще один пример. Я не представляю, как сделать это...   Sep 3 2015, 08:39
- - CrimsonPig   Цитата(ViKo @ Sep 3 2015, 09:13) Собствен...   Sep 3 2015, 09:19
|- - ViKo   Цитата(CrimsonPig @ Sep 3 2015, 12:19) Ва...   Sep 3 2015, 10:31
- - _4afc_   В Watcom C inline не всегда инлайнились если inlin...   Sep 3 2015, 09:34
|- - CrimsonPig   Цитата(zltigo @ Sep 4 2015, 10:11) Вы это...   Sep 4 2015, 09:22
||- - zltigo   QUOTE (CrimsonPig @ Sep 4 2015, 12:22) Ну...   Sep 4 2015, 09:44
||- - ViKo   Цитата(zltigo @ Sep 4 2015, 12:44) В вопр...   Sep 4 2015, 09:50
|- - ViKo   Цитата(zltigo @ Sep 4 2015, 12:11) Функци...   Sep 4 2015, 09:35
|- - CrimsonPig   Цитата(ViKo @ Sep 4 2015, 10:35) Сейчас м...   Sep 4 2015, 09:51
||- - ViKo   Цитата(CrimsonPig @ Sep 4 2015, 12:51) Ну...   Sep 4 2015, 09:55
||- - CrimsonPig   Цитата(ViKo @ Sep 4 2015, 10:55) Я не вол...   Sep 4 2015, 10:07
|- - zltigo   QUOTE (ViKo @ Sep 4 2015, 12:35) И что, i...   Sep 4 2015, 10:18
|- - Dog Pawlowa   Цитата(zltigo @ Sep 4 2015, 13:18) В идеа...   Sep 6 2015, 18:46
- - ViKo   А я проверил. Всё то же, inline функция GPIO_conf(...   Sep 7 2015, 09:03
- - Valentine Loginov   Если много аргументов - передавайте указатель на с...   Sep 10 2015, 07:02


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

 


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


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