我正在从事一个arduino项目,我需要大量的输入和输出。当前设置具有5个多路复用器,每个多路复用器具有3行16位。问题是默认库只支持一个多路复用器。我认为这是因为库中使用的_shiftReg变量在所有5个多路复用器之间共享,而不是仅应用于一个多路复用器。
我尝试通过将_shiftReg变量添加到库的头文件来修改库以支持多个多路复用器。这解决了问题,但这也是一个新问题出现的地方。
有控制几乎所有输入和输出的开关。我传递了它必须控制的输入和输出的多路复用器。然而,这会导致我添加的每个切换的内存使用量大幅增加。我认为这是因为多路复用器对象被复制,而不是仅仅作为引用传递。我习惯于编写Java,我不知道C++是如何处理这些事情的。我是否需要改变传递变量的方式,以避免使用太多内存?或者是其他原因导致了这些问题?
如果我把所有的代码都粘贴到这里,它的可读性就不是很好,所以我做了一个GitHub repo来使它更容易查看。
发布于 2016-05-14 22:40:59
这些对象是通过引用传递的,但是库确实会复制它们。
你可以改变:
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个字节。我的类被设计成像数组一样使用,所以您不需要更改任何其他代码。
https://stackoverflow.com/questions/37226299
复制相似问题