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

 
 
> #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
Ответов
ViKo
сообщение Sep 3 2015, 08:39
Сообщение #2


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

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



Еще один пример. Я не представляю, как сделать это в виде функции.
CODE
#define GPIO_CONF(PORT, \
MD00, OT00, SP00, PL00, AF00, \
MD01, OT01, SP01, PL01, AF01, \
MD02, OT02, SP02, PL02, AF02, \
MD03, OT03, SP03, PL03, AF03, \
MD04, OT04, SP04, PL04, AF04, \
MD05, OT05, SP05, PL05, AF05, \
MD06, OT06, SP06, PL06, AF06, \
MD07, OT07, SP07, PL07, AF07, \
MD08, OT08, SP08, PL08, AF08, \
MD09, OT09, SP09, PL09, AF09, \
MD10, OT10, SP10, PL10, AF10, \
MD11, OT11, SP11, PL11, AF11, \
MD12, OT12, SP12, PL12, AF12, \
MD13, OT13, SP13, PL13, AF13, \
MD14, OT14, SP14, PL14, AF14, \
MD15, OT15, SP15, PL15, AF15); \
GPIO##PORT->MODER = ( \
MD00 << 0 | MD01 << 2 | MD02 << 4 | MD03 << 6 | \
MD04 << 8 | MD05 << 10 | MD06 << 12 | MD07 << 14 | \
MD08 << 16 | MD09 << 18 | MD10 << 20 | MD11 << 22 | \
MD12 << 24 | MD13 << 26 | MD14 << 28 | (uint32_t)MD15 << 30); \
GPIO##PORT->OTYPER = ( \
OT00 << 0 | OT01 << 1 | OT02 << 2 | OT03 << 3 | \
OT04 << 4 | OT05 << 5 | OT06 << 6 | OT07 << 7 | \
OT08 << 8 | OT09 << 9 | OT10 << 10 | OT11 << 11 | \
OT12 << 12 | OT13 << 13 | OT14 << 14 | (uint32_t)OT15 << 15); \
GPIO##PORT->OSPEEDR = ( \
SP00 << 0 | SP01 << 2 | SP02 << 4 | SP03 << 6 | \
SP04 << 8 | SP05 << 10 | SP06 << 12 | SP07 << 14 | \
SP08 << 16 | SP09 << 18 | SP10 << 20 | SP11 << 22 | \
SP12 << 24 | SP13 << 26 | SP14 << 28 | (uint32_t)SP15 << 30); \
GPIO##PORT->PUPDR = ( \
PL00 << 0 | PL01 << 2 | PL02 << 4 | PL03 << 6 | \
PL04 << 8 | PL05 << 10 | PL06 << 12 | PL07 << 14 | \
PL08 << 16 | PL09 << 18 | PL10 << 20 | PL11 << 22 | \
PL12 << 24 | PL13 << 26 | PL14 << 28 | (uint32_t)PL15 << 30); \
GPIO##PORT->AFR[0] = ( \
AF00 << 0 | AF01 << 4 | AF02 << 8 | AF03 << 12 | \
AF04 << 16 | AF05 << 20 | AF06 << 24 | (uint32_t)AF07 << 28); \
GPIO##PORT->AFR[1] = ( \
AF08 << 0 | AF09 << 4 | AF10 << 8 | AF11 << 12 | \
AF12 << 16 | AF13 << 20 | AF14 << 24 | (uint32_t)AF15 << 28);
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
- - 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
- - Valentine Loginov   Inline-функции, как было сказано, позволяют сделат...   Sep 4 2015, 05:39
|- - ViKo   Цитата(Valentine Loginov @ Sep 4 2015, 08...   Sep 4 2015, 07:37
|- - zltigo   QUOTE (ViKo @ Sep 4 2015, 10:37) Немного ...   Sep 4 2015, 08:30
|- - ViKo   Цитата(zltigo @ Sep 4 2015, 11:30) А что,...   Sep 4 2015, 08:38
|- - zltigo   QUOTE (ViKo @ Sep 4 2015, 11:38) Э-э, себ...   Sep 4 2015, 09:11
|- - 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 Текстовая версия Сейчас: 30th July 2025 - 22:30
Рейтинг@Mail.ru


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