|
Использование макросов с аргументами в Си |
|
|
|
Nov 28 2013, 07:32
|

Местный
  
Группа: Участник
Сообщений: 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) в макрос подставляется символ , который при обединение с остальным текстом сам является библиотечным макросом. Т.е. до каких пор происходит раскрытие макроса ?
|
|
|
|
|
 |
Ответов
|
Nov 29 2013, 12:29
|

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

|
Цитата(MrYuran @ Nov 29 2013, 14:48)  Не совсем понятен смысл таких макросов. Если абстрагироваться, то нужно и от пинов, и от портов, и от уровней. а смысл - вместо записи GPIOA->BSRR=GPIO_BSRR_BS2 писать SbitP(A,2) помоему так нагляднее , и букф меньше. Вот по поводу абстрагирования от пинов, добавим еще пару макросов для именования выводов #define LCD_A0 7 и #define LCD_WR1 5 : Код #define LCD_A0 7 // Выбор: Адрес A0=L/ Данные A0=H #define LCD_WR1 5 // Запись в модуль: H-активный уровень
#define LCD_dataShift 1
void LCD_wrAdr (u8 Adr) { SmbitP(A,((Adr&0x0f)<<LCD_dataShift)); // выставляем на шину адрес RbitP(A,LCD_A0); // вкл. на запись адреса A0=0 SbitP(A,LCD_WR1); // вкл.строба записи delay(2000);// Задержка ~ 100нс RbitP(A,LCD_WR1); // снимаем строб записи RmbitP(A,(0x0f<<LCD_dataShift)); // Сброс битов шины DBх delay(5000);// Задержка ~ 200нс } В этом случае получается что перед тем как раскрыть макрос, нужно вместо букв параметра подставить то что означают эти буквы. Как в таком случае поведет себя предпроцессор , корректна ли такая запись с точки зрения стандарта написания макросов ?
Сообщение отредактировал MaxiMuz - Nov 29 2013, 12:30
|
|
|
|
Сообщений в этой теме
MaxiMuz Использование макросов с аргументами в Си Nov 28 2013, 07:32 Tarbal Бегло посмотрел. Вроде все нормально.
Макросы тупо... Nov 28 2013, 13:15 SSerge Цитата(MaxiMuz @ Nov 28 2013, 14:32) Т.е.... Nov 29 2013, 06:54 demiurg_spb Цитата(MrYuran @ Nov 29 2013, 15:48) +1 Nov 29 2013, 12:12  demiurg_spb Цитата(MaxiMuz @ Nov 29 2013, 16:29)
Вы ... Nov 29 2013, 12:52 _Pasha Я обычно так делаю
Код#define LCD_WR1_pin 4
static... Nov 29 2013, 18:19 winipuh Цитата(_Pasha @ Nov 29 2013, 22:19) Код#d... Dec 1 2013, 15:37  demiurg_spb Цитата(winipuh @ Dec 1 2013, 19:37) Ну и ... Dec 2 2013, 05:39   _Pasha Скобочки - запросто мог потерять.
Цитата(demiurg_... Dec 2 2013, 06:29    winipuh Я не придраться
Просто уже и раньше кое-где встре... Dec 2 2013, 08:24     ViKo Цитата(winipuh @ Dec 2 2013, 11:24) Вот я... Dec 2 2013, 08:36      winipuh Цитата(ViKo @ Dec 2 2013, 12:36) Ну, вдру... Dec 2 2013, 09:50       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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|