我正在做一个arduino项目,我需要很多输入和输出。当前设置有5个多路复用器,每个多路复用器具有3行16位。问题在于默认库仅支持一个多路复用器。我认为这是因为库中使用的_shiftReg变量在所有5个多路复用器上共享,而不是仅应用于一个。

我尝试通过将_shiftReg变量添加到库的头文件中来修改库以支持多个多路复用器。这解决了问题,但也出现了新问题。

有开关可控制几乎所有的输入和输出。我通过每个切换输入的多路复用器,并控制它的输出。但是,这会导致我添加的每个切换的内存使用量大大增加。我认为这是因为多路复用器对象正在复制而不是仅作为引用传递。我习惯于编写Java,但我不知道C++如何处理这些事情。我是否需要更改传递变量的方式以不占用太多内存?还是其他原因导致这些问题?

如果我在此处粘贴所有代码,它的可读性将不高,因此我创建了一个GitHub repo使其更易于查看。

最佳答案

对象是通过引用传递的,但是库会复制它们。

您可以更改:

MuxShield _muxShieldIn;
MuxShield _muxShieldOut;

引用:
MuxShield &_muxShieldIn;
MuxShield &_muxShieldOut;

但是,将需要修改构造函数,以便使用初始化列表。

目前,它在此处进行复制:
ToggleMux::ToggleMux(MuxShield & muxShieldIn, int inRow, int inBit, MuxShield & muxShieldOut, int outRow, int outBit)
{
    _muxShieldIn = muxShieldIn;
    _muxShieldOut = muxShieldOut;
//...

您需要将其更改如下:
ToggleMux::ToggleMux(MuxShield & muxShieldIn, int inRow, int inBit, MuxShield & muxShieldOut, int outRow, int outBit) : _muxShieldIn(muxShieldIn), _muxShieldOut(muxShieldOut)
{
//...

同样,MuxShield_shiftReg1_shiftReg2_shiftReg3中的数组也可以是chars,因为它们仅存储1或0,这将使它们的使用减半。

或者,您可以使用我的BitBool库(从库管理器下载),使每个库仅占用两个字节。您需要做的所有事情(将其包括到您的草图和lib中之后)是:

将声明更改为:
BitBool<16> _shiftReg1, _shiftReg2 _shiftReg3;

初始化为:
BitBool<16> _shiftReg1 = {0};
BitBool<16> _shiftReg2 = {0};
BitBool<16> _shiftReg3 = {0};

然后,所有三个变量占用6个字节而不是96个字节。我的类被设计为像数组一样使用,因此您无需更改任何其他代码。

关于c++ - 使用多个多路复用器时的Arduino内存问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37226299/

10-12 20:40