Есть ли директива компилятора, чтобы заменить часть константы

Я сейчас работаю со встроенным C для микроконтроллера и обнаружил, что иногда есть несколько периферийных устройств, которые отличаются только одной буквой (например, UARTA, UARTB и т. Д.). Код для каждого периферийного устройства часто идентичен, за исключением букв других идентичных регистров. Например, чтобы настроить периферийный ИИ, сделайте что-то вроде:

UCA2CTL1 |= UCSWRST;                      // Put state machine in reset
UCA2CTL0 |= UCSYNC+UCCKPL+UCMSB;          // 3-pin, 8-bit SPI slave
// Continue initializing peripheral registers with "A" in name

А для настройки периферийного БИ есть точно такой же код, за исключением того, что имена регистров транспонируются по 1 букве:

UCB2CTL1 |= UCSWRST;                      // Put state machine in reset
UCB2CTL0 |= UCSYNC+UCCKPL+UCMSB;          // 3-pin, 8-bit SPI slave
// Continue initializing peripheral registers with "B" in name

Я хотел бы иметь возможность изменить, какое периферийное устройство я нацеливаю, без необходимости # ifdef / копировать / вставить код или найти / заменить. Есть ли какая-то директива компилятора или хитрая уловка, которая может реализовать это поведение, так что мне нужно написать код только один раз? Я хотел бы просто определить последнюю букву периферийного устройства, но что-то вроде этого, кажется, находится в опасной близости от кода.

2 ответа

Решение

Будет ли это работать для вас?

#define INITUC(device) \
UC ## device ## 2CTL1 |= UCSWRST; \
UC ## device ## 2CTL0 |= UCSYNC+UCCKPL+UCMSB
...
INITUC(A);
INITUC(B);

Предполагая, что эти константы const и не defines Вы можете сделать что-то подобное:

#define MAKECONST(X) const int X ## 1; \
                     const int X ## 0; \
                     X ## 1 |= UCSWRST; \
                     X ## 0 |= UCSYNC+UCCKPL+UCMSB;

А потом:

MAKECONST(UCA2CTL)
MAKECONST(UCB2CTL)

Обратите внимание, что мой пример включает объявление, которое я не знаю, если вам нужно, если нет, пропустите первые две строки определения. Например:

#define SETUP(X) X ## 1 |= UCSWRST; \
                 X ## 0 |= UCSYNC+UCCKPL+UCMSB;
Другие вопросы по тегам