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

 
 
> Использование макросов с аргументами в Си
MaxiMuz
сообщение Nov 28 2013, 07:32
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Для удобства работы с портами ввода/вывода (на STM32 в Keil) написал небольшой хидер, приведу его часть :
Код
#define SbitP(Port,Nbit)    GPIO##Port->BSRR=GPIO_BSRR_BS##Nbit
#define RbitP(Port,Nbit)    GPIO##Port->BSRR=GPIO_BSRR_BR##Nbit
#define SmbitP(Port,mask)    GPIO##Port->BSRR=(mask)
#define RmbitP(Port,mask)    GPIO##Port->BSRR=(mask)<<16

в программе использую следующие варианты включения макросов:
Код
#define  LCD_dataShift 1


void LCD_wrAdr (u8 Adr)
{
    SmbitP(A,((Adr&0x0f)<<LCD_dataShift)); // выставляем на шину адрес
    RbitP(A,7); // вкл. на запись адреса A0=0
    SbitP(A,5); // вкл.строба записи
    delay(2000);// Задержка ~ 100нс
    RbitP(A,5); // снимаем строб записи
    RmbitP(A,(0x0f<<LCD_dataShift)); // Сброс битов шины DBх
    delay(5000);// Задержка ~ 200нс
}

У меня вопрос: на сколько корректно такое применение макросов ? т.к. в случае с RbitP(A,7) в макрос подставляется символ , который при обединение с остальным текстом сам является библиотечным макросом. Т.е. до каких пор происходит раскрытие макроса ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение Nov 29 2013, 18:19
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Я обычно так делаю
Код
#define LCD_WR1_pin 4
static inline void LCD_wr1(const char value)
{
  GPIOB->BSRR = 1 << (LCD_WR1_pin + value?0:16);
}

Никаких макро и никаких неясных абстракций. Все конкретно.
Go to the top of the page
 
+Quote Post
winipuh
сообщение Dec 1 2013, 15:37
Сообщение #3


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

Группа: Участник
Сообщений: 127
Регистрация: 31-10-12
Пользователь №: 74 189



Цитата(_Pasha @ Nov 29 2013, 22:19) *
Код
#define LCD_WR1_pin 4
static inline void LCD_wr1(const char value)
{
  GPIOB->BSRR = 1 << (LCD_WR1_pin + value?0:16);
}

Всего два вопроса:
  1. А зачем у аргумента функции квалификатор const? Тут же параметр не по ссылке передается, а по значению. blink.gif
  2. 1 << (LCD_WR1_pin + value ? 0 : 16); <— Вы тут часом скобочки не забыли? sm.gif
    Я о том, что приоритет операции "+" выше, чем у тернарной операции "?:"
    Надо бы так: 1 << (LCD_WR1_pin + (value ? 0 : 16));
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 2 2013, 05:39
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(winipuh @ Dec 1 2013, 19:37) *
Ну и если ещё продолжить придираться, то аргумент функции размером меньше int на ARM архитектуре менее оптимален. Так что char'у тут не место....


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 2 2013, 06:29
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Скобочки - запросто мог потерять.
Цитата(demiurg_spb @ Dec 2 2013, 08:39) *
Ну и если ещё продолжить придираться, то аргумент функции размером меньше int на ARM архитектуре менее оптимален. Так что char'у тут не место....


Если нужны вычисления на этапе выполнения, то для чего вообще эти инлайны? Это несерьезно. В конце концов, bit band существует.
Go to the top of the page
 
+Quote Post
winipuh
сообщение Dec 2 2013, 08:24
Сообщение #6


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

Группа: Участник
Сообщений: 127
Регистрация: 31-10-12
Пользователь №: 74 189



Я не придраться sad.gif
Просто уже и раньше кое-где встречал наподобие
Код
void func(const int x)
{
     ....
}

Например, в исходниках scmRTOS. Теперь вот и у Паши (уважаемого, надо сказать, человека sm.gif).
Вот я и спрашиваю... Вдруг в этом есть какой-то глубокий смысл, а я и не в курсе... laughing.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 2 2013, 08:36
Сообщение #7


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

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



Цитата(winipuh @ Dec 2 2013, 11:24) *
Вот я и спрашиваю... Вдруг в этом есть какой-то глубокий смысл, а я и не в курсе... laughing.gif

Ну, вдруг кто-то (или сам автор) задаст в value переменную. А компилятор - бац - нельзя! rolleyes.gif
Go to the top of the page
 
+Quote Post
winipuh
сообщение Dec 2 2013, 09:50
Сообщение #8


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

Группа: Участник
Сообщений: 127
Регистрация: 31-10-12
Пользователь №: 74 189



Цитата(ViKo @ Dec 2 2013, 12:36) *
Ну, вдруг кто-то (или сам автор) задаст в value переменную. А компилятор - бац - нельзя! rolleyes.gif

Шутить изволите? sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   Использование макросов с аргументами в Си   Nov 28 2013, 07:32
- - Tarbal   Бегло посмотрел. Вроде все нормально. Макросы тупо...   Nov 28 2013, 13:15
- - SSerge   Цитата(MaxiMuz @ Nov 28 2013, 14:32) Т.е....   Nov 29 2013, 06:54
- - MrYuran   Не совсем понятен смысл таких макросов. Если абстр...   Nov 29 2013, 11:48
|- - demiurg_spb   Цитата(MrYuran @ Nov 29 2013, 15:48) +1   Nov 29 2013, 12:12
|- - MaxiMuz   Цитата(MrYuran @ Nov 29 2013, 14:48) Не с...   Nov 29 2013, 12:29
|- - demiurg_spb   Цитата(MaxiMuz @ Nov 29 2013, 16:29) Вы ...   Nov 29 2013, 12:52
|||- - ViKo   Цитата(winipuh @ Dec 2 2013, 12:50) Шутит...   Dec 2 2013, 10:13
||- - demiurg_spb   Цитата(_Pasha @ Dec 2 2013, 10:29) Это не...   Dec 2 2013, 11:53
|- - MaxiMuz   Цитата(_Pasha @ Nov 29 2013, 21:19) Я обы...   Dec 2 2013, 12:14
|- - winipuh   Цитата(MaxiMuz @ Dec 2 2013, 16:14) по по...   Dec 2 2013, 12:34
|- - MaxiMuz   Цитата(winipuh @ Dec 2 2013, 15:34) Да? ...   Dec 2 2013, 19:09
|- - winipuh   Цитата(MaxiMuz @ Dec 2 2013, 23:09) но ко...   Dec 2 2013, 20:00
|- - MaxiMuz   Цитата(winipuh @ Dec 2 2013, 23:00) А так...   Dec 3 2013, 04:30
|- - winipuh   Цитата(MaxiMuz @ Dec 3 2013, 08:30) Код#d...   Dec 3 2013, 12:23
|- - MaxiMuz   Цитата(winipuh @ Dec 3 2013, 15:23) Имеем...   Dec 11 2013, 07:36
|- - Сергей Борщ   Цитата(MaxiMuz @ Dec 11 2013, 09:36) Един...   Dec 11 2013, 08:02
- - dxp   QUOTE (winipuh @ Dec 1 2013, 22:37) А зач...   Dec 3 2013, 04:24
- - ViKo   Не понимаю, зачем такие "муки творчества...   Dec 11 2013, 08:23
- - Сергей Борщ   Цитата(ViKo @ Dec 11 2013, 10:23) Не пони...   Dec 11 2013, 09:12


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

 


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


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