原创 用宏为带参数的宏提供“参数”

2011-3-25 09:47 2958 9 9 分类: 软件与OS

用宏为带参数的宏提供“参数”


曾有相当长的时间在做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条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条