C 宏没有按预期工作

C macro not working as expected

我正在尝试调整我从 here 下载的一些代码(应该是正确的)以使其适用于我的设置和 CPU,但我的编译器似乎对此并不满意。我正在使用带有 nrf51422(Cortex M0 内核)的 Keil v5,我下载的代码应该针对 IAR 进行了优化。

我有一个头文件 dap.h,其中声明了一些用于 setting/clearing 引脚的宏:

#define SWDIO_SET_INPUT() NRF_GPIO->DIRCLR = (1 << SWDIO_PIN)
#define SWDIO_SET_OUTPUT() NRF_GPIO->DIRSET = (1 << SWDIO_PIN)

#define SWDIO_SET() NRF_GPIO->OUTSET = (1 << SWDIO_PIN)
#define SWDIO_CLR() NRF_GPIO->OUTCLR = (1 << SWDIO_PIN)
#define SWCLK_SET() NRF_GPIO->OUTSET = (1 << SWCLK_PIN)
#define SWCLK_CLR() NRF_GPIO->OUTCLR = (1 << SWCLK_PIN)

#define SWDIO_OUT(bit) {if ( bit ) SWDIO_SET(); else SWDIO_CLR();}
#define SWDIO_IN() (NRF_GPIO->IN >> SWDIO_PIN) & 0x1)

#define SWCLK_CYCLE()   \
  SWCLK_CLR();          \
  SWCLK_SET()

#define SWDIO_CYCLE()   \
  SWDIO_SET();          \
  SWDIO_CLR()

#define WRITE_BIT(bit)  \
  SWDIO_OUT(bit);        \
  SWCLK_CLR();          \
  SWCLK_SET()          

#define READ_BIT(bit)   \
  SWCLK_CLR();          \
  bit = SWDIO_IN();     \
  SWCLK_SET()

然后我有文件 dap.c,其中包括 dap.h,它调用宏:

 /* Send request */
  WRITE_BIT(1);
  WRITE_BIT(_ap);
  WRITE_BIT(_read);
  WRITE_BIT(A2);
  WRITE_BIT(A3);
  WRITE_BIT(parity);
  WRITE_BIT(0);
  WRITE_BIT(1);

  /* Turnaround */
  SWDIO_SET_INPUT();
  SWCLK_CYCLE();

  /* Read ACK */
  for ( i=0; i<3; i++ ) {
    READ_BIT(b);
    ack |= b << i;
  }

  /* Verify that ACK is OK */
  if ( ack == ACK_OK ) {

    for ( i=0; i<32; i++ ) 
    {
      /* Read bit */
      READ_BIT(b);
      *data |= b << i;

      /* Keep track of expected parity */
      if ( b ) cb = !cb;
    }

    /* Read parity bit */
    READ_BIT(parity);

在编译时,READ_BIT(b) 的每个实例都会生成错误

error: 65:  expected a ";"

如果我用鼠标经过,弹出消息会告诉我 "error: extraneous ')' before ';'"。 宏中的分号对我来说似乎没问题,并且 WRITE_BIT(bit) 编译没有问题。

我觉得使用带有返回值参数的宏有点奇怪,我可以很容易地将它们转换为函数,但也许还有其他原因,值得学习。

宏中有不平衡的括号:

#define SWDIO_IN() (NRF_GPIO->IN >> SWDIO_PIN) & 0x1)

据推测,您需要在开始处添加第二个左括号。