我目前正在为一系列微处理器开发一些外设驱动程序。我需要为非常相似的设备编写代码,在某些情况下只会改变外设的数量。
我想为UART外设编写驱动程序,但在家庭的某些设备中,只有一个可用,而其他设备有两个。 UART2的驱动程序与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 ++,并且我意识到使用宏可能不是最友好的写入方式,但我不喜欢用如此小的变化重复代码。
模仿上述伪代码的最佳解决方案是什么?还有其他提示或建议吗?在这种情况下,还有其他宏的替代方法吗?
非常感谢你的时间。
答案 0 :(得分:0)
我认为有些人提出了类似的建议。注意,这是伪代码,即我只是输入它而不进行测试,因此它可能有一些错误等。
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;
.....
}