通过预处理器宏

时间:2016-04-23 15:39:46

标签: c macros

我目前正在为一系列微处理器开发一些外设驱动程序。我需要为非常相似的设备编写代码,在某些情况下只会改变外设的数量。

我想为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 ++,并且我意识到使用宏可能不是最友好的写入方式,但我不喜欢用如此小的变化重复代码。

模仿上述伪代码的最佳解决方案是什么?还有其他提示或建议吗?在这种情况下,还有其他宏的替代方法吗?

非常感谢你的时间。

1 个答案:

答案 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;
   .....
}