【问题标题】:The most elegant way to abstract away repeated, non-interatable calls抽象出重复的、不可交互的调用的最优雅的方法
【发布时间】:2015-02-17 17:33:34
【问题描述】:

在嵌入式系统上,我有一个为每个端口提供特定调用的库,例如__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 行、无法维护的大量复制意大利面?

【问题讨论】:

  • 你为什么不能自己写GPIO_ENABLE?
  • @isaach1000 主要是时间限制:我正在尝试完善代码,并且抽象层非常复杂(11 MB 的 C 代码),以便可以移植到同一芯片中的许多不同芯片家庭;我更喜欢使用 API 定义的调用来保持这种可移植性。
  • 我的意思是把你自己的实用函数写成静态函数或其他东西,这样你就只在需要的地方使用它。我不建议您添加到原始 API。
  • 那么你的问题是什么?如何将一堆常见/重复的代码提取到一个函数中?

标签: embedded abstraction


【解决方案1】:

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

宏定义了常用的初始化功能:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多