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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Склеивание 2-х имен макросов
Rash
сообщение Sep 5 2013, 08:02
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Приветсвую.
Кто подскажет возможно склеить 2 имени макросов.
Поясню на примере.
Код
#define SYNC_EXTI_Line         EXTI_Line3            
#define SYNC_Channel           EXTI3_IRQn          
#define SYNC_GPIO_PinSource    GPIO_PinSource3
#define SYNC_EXTI_IRQHandler   EXTI3_IRQHandler


Данные определения преобразовать в
Код
#define  pin_number                   1

#define SYNC_EXTI_Line         EXTI_Line#[b]#pin_number[/b]            
#define SYNC_Channel           EXTI[b]##pin_number[/b]_IRQn          
#define SYNC_GPIO_PinSource    GPIO_PinSource[b]##pin_number[/b]
#define SYNC_EXTI_IRQHandler   EXTI[b]##pin_number[/b]_IRQHandler


так естественно не работает.

А как сделать правильно?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 5 2013, 08:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rash @ Sep 5 2013, 12:02) *
А как сделать правильно?


Примерно, так:
Код
#define  pin_number                   1

#define _Glue(a, b)  a##b

#define SYNC_EXTI_Line   _Glue(EXTI_Line, #pin_number)    
#define SYNC_Channel     _Glue(_Glue(EXTI, #pin_number), _IRQn)        
....
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 08:53
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



не получается так
вот такие ошибки выдаёт
Код
Remark[Pe010]: "#" not expected here D:\...
Error[Pe010]: "#" not expected here D:\...
Error[Pe020]: identifier "EXTI_Line" is undefined D:\...
Error[Pe065]: expected a ";" D:\...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 5 2013, 09:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rash @ Sep 5 2013, 12:53) *
не получается так

Ну, тогда так:
Код
#define  pin_number                   1

#define _Glue_A(a, b)  a##b
#define _Glue(a, b)  _Glue_A(a, b)

#define SYNC_EXTI_Line   _Glue(EXTI_Line, pin_number)    
#define SYNC_Channel     _Glue(_Glue(EXTI, pin_number), _IRQn)        
....
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 09:38
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



с SYNC_EXTI_Line - прокатило, а вот с SYNC_Channel - нет
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 5 2013, 10:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rash @ Sep 5 2013, 13:38) *
с SYNC_EXTI_Line - прокатило, а вот с SYNC_Channel - нет


А, результатом что должно быть? EXTI1_IRQn ?
В Keil'е так и получается... Какой у Вас транслятор используется?
Можно попробовать
Код
#define SYNC_Channel     _Glue(EXTI, pin_number) ## _IRQn
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 11:20
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



результат должен быть EXTI1_IRQ.
2-ой вариант тоже не подошёл.
Использую IAR

Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 5 2013, 11:58
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rash @ Sep 5 2013, 15:20) *
2-ой вариант тоже не подошёл.
Использую IAR

В "IAR for AVR V4.10B" проходит
Код
#define SYNC_Channel     _Glue(_Glue(EXTI, pin_number), _IRQn)
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 12:19
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



у меня в IAR ARM 6.50 не проходит.
EXTI1_IRQn тоже объявлено значение через define, но в переменную оно уже не подставляется, где то не так склеивается
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 5 2013, 12:40
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rash @ Sep 5 2013, 16:19) *
EXTI1_IRQn тоже объявлено значение через define

Что значит "тоже объявлено" ? У Вас где-то записано не SYNC_Channel, которое тоже, что и EXTI1_IRQn, а записано нечто другое, определённое в #define, которое вроде бы должно пораждать EXTI1_IRQn ?
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 12:48
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



ошибся, не дефайн, а энум
Код
#define EXTI_Line1       ((uint32_t)0x00002)     /*!< External interrupt line 1 */

typedef enum IRQn
{
  ...
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */
  ...
} IRQn_Type;
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 5 2013, 13:17
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Rash @ Sep 5 2013, 16:48) *
ошибся, не дефайн, а энум

Препроцессор ничего не знает про enum, поэтому подстановка через макросы не будет работать.
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 13:50
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



да препроцессору и не нужно знать энум это или нет. Проверил с дефайном тоже самое. Не может вместо склеенного имени подставить значение
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 5 2013, 15:30
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rash @ Sep 5 2013, 16:48) *
ошибся, не дефайн, а энум

И ? Что за ошибку и в какой строке выдаёт транслятор ?
Ещё: включите вывод на диск выходного файла препроцессора, посмотрите: что получается на выходе препроцессора на месте SYNC_Channel ?
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 15:54
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Код
typedef struct
{
  uint8_t NVIC_IRQChannel
  ....
} NVIC_InitTypeDef;

NVIC_InitTypeDef   NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = SYNC_Channel;    [b]// тут ошибка[/b]


Цитата
Error[Pe513]: a value of type "EXTI_TypeDef *" cannot be assigned to an entity of type "uint8_t" D:\...
Error[Pe065]: expected a ";" D:\...


в настройках вроде установил все галочки касательно трансляции дефайнов, но не в одном из out файлов не нашёл как преобразуются дефайны
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:15
Рейтинг@Mail.ru


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