使库引脚映射可配置的正确方法是什么?


8

我正在使用一些库,这些库提供用于与特定硬件芯片进行交互的API(使这些驱动程序通过?)。但是,不同的定制板或屏蔽将使芯片映射到不同的引脚,这意味着需要针对每种情况修改库。需要修改库无法与Arduino IDE库管理器一起很好地工作。

是否存在用于公开此配置的首选/推荐模式,以便无需每次都修改库本身?

这是一个示例,其中记录了需要更改哪些部分以匹配电路板的引脚布局。


许多普通的Arduino库已经做到了-从熟悉该方法开始,甚至从用户的角度出发。
克里斯·斯特拉顿

Answers:


6

我使用的方法是将引脚作为参数提供给构造函数。这些引脚号存储在变量中,以供以后在.begin()函数和其他地方使用。

大多数时候,我使用初始化列表来使事情保持简单。例如:

class Something {
    uint8_t _cs;
    uint8_t _dc;

    Something(uint8_t cs, uint8_t dc) : _cs(cs), _dc(dc) {}
    void begin();
};

void Something::begin() {
    pinMode(_cs, OUTPUT);
    pinMode(_dc, OUTPUT);
}

Something mySomething(10, 8);

6

我将使用以下两种可能性之一:

使用(类)变量并在构造函数中进行设置。

优点:

  • 总是初始化
  • 易于使用(构造器和引脚设置一次)

使用单独的(例如Init)方法。

优点:

  • 可以动态改变

备注

对于引脚设置,大多数情况下使用静态电路,因此第一种方法可能更好。

对于设置,大多数情况下,第二种方法更好。

如果涉及许多引脚(不太可能),请使用结构或单独的引脚设置类。

巨集

我不建议使用宏。当用户需要自己更改源代码并安装新版本时,他们要么必须合并,要么再次重做更改。优点是减少了(机器)代码,可能更快了一点,并且内存使用量也减少了一点,但是这三个方面都是最小的。


2

根据您的方法。

1)如果仅提供二进制+头文件,则必须使pins变量。

2)如果您提供源代码并希望用户重新编译源代码,请使用宏。


2

万一您避免使用C ++构造函数,而这在Arduino上通常是一个过大的杀伤力,则可以使用#defines(类似于对象的宏)。

像这样:

#define PIN_ONE 1
#define PIN_TWO 2

假设这些定义在库头文件中,则预处理器将PIN_ONE用数字1和PIN_TWO2 无缝替换.h。与其他可能的解决方案相比,这很可能占用最少的资源。


问题在于它们需要放在.ino文件以及库源都可以到达它们的位置。这通常意味着一个单独的头文件,其中包含所有需要的内容。
伊格纳西奥·巴斯克斯

你确定吗?可以肯定的是,我可以在.ino中执行#define开关,并且它们在库中使用,但是我可能错了。
阿瓦曼德

1
如果该库的代码严格位于头文件中,则可以工作,但如果完全位于另一个编译单元中,则该文件不起作用。
伊格纳西奥·巴斯克斯

是的,这是有道理的,不知道确切的限制,并加上了免责声明。
阿瓦曼德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.