抽象重复,不可互动的调用的最优雅方式

时间:2015-02-17 17:33:35

标签: embedded abstraction

在嵌入式系统上,我有一个库,为每个端口提供特定的调用,例如__PORTA_ENABLE(pin)__PORTB_ENABLE(pin)__PORTn__WRITE(pin, val)__PORTn_TIMERm(pin, period)等。我必须将各种端口A到D上的8个任意但预定义的引脚初始化为相同的状态,并且需要大约30行来初始化每个端口。此刻,我将初始化块复制粘贴8次,如下所示:

__PORTA_ENABLE(4);
__PORTA_SETMODE(4, OUTPUT);
__PORTA_TIMER_B_(4, 2000);
///... and so on
__PORTA_ENABLE(5);
__PORTA_SETMODE(5, OUTPUT);
__PORTA_TIMER_C_(5, 2000);
///... and so on
__PORTB_ENABLE(7);
__PORTB_SETMODE(7, OUTPUT);
__PORTB_TIMER_A_(7, 2000);
///... and so on
__PORTB_ENABLE(2);
__PORTB_SETMODE(2, OUTPUT);
__PORTB_TIMER_F_(2, 2000);
///... and so on

显然,如果抽象层的设计者使用像GPIO_ENABLE(int port, int pin)这样的调用,这将是微不足道的,但他们没有,所以我坐在这里。是否有一种优雅的方法可以将其抽象出来并防止它膨胀成300行,不可维护的大量复制意大利面?

1 个答案:

答案 0 :(得分:0)

使用执行初始化的令牌粘贴宏,然后为每个引脚单独调用它。

宏定义了通用初始化功能:

#define INIT_PIN(port, pin, timer) \
    __PORT ## port ## _ENABLE(pin);          \
    __PORT ## port ## _SETMODE(pin, OUTPUT); \
    __PORT ## port ## _TIMER_ ## timer ## _(pin, 2000);

特定于引脚的初始化是:

INIT_PIN(A, 4, B);
INIT_PIN(A, 5, C);
INIT_PIN(B, 7, A);
INIT_PIN(B, 2, F);