2016-05-14 7 views
1

私はarduinoプロジェクトに取り組んでおり、多くの入出力が必要です。現在の設定では、それぞれが3ビットの16ビットを有する5つのマルチプレクサを有する。問題は、デフォルトライブラリが1つのマルチプレクサのみをサポートしていることです。これは、ライブラリーで使用される変数_shiftRegが、1つだけに適用されるのではなく、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; 
//... 

あなたは次のようになり、それを変更する必要があります:MuxShieldクラスでも

ToggleMux::ToggleMux(MuxShield & muxShieldIn, int inRow, int inBit, MuxShield & muxShieldOut, int outRow, int outBit) : _muxShieldIn(muxShieldIn), _muxShieldOut(muxShieldOut) 
{ 
//... 

配列を_shiftReg1_shiftReg2および_shiftReg3は、1または0だけを格納するため、文字にすることができます。これにより、使用量が半分になります。

また、BitBoolライブラリ(ライブラリマネージャからダウンロード)を使用して、それぞれ2バイトしか使用できないようにすることもできます。あなたは(あなたのスケッチとlibにそれを含めた後に)行う必要があると思いますすべてがある:へ

BitBool<16> _shiftReg1, _shiftReg2 _shiftReg3; 

と初期化:次に

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

すべての3つの

変更する宣言変数は96ではなく6バイトをとります。私のクラスは配列のように使用するように設計されているので、他のコードを変更する必要はありません。

+0

こんにちは、応答ありがとうございます。あなたのソリューションは素晴らしいですが、shiftReg配列はまだmuxshieldオブジェクト間で共有されていると思います。これが可能だと思いますか? – Jochim

+0

MuxShieldの各インスタンスが独自のセットを取得するように、それらが静的でない場合にのみ、それはそうではありません。午前中に何が起きているのかさらに見ていきます。 –

関連する問題