首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多路复用器时的Arduino内存问题

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

Stack Overflow用户
提问于 2016-05-14 19:51:01
回答 1查看 66关注 0票数 1

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

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

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

如果我把所有的代码都粘贴到这里,它的可读性就不是很好,所以我做了一个GitHub repo来使它更容易查看。

EN

回答 1

Stack Overflow用户

发布于 2016-05-14 22:40:59

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

你可以改变:

代码语言:javascript
复制
MuxShield _muxShieldIn;
MuxShield _muxShieldOut;

引用:

代码语言:javascript
复制
MuxShield &_muxShieldIn;
MuxShield &_muxShieldOut;

但是,构造函数需要修改,所以它使用了初始化器列表。

目前,它在这里复制:

代码语言:javascript
复制
ToggleMux::ToggleMux(MuxShield & muxShieldIn, int inRow, int inBit, MuxShield & muxShieldOut, int outRow, int outBit)
{
    _muxShieldIn = muxShieldIn;
    _muxShieldOut = muxShieldOut;
//...

您需要将其更改为如下形式:

代码语言:javascript
复制
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库(从库管理器下载),使每个库只占用两个字节。您需要做的全部工作(在将其包含到草图和库中之后)是:

将声明更改为:

代码语言:javascript
复制
BitBool<16> _shiftReg1, _shiftReg2 _shiftReg3; 

以及初始化到:

代码语言:javascript
复制
BitBool<16> _shiftReg1 = {0};
BitBool<16> _shiftReg2 = {0};
BitBool<16> _shiftReg3 = {0};

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37226299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档