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)
据推测,您需要在开始处添加第二个左括号。
我正在尝试调整我从 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)
据推测,您需要在开始处添加第二个左括号。