|
Использование макросов с аргументами в Си |
|
|
|
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) в макрос подставляется символ , который при обединение с остальным текстом сам является библиотечным макросом. Т.е. до каких пор происходит раскрытие макроса ?
|
|
|
|
|
 |
Ответов
|
Dec 2 2013, 12:14
|

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

|
Цитата(_Pasha @ Nov 29 2013, 21:19)  Я обычно так делаю Код #define LCD_WR1_pin 4 static inline void LCD_wr1(const char value) { GPIOB->BSRR = 1 << (LCD_WR1_pin + value?0:16); } Никаких макро и никаких неясных абстракций. Все конкретно. по порядку: 1) Во первых Keil 4.7 не дает инлайнить функции. 2) Не ясен смысла записи GPIOB->BSRR = 1 << (LCD_WR1_pin + value?0:16); нужно передать в порт фиксированное значение ( номер пина) 3) Нет возможности изменить порт вывода. И еще , что делает выражение value?0:16 и зачем ? я вообще не понял , возможно это мои пробелы в знаниях Си.
Сообщение отредактировал MaxiMuz - Dec 2 2013, 12:10
|
|
|
|
|
Dec 2 2013, 12:34
|

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

|
Цитата(MaxiMuz @ Dec 2 2013, 16:14)  по порядку: 1) Во первых Keil 4.7 не дает инлайнить функции.  Да? Может у него что-то свое есть специфическое... типа __inline__ и т.п.? Цитата(MaxiMuz @ Dec 2 2013, 16:14)  2) Не ясен смысла записи GPIOB->BSRR = 1 << (LCD_WR1_pin + value?0:16); BSRR - управляет 16-тью пинками GPIO. Младшие 16 бит отвечают за установку пинов в "1", старшие 16 - за установку в "0". Можно одной записью одновременно установить и сбросить несколько разных пинов... А вышеприведенная (и, возможно, местами изъебисто написанная) конструкция буквально означает следующее: Код // n - номер GPIO-пина (от 0 до 15) #define SET_PIN(n) (0x0001 << (n)) #define CLR_PIN(n) (0x0100 << (n)) // ну или так — (0x0001 << ((n) + 16))
// какой-то конкретный пин #define LCD_wr1_pin 4
// Функция для установки/сброса какого-то конкретного пина static inline void LCD_wr1(const char value) { if (value) GPIOB->BSRR = SET_PIN(LCD_wr1_pin); else GPIOB->BSRR = CLR_PIN(LCD_wr1_pin); }
Сообщение отредактировал winipuh - Dec 2 2013, 12:35
|
|
|
|
|
Dec 2 2013, 19:09
|

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

|
Цитата(winipuh @ Dec 2 2013, 15:34)   Да? Может у него что-то свое есть специфическое... типа __inline__ и т.п.? вот этого я пока не знаю Цитата(winipuh @ Dec 2 2013, 15:34)  BSRR - управляет 16-тью пинками GPIO. Младшие 16 бит отвечают за установку пинов в "1", старшие 16 - за установку в "0". Можно одной записью одновременно установить и сбросить несколько разных пинов... все мне известно но конструкция Код static inline void LCD_wr1(const char value) { if (value) GPIOB->BSRR = SET_PIN(LCD_wr1_pin); else GPIOB->BSRR = CLR_PIN(LCD_wr1_pin); } подразумевает вычисление или выбор по условию аргумента, а смысл макроса просто подстановка кода с уже готовым аргументом, вот этого я и добиваюсь
|
|
|
|
Сообщений в этой теме
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 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    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
|
|
|