Я пытаюсь написать код в C для ATmega микроконтроллера и у меня есть рабочий макрос BIT_SET
для установки одного бита:Macro, представляющая булавку на микрочипе
#define BIT_MASK(b) (0x01 << (b))
#define BIT_ON(p,b) ((p) |= BIT_MASK(b))
#define BIT_OFF(p,b) ((p) &= ~BIT_MASK(b))
#define BIT_SET(p,b,v) (v ? BIT_ON(p,b) : BIT_OFF(p,b))
Теперь я хотел бы определить однострочные макросы, представляющие контакты ввода/вывода. Что-то похожее на это:
#define LED B,5 // an LED diode is connected to bit 5 of port B
#define BUTTON B,4 // a button is connected to bit 4 of port B
Там будет больше этих макросов для различных периферий в окончательном коде, это лишь упрощенный пример.
Проблема заключается в том, что я не знаю, как определить макросы PORT
и DDR
, , так что я мог бы использовать LED
(или BUTTON
) макрос так:
BIT_SET(DDR(LED), 1); // which should expand to: BIT_SET(DDRB, 5, 1)
BIT_SET(PORT(LED), 0); // which should expand to: BIT_SET(PORTB, 5, 0)
Это является моей мотивацией:
Линия DDRB
управляет направлением штифта (независимо от того, является ли вывод входным или выходным) ,
Строка PORTB
устанавливает логическое значение выходного вывода.
Поскольку обе линии влияют на один и тот же вывод, я хотел бы выбрать штырь в 1-м месте (#define LED ...
) , а позже в коде использовать только символические имена (LED
, BUTTON
) для обеих операций (настройка направления и настройка выхода стоимость).
Макросы DDRB
и PORTB
должны иметь возможность расширения дальше (и не только один раз), поскольку они определены во внешнем заголовке (не под моим контролем). Также я был в ловушке того факта, что конкатенация с использованием ##
предотвращает дальнейшее расширение макроса.
Не проще ли использовать встроенные функции? –
@WeatherVane Вы, вероятно, правы, это может быть лучший способ. Перечисление для портов, возможно, структура для хранения портов и контактов. И пусть компилятор сделает для меня оптимизацию. – bedrorom
Предположим, вы попробуете перевернуть вещи, то есть '#define LED (p) p (B, 5)', '#define PORT (a, b) PORT ## a',' #define PIN (a, b) (b) ',' BIT_SET (светодиод (PORT), светодиод (PIN)) '. Ужасно, как грех. – doynax