2016-05-14 12 views
1

我正在arduino項目上工作,我需要大量的輸入和輸出。目前的設置有5個多路複用器,每個多路器有3行16位。問題是默認庫僅支持一個多路複用器。我認爲這是因爲庫中使用的_shiftReg變量在所有5個多路複用器之間共享,而不是僅應用於一個。使用多個多路複用器時Arduino內存問題

我嘗試通過將_shiftReg變量添加到庫的頭文件來修改庫以支持多個多路複用器。這解決了這個問題,但它也是一個新問題出現的地方。

切換控制幾乎所有的輸入和輸出。我通過每個切換的輸入和輸出多路複用器必須控制。然而,這會導致我添加的每個切換的大量增加的內存使用量。我認爲這是因爲複用器對象被複制而不是僅僅作爲參考被傳遞。我習慣於編寫Java,我不知道C++如何處理這些事情。我是否需要改變傳遞變量的方式以避免使用太多內存?或者這是否會導致這些問題?

如果我在這裏粘貼了所有的代碼,它不會很好讀,所以我做了一個GitHub repo以便於查看。

回答

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) 
{ 
//... 

而且在_shiftReg1MuxShield類數組,_shiftReg2_shiftReg3可以是字符,因爲它們只存儲1或0,這會將其用量減半。

或者你可以使用我的BitBool庫(從庫管理器下載),使每個只需要兩個字節。所有你需要做的(這包括你的草圖和lib後):

更改報關單:

BitBool<16> _shiftReg1, _shiftReg2 _shiftReg3; 

而且初始化到:

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

則所有三個變量需要6個字節而不是96個。我的類被設計成像數組一樣使用,所以你不需要改變任何其他代碼。

+0

嗨,謝謝你的迴應。您的解決方案效果很好,但我認爲shiftReg數組仍然在多路複用遮罩對象之間共享。你認爲這是可能的嗎? – Jochim

+0

只有它們是靜態的,它們不是,所以每個MuxShield實例都有自己的集合。在早上我會進一步看看可能發生的事情。 –