Есть ли директива компилятора, чтобы заменить часть константы
Я сейчас работаю со встроенным 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;