2

我正在使用嵌入式C进行微控制器工作,我发现有时候有几个外围设备只有一个字母(例如UARTA,UARTB等) )。每个外设的代码通常都是相同的,除了其他相同的寄存器的字母。例如,要设置外围AI会做这样的事情:是否有编译器指令来替换部分常量

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 

而设置外围BI具有完全相同的代码,但寄存器名称由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代码或查找/替换。是否有一些编译器指令或巧妙的技巧可以实现这种行为,以便我只需编写一次代码?我希望只是#定义外围设备中的最后一个字母,但类似这样的东西似乎徘徊到危险地接近代码,对我来说太臭了。

+3

有没有理由不能在这里使用一两个宏? – thelazydeveloper 2012-04-11 20:15:52

+0

@thelazydeveloper - 我很乐意,这就是我在这里要求的。 – 2012-04-11 20:23:50

+0

你最好不要这样做。考虑“grep UCB2CTL1 *”来查看原因。 – 2012-04-11 20:25:36

回答

3

这是否适合您?

#define INITUC(device) \ 
UC## device ## 2CTL1 |= UCSWRST; \ 
UC## device ## 2CTL0 |= UCSYNC+UCCKPL+UCMSB 
... 
INITUC(A); 
INITUC(B); 
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 SETUP(X) X ## 1 |= UCSWRST; \ 
       X ## 0 |= UCSYNC+UCCKPL+UCMSB; 
相关问题