【问题标题】:Arduino memory issues when using multiple multiplexers使用多个多路复用器时的 Arduino 内存问题
【发布时间】:2016-05-14 22:40:59
【问题描述】:

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

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

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

如果我把所有的代码都粘贴到这里就不太可读了,所以我做了一个GitHub repo 以便于查看。

【问题讨论】:

    标签: c++ arduino


    【解决方案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 个字节。我的类被设计为像数组一样使用,因此您不需要更改任何其他代码。

    【讨论】:

    • 您好,感谢您的回复。您的解决方案效果很好,但是我认为 shiftReg 数组仍在 muxshield 对象之间共享。你觉得这可能吗?
    • 仅当它们是静态的时,它们不是,所以 MuxShield 的每个实例都有自己的集合。早上我会进一步看看可能发生的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多