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

 
 
> #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
сообщение Sep 4 2015, 09:35
Сообщение #7


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

Группа: Модераторы
Сообщений: 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 функция такого не осилит сотворить? 01.gif
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Sep 4 2015, 09:51
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(ViKo @ Sep 4 2015, 10:35) *
Сейчас макрофункция инициализации порта компилируется в ~14 команд (+ память для констант):


Ну так попробуйте и нам расскажите sm.gif
Не, понятно, что вы дочитали книжку до описания inline функций и пытаетесь всунуть их теперь куда нужно и не нужно. Не волнуйтесь, все этим занимаются по началу sm.gif
Хотите еще занятие на полгода примерно ? Почитайте про шаблоны в Ц++ и попытайтесь переписать свой код инициализации на рекурсивных шаблонах и прочей радости sm.gif
Это можно сделать.. некорорые даже это делают. Нормально получается у единиц, и никто не пользуется в результате sm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 4 2015, 09:55
Сообщение #9


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

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



Цитата(CrimsonPig @ Sep 4 2015, 12:51) *
Ну так попробуйте и нам расскажите sm.gif
Не, понятно, что вы дочитали книжку до описания inline функций и пытаетесь всунуть их теперь куда нужно и не нужно. Не волнуйтесь, все этим занимаются по началу sm.gif

Я не волнуюсь. Вам же повторю "Если нечего сказать, не говори ничего." biggrin.gif
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Sep 4 2015, 10:07
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(ViKo @ Sep 4 2015, 10:55) *
Я не волнуюсь. Вам же повторю "Если нечего сказать, не говори ничего." biggrin.gif


Спасибо вам за совет. Идите.... в гугль, там вам место sm.gif
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
|- - 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 Текстовая версия Сейчас: 24th July 2025 - 00:39
Рейтинг@Mail.ru


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