C宏没有按预期工作

时间:2015-01-08 21:09:22

标签: c macros arguments expected-exception

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

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

#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 ";"

如果我用鼠标移过一个弹出消息告诉我“错误:无关')'''之前';'”。 宏中的分号对我来说似乎没问题,WRITE_BIT(位)编译没有问题。

使用带有参数的宏来返回值对我来说似乎有点奇怪,我可以轻松地将它们转换为函数,但也许还有其他原因,值得学习它。

1 个答案:

答案 0 :(得分:4)

宏中有不平衡的括号:

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

据推测,你需要在开始时使用第二个左括号。