我正在开展一个arduino项目,我需要大量的输入和输出。当前设置具有5个多路复用器,每个多路复用器具有3行16位。问题是默认库只支持一个多路复用器。我认为这是因为库中使用的_shiftReg
变量在所有5个多路复用器中共享,而不是仅应用于一个。
我尝试通过将_shiftReg
变量添加到库的头文件来修改库以支持多个多路复用器。这解决了这个问题,但它也是一个新问题出现的地方。
有切换控制几乎所有的输入和输出。我通过每个切换它必须控制的输入和输出的多路复用器。然而,这会导致我添加的每个切换的内存使用量大幅增加。我认为这是因为正在复制多路复用器对象而不是仅仅作为参考传递。我习惯于编写Java,但我不知道C ++如何处理这些事情。我是否需要更改传递变量的方式以避免使用如此多的内存?还是会引起这些问题?
如果我在这里粘贴了所有代码,那将无法读取,因此我制作了GitHub repo以便于查看。
答案 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个。我的类被设计为像数组一样使用,因此您不需要更改任何其他代码。