Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Склеивание 2-х имен макросов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Rash
Приветсвую.
Кто подскажет возможно склеить 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


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

А как сделать правильно?
Палыч
Цитата(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)        
....
Rash
не получается так
вот такие ошибки выдаёт
Код
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:\...
Палыч
Цитата(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)        
....
Rash
с SYNC_EXTI_Line - прокатило, а вот с SYNC_Channel - нет
Палыч
Цитата(Rash @ Sep 5 2013, 13:38) *
с SYNC_EXTI_Line - прокатило, а вот с SYNC_Channel - нет


А, результатом что должно быть? EXTI1_IRQn ?
В Keil'е так и получается... Какой у Вас транслятор используется?
Можно попробовать
Код
#define SYNC_Channel     _Glue(EXTI, pin_number) ## _IRQn
Rash
результат должен быть EXTI1_IRQ.
2-ой вариант тоже не подошёл.
Использую IAR

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

В "IAR for AVR V4.10B" проходит
Код
#define SYNC_Channel     _Glue(_Glue(EXTI, pin_number), _IRQn)
Rash
у меня в IAR ARM 6.50 не проходит.
EXTI1_IRQn тоже объявлено значение через define, но в переменную оно уже не подставляется, где то не так склеивается
Палыч
Цитата(Rash @ Sep 5 2013, 16:19) *
EXTI1_IRQn тоже объявлено значение через define

Что значит "тоже объявлено" ? У Вас где-то записано не SYNC_Channel, которое тоже, что и EXTI1_IRQn, а записано нечто другое, определённое в #define, которое вроде бы должно пораждать EXTI1_IRQn ?
Rash
ошибся, не дефайн, а энум
Код
#define EXTI_Line1       ((uint32_t)0x00002)     /*!< External interrupt line 1 */

typedef enum IRQn
{
  ...
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */
  ...
} IRQn_Type;
scifi
Цитата(Rash @ Sep 5 2013, 16:48) *
ошибся, не дефайн, а энум

Препроцессор ничего не знает про enum, поэтому подстановка через макросы не будет работать.
Rash
да препроцессору и не нужно знать энум это или нет. Проверил с дефайном тоже самое. Не может вместо склеенного имени подставить значение
Палыч
Цитата(Rash @ Sep 5 2013, 16:48) *
ошибся, не дефайн, а энум

И ? Что за ошибку и в какой строке выдаёт транслятор ?
Ещё: включите вывод на диск выходного файла препроцессора, посмотрите: что получается на выходе препроцессора на месте SYNC_Channel ?
Rash
Код
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 файлов не нашёл как преобразуются дефайны
Палыч
Цитата(Rash @ Sep 5 2013, 19:54) *
не в одном из out файлов не нашёл как преобразуются дефайны

1. Menu -> Project -> Options -> C/C++ Compiler -> Preprocessor
2. Поставить галку "Preprocessor output to file"
3. В подкаталоге List смотреть файл с расширением " .i "
Rash
вложил файл, но на выходе я так и не нашёл ничего
Палыч
Цитата(Rash @ Sep 5 2013, 20:21) *
я так и не нашёл ничего

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

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

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

Ну, если вариант с добавлением буковок не подходит, то можно разбить EXTI на две (три, четыре) части, и "доклеивать" по частям.
Код
#define SYNC_Channel     _Glue(EX, _Glue(TI, _Glue(pin_number, _IRQn)))
Rash
о, так работает. Я пробовал разбить EXTI, по другому, оно опять по прежнему склеивалось, с утра ещё мозг видать не включился.
ещё раз спасибо beer.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.