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

 
 
> Склеивание 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 20)
Палыч
сообщение 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
Палыч
сообщение Sep 5 2013, 16:09
Сообщение #16


Гуру
******

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



Цитата(Rash @ Sep 5 2013, 19:54) *
не в одном из out файлов не нашёл как преобразуются дефайны

1. Menu -> Project -> Options -> C/C++ Compiler -> Preprocessor
2. Поставить галку "Preprocessor output to file"
3. В подкаталоге List смотреть файл с расширением " .i "
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 5 2013, 16:21
Сообщение #17


Знающий
****

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



вложил файл, но на выходе я так и не нашёл ничего
Прикрепленные файлы
Прикрепленный файл  cmx618.zip ( 17.37 килобайт ) Кол-во скачиваний: 17
 
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 5 2013, 16:42
Сообщение #18


Гуру
******

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



Цитата(Rash @ Sep 5 2013, 20:21) *
я так и не нашёл ничего

А вот и результат
Цитата
NVIC_InitStructure.NVIC_IRQChannel = ((EXTI_TypeDef *) ((((uint32_t)0x40000000) + 0x00010000) + 0x3C00))3_IRQn;

Всё до банальности просто - EXTI определено в #define.
Выход из создавшегося положения: добавить "буквочек" к этой части идентификатора для уникальности...
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 6 2013, 07:06
Сообщение #19


Знающий
****

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



да абсолютно верно, есть в дефайнах EXTI. Но вот как теперь сделать такое переопределение для работы склеивающих дефайнов?
просто добавить буковки не совсем просто. Т.к. я хотел по такому принципу сделать переопределения для всей периферии. А это означает перебить все (или многое) библиотеки StdLib или CMSIS. И в последующем перебивать обновления когда они выйдут. В принципе возможно, но как то хлопотно.

спасибо за разъяснения
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 6 2013, 07:11
Сообщение #20


Гуру
******

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



Цитата(Rash @ Sep 6 2013, 11:06) *
Но вот как теперь сделать такое переопределение для работы склеивающих дефайнов?

Ну, если вариант с добавлением буковок не подходит, то можно разбить EXTI на две (три, четыре) части, и "доклеивать" по частям.
Код
#define SYNC_Channel     _Glue(EX, _Glue(TI, _Glue(pin_number, _IRQn)))
Go to the top of the page
 
+Quote Post
Rash
сообщение Sep 6 2013, 07:28
Сообщение #21


Знающий
****

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



о, так работает. Я пробовал разбить EXTI, по другому, оно опять по прежнему склеивалось, с утра ещё мозг видать не включился.
ещё раз спасибо beer.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 10:07
Рейтинг@Mail.ru


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