我目前正在为一个微处理器家族开发一些外围驱动程序。我需要为非常类似的设备编写代码,在某些情况下,这些设备的外设数量不同。
我想为UART外围设备编写一个驱动程序,但是在家庭的一些设备中,只有一个可用,而对于其他设备,只有两个。UART2 y的驱动程序与UART1的驱动程序相同,但不是写入UART1FOO寄存器,而是需要写入UART2FOO寄存器。知道了这一点,我想编写一段代码,其中宏可以重复一大块代码,但是可以替换寄存器引用的数量。
理想的解决办法是:
// File: uartdriver.h
#if __device1__
#define PRESENT_UARTS 1
#else
#define PRESENT_UARTS 2
#endif
#for CURRENT_ITEM in MAGIC_MACRO_THAT_RETURNS_LIST(PRESENT_UARTS)
void uart#CURRENT_ITEM#_init();
#endfor我知道这个伪代码并不存在,但我也看到人们使用宏进行魔术。我必须使用C代码,而不是C++,我知道宏的使用可能不是最友好的方式,但我不喜欢用这么小的变体重复代码。
模仿上述伪码的最佳解决方案是什么?还有其他提示或建议吗?在这种情况下,除了宏,还有其他替代方法吗?
非常感谢你抽出时间。
发布于 2016-04-23 16:39:08
我认为有些人在提出类似的建议。注意,这是伪代码(我刚刚输入了它,但没有进行测试,所以它可能有一些错误等等)。
typedef uint8_t uart_id;
int uart_init(uart_id id, uint16_t baudrate);
typedef struct uart_definitions {
uart_id id;
uint16_t baudrate;
....
} udefs;
#define MAX_UDEFS 2
static udefs u_config[MAX_UDEFS] = {
{0, 1000},
{1, 8192}
};
uart_init(uart_id id, uint16_t brate) {
assert(id <= MAX_UDEFS);
u_config[id].baudrate = brate;
.....
}https://stackoverflow.com/questions/36812841
复制相似问题