我现在正在使用嵌入式C作为微控制器,我发现有时候有几个外设只有一个字母(例如UARTA,UARTB等)。除了相同寄存器的字母外,每个外设的代码通常是相同的。例如,为了设置外围设备A,我会做类似的事情:
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
设置外围设备B我的代码完全相同,只是寄存器名称被转换为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 / copy / paste代码或查找/替换。是否有一些编译器指令或聪明的技巧可以实现这种行为,所以我只需要编写一次代码?我很乐意#define外围设备中的最后一个字母,但是这样的东西似乎危险地靠近代码发臭我。
答案 0 :(得分:3)
这对你有用吗?
#define INITUC(device) \
UC ## device ## 2CTL1 |= UCSWRST; \
UC ## device ## 2CTL0 |= UCSYNC+UCCKPL+UCMSB
...
INITUC(A);
INITUC(B);
答案 1 :(得分:1)
假设这些常量是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的前两行。 E.g:
#define SETUP(X) X ## 1 |= UCSWRST; \
X ## 0 |= UCSYNC+UCCKPL+UCMSB;