用宏为带参数的宏提供“参数”
曾有相当长的时间在做zigbee开发板,所以为了方便用户移植到目标板,许多资源都是用宏来定义的,其中按键是最典型,最长见的。 比如按键ESC接收在CC2530的P04上,则使用下面代码来定义按键所在的IO。
// Buttons
#define HAL_BOARD_IO_BTN_1_PORT 0 // ESC
#define HAL_BOARD_IO_BTN_1_PIN 4
为了初始化按键IO通常需要做两个动作,第一个是将IO配置为输入,第二个是将IO配置为三态。假定这两个动作的实现已经有定义:
// Macros for configuring IO direction:
// Example usage:
// IO_DIR_PORT_PIN(0, 3, IO_IN); // Set P0_3 to input
#define IO_DIR_PORT_PIN(port, pin, dir) \
do { \
if (dir == IO_OUT) \
P##port##DIR |= (0x01<<(pin)); \
else \
P##port##DIR &= ~(0x01<<(pin)); \
}while(0)
// Where port={0,1,2}, pin={0,..,7} and dir is one of:
#define IO_IN 0
#define IO_OUT 1
// Macros for configuring IO input mode:
// Example usage:
// IO_IMODE_PORT_PIN(0,0,IO_IMODE_PUD);
#define IO_IMODE_PORT_PIN(port, pin, imode) \
do { \
if (imode == IO_IMODE_TRI) \
P##port##INP |= (0x01<<(pin)); \
else \
P##port##INP &= ~(0x01<<(pin)); \
} while (0)
// where imode is one of:
#define IO_IMODE_PUD 0 // Pull-up/pull-down
#define IO_IMODE_TRI 1 // Tristate
如果直接使用下面的语句来初始化按键:
IO_DIR_PORT_PIN(HAL_BOARD_IO_BTN_1_PORT, HAL_BOARD_IO_BTN_1_PIN, IO_IN);
IO_IMODE_PORT_PIN(HAL_BOARD_IO_BTN_1_PORT,HAL_BOARD_IO_BTN_1_PIN, IO_IMODE_TRI);
前方两行代码编译不过,并且报下面的错误[注1]。
Error[Pe020]: identifier"PHAL_BOARD_IO_BTN_1_PORTDIR" is undefined
Error[Pe020]: identifier "PHAL_BOARD_IO_BTN_1_PORTINP" is undefined D:\Project\CC2530\CC2530-RFX-P2P\source\Components\targets\cc2530\hal_key.c 31
为了消除上面的错误[注2],也就是把“PHAL_BOARD_IO_BTN_1_PORTDIR”转换成“P0DIR”,通常可以再定义一个意义更为明晰的宏,在新的宏里面“传递参数”,比如:
#define IO_IN_PORT_PIN(port, pin) IO_DIR_PORT_PIN(port,pin, IO_IN)
#define IO_TRI_PORT_PIN(port, pin) IO_IMODE_PORT_PIN(port, pin, IO_IMODE_TRI)
此时再来写初始化按键的代码:
IO_IN_PORT_PIN(HAL_BOARD_IO_BTN_1_PORT, HAL_BOARD_IO_BTN_1_PIN);
IO_TRI_PORT_PIN(HAL_BOARD_IO_BTN_1_PORT, HAL_BOARD_IO_BTN_1_PIN);
编译后不再报错,测试按键的功能也一切正常。个人觉得,为了产品便于维护和升级,也可以使用这种做法来保证产品主体代码不被随意更改,以避免更多的错误。
[注1]:开发环境是IAR for 8051 751A
[注2]:CC2530的IO由PnDIR 控制方向,由PnINP选择模式。n=0,1,2
文章评论(0条评论)
登录后参与讨论