使用多个多路复用器时Arduino内存问题

时间:2016-05-14 11:51:01

标签: c++ arduino

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

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

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

如果我在这里粘贴了所有代码,那将无法读取,因此我制作了GitHub repo以便于查看。

1 个答案:

答案 0 :(得分:1)

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

你可以改变:

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中的数组也可以是字符,因为它们只存储1或0,这样可以减少它们的使用量。

或者您可以使用我的BitBool库(从库管理器下载)使每个库只占用两个字节。您需要做的就是(在将它包含在草图和库中之后):

将声明更改为:

BitBool<16> _shiftReg1, _shiftReg2 _shiftReg3; 

初始化为:

BitBool<16> _shiftReg1 = {0};
BitBool<16> _shiftReg2 = {0};
BitBool<16> _shiftReg3 = {0};

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