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

 
 
 
Reply to this topicStart new topic
> Ошибка при работе с #define, Keil MDK-ARM v5
Alexashka
сообщение Oct 23 2014, 08:48
Сообщение #1


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Подстажите в чем ошибка, а то я походу туплю уже, но простая подстановка приводит к ошибке.

Определил я пин и порт для светодиода:
Код
#define LED2                        PORT_Pin_8                                // OUTPUT
#define LED2_PORT                MDR_PORTB  
#define LED2_PIN                LED2,MDR_PORTB


Затем значит определил функцию:
Код
#define on(Pin_Mask,Pin_Port)                        ((Pin_Port->RXTX) |= Pin_Mask)


И пытаюсь ее вызывать так:
Код
on(LED2_PIN);

Keil выдает ошибку #54-D: too few arguments in invocation of macro "on"
и ошибку #29: expected an expression

Если вместо LED2_PIN написать LED2,MDR_PORTB, т.е по сути то что определяет дефайн "LED2_PIN", то ошибки нет.
Т.е. вот так работает:
Код
on(LED2,MDR_PORTB);

Хотелось бы выкинуть этот порт, чтобы каждый раз его не писать при вызове функции on(), но как обойти ошибку?
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 23 2014, 09:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Код
#define on_(Pin_Mask,Pin_Port)                        ((Pin_Port->RXTX) |= Pin_Mask)
#define on(v) on_(v)
on(LED2_PIN);
Но так нельзя будет вызвать on(LED2,MDR_PORTB);
Вот так - можно, но требует некоторой поддержки со стороны компилятора (хотя бы С99)
Код
#define on_(Pin_Mask,Pin_Port)                        ((Pin_Port->RXTX) |= Pin_Mask)
#define on(...) on_(__VA_ARGS__)
on(LED2_PIN);
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Oct 23 2014, 10:12
Сообщение #3


Практикующий маг
******

Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576



Да, понял свою ошибку. Сначала компилятор в макрос on(arg1, arg2) подставляет первый аргумент, который в моем случае есть "LED2,MDR_PORTB", а во второй аргумент ему подставить уже нечего. По сути логично.
Вообщем сделал так:
Код
#define _on(Pin_Mask,Pin_Port)            ((Pin_Port->RXTX) |= Pin_Mask)
#define on(x)                        _on(x)


Вызов on(LED1_PIN); работает.
Теперь можно вызывать on(); если PIN "расписан" как положено - с битовой маской и именем порта, а если нет, то можно вызвать _on();, указав битовую маску и имя порта.

Спасибо, вопрос снят!
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Oct 23 2014, 11:38
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Alexashka @ Oct 23 2014, 14:12) *
Да, понял свою ошибку. Сначала компилятор в макрос on(arg1, arg2) подставляет первый аргумент
Компилятор не подставляет. Подставляет препроцессор.
Цитата
Спасибо, вопрос снят!
Пока вы не разберётесь с тем, как устроен процесс компиляции в языке Си, будут появляться другие вопросы.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:31
Рейтинг@Mail.ru


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