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

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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 Хочу просветления. Или уже...?
|
|
|
|
|
 |
Ответов
|
Sep 4 2015, 05:39
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462

|
Inline-функции, как было сказано, позволяют сделать меньше ошибок: проверка типов + отладка в пошаговом режиме. Всегда можно вспомнить пример про вызов макроса MAX(a++,  . Как сделать в виде функции макрос ТС зависит от того как определены PORTA, PORTB etc. Скорее всего static inline void GpioConf(GPIO_TypeDef port, uin32_t...) {...}. Не?
|
|
|
|
|
Sep 4 2015, 08:30
|

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

|
QUOTE (ViKo @ Sep 4 2015, 10:37)  Немного некомфортно, что inline функцию нужно вставлять в заголовочный файл *.h, а не в *.c. Чтобы ее можно было использовать в другом файле. А что, с макросами как-то иначе  . Смущает .h? так назовите .c - какие проблемы? QUOTE А сколько переменных можно передать в функцию? ничего не треснет?  Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 4 2015, 08:38
|

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

|
Цитата(zltigo @ Sep 4 2015, 11:30)  А что, с макросами как-то иначе  . Смущает .h? так назовите .c - какие проблемы? Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает. Цитата Треснет - стек, если его размера не хватит для размещения всех передаваемых переменных. Там не будет использоваться стек, эти переменные заменяются макроопределениями. Код /*! GPIO Mode Type */ typedef enum { MD_IN, //!< Input * MD_GO, //!< General purpose output MD_AF, //!< Alternate function MD_AN //!< Analog } GPIO_MODE_t; и т.д. Я так думаю.
|
|
|
|
|
Sep 4 2015, 09:11
|

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

|
QUOTE (ViKo @ Sep 4 2015, 11:38)  Э-э, себя-то не обманешь... include так include. Я не говорю, что прямо воротит, просто не тем цветом в Notepad++ раскрашивает.  Не понимаю в чем обман. QUOTE Там не будет использоваться стек, эти переменные - макроопределения. Вы это как-бы подумайте, прежде, чем такое писать. Функции глубоко безразлично, она по любому получает переменные в стеке или/и в регистрах.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 4 2015, 09:35
|

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

|
Цитата(zltigo @ Sep 4 2015, 12:11)  Функции глубоко безразлично, она по любому получает переменные в стеке или/и в регистрах. Сейчас макрофункция инициализации порта компилируется в ~14 команд (+ память для констант): CODE inline void GPIO_init(void) { /* Биты 0..7 порта A используются для чтения RL, нужно подтянуть к GND */ GPIO_CONF(A, MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 0: RL0 MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 1: RL1 MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 2: RL2 MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 3: RL3 MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 4: RL4 MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 5: RL5 MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 6: RL6 MD_IN, OT_PP, SP_LO, PL_PD, AF_00, // 7: RL7 MD_AF, OT_PP, SP_ME, PL_NP, AF_02, // 8: TIM1_CH1 - FCAL MD_AF, OT_PP, SP_HI, PL_NP, AF_01, // 9: USART1_TX -> FPRX MD_AF, OT_PP, SP_LO, PL_NP, AF_01, // 10: USART1_RX <- FPTX MD_GO, OT_PP, SP_ME, PL_NP, AF_00, // 11: L3V MD_GO, OT_PP, SP_ME, PL_NP, AF_00, // 12: L12V MD_AF, OT_PP, SP_ME, PL_NP, AF_00, // 13: SWDIO MD_AF, OT_PP, SP_ME, PL_NP, AF_00, // 14: SWCLK MD_GO, OT_PP, SP_HI, PL_NP, AF_00); // 15: FREQ-
CODE GPIO_init PROC ;;;194 */ ;;;195 inline void GPIO_init(void) 000000 2009 MOVS r0,#9 ;;;196 { ;;;197 /* Биты 0..7 порта A используются для чтения RL, нужно подтянуть к GND */ ;;;198 GPIO_CONF(A, 000002 4912 LDR r1,|L80.76| 000004 06c0 LSLS r0,r0,#27 000006 6001 STR r1,[r0,#0] 000008 2200 MOVS r2,#0 00000a 8082 STRH r2,[r0,#4] 00000c 4910 LDR r1,|L80.80| 00000e 6081 STR r1,[r0,#8] 000010 4910 LDR r1,|L80.84| 000012 60c1 STR r1,[r0,#0xc] 000014 6202 STR r2,[r0,#0x20] 000016 21ff MOVS r1,#0xff 000018 3113 ADDS r1,r1,#0x13 00001a 6241 STR r1,[r0,#0x24]
И что, inline функция такого не осилит сотворить?
|
|
|
|
Сообщений в этой теме
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      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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|