タグ付けされた質問 「memory-usage」

1
PROGMEMを使用してフラッシュメモリに書き込むことはできますか?
Arduinoのドキュメントについて、私は引用します: http://playground.arduino.cc/Learning/Memory 注:フラッシュ(PROGMEM)メモリは、プログラムの書き込み時にのみ装着できます。>プログラムの実行が開始された後は、フラッシュの値を変更できません。 そしてPROGMEMの説明: http://arduino.cc/en/Reference/PROGMEM データをSRAMではなくフラッシュ(プログラム)メモリに保存します。Arduinoボードで利用可能なさまざまなタイプのメモリの説明があります。 PROGMEMキーワードは可変修飾子であり、pgmspace.hで定義されたデータ型でのみ使用する必要があります。これは、通常はSRAMにではなく、「この情報をフラッシュメモリに書き込む」ようコンパイラーに指示します。 だから私たちはできるかできないか?それとも同じではないのですか?

1
コンパイルされたコードサイズの概要
コードをコンパイルすると、Arduino IDEはバイナリスケッチサイズをバイト単位で返します。 フラッシュ内のどのくらいのメモリをどの関数またはどの部分が占めるかを(おおよそ)調べるための良い方法はありますか?それにより、どの機能が貴重なフラッシュメモリの大部分を占めているか、またはフラッシュを無駄にしている可能性があり、どこをフラッシュする必要があるかを感じることができます最適化を開始しますか?

5
移動平均を計算するための効率的なアルゴリズム/データ構造
現在、ヒートポンプシステムの温度、流量、電圧、電力、エネルギーを表示するグラフィックLCDシステムを開発しています。グラフィックLCDを使用するということは、私のSRAMの半分と私のフラッシュの約75%がスクリーンバッファーと文字列によって使用されていることを意味します。 現在、エネルギーの最小値/最大値/平均値を表示しています。真夜中に毎日の数値がリセットされると、システムはその日の消費量が前の最小値または最大値を上回っているか下回っているかをチェックし、値を保存します。平均は、累積エネルギー消費量を日数で割って計算されます。 先週と先月(簡単にするために4週間)の日平均、つまり移動平均を表示したいと思います。現在、これには過去28日間の値の配列を維持し、毎月の配列全体と毎週の最後の7日間の平均を計算することが含まれます。 最初は、フロートの配列を使用してこれを実行していました(エネルギーは「12.12kWh」の形式であるため)。これは、28 * 4バイト= 112バイト(SRAMの5.4%)を使用していました。小数点以下1桁でも構わないので、uint16_tを使用して図に100を掛けることに変更しました。これは、12.12が1212として表され、表示のために100で割ることを意味します。 配列のサイズは56バイトに下がりました(はるかに良いです!)。 図をuint8_tに減らす簡単な方法はありません。小数点以下の桁落ちは許容できますが(「12.12kWh」ではなく「12.1kWh」)、消費量は25.5kWh(255は8ビットの符号なし整数で表される最高値)よりも高いことがよくあります。消費量が10.0kWh未満または35.0kWhを超えたことは一度もないので、格納された数値から10を差し引くこともできますが、ある日、これらの制限を超えることがわかっています。 次に、9ビットの値を配列にパックするコードをテストしました。これは0-51.2kWhの範囲を与え、合計で32バイトを使用します。ただし、このような配列へのアクセスは、特に平均を計算するためにすべての値を反復処理する必要がある場合は、かなり低速です。 だから私の質問は-寿命、28日、7日の3つのウィンドウで移動平均を計算するより効率的な方法はありますか?効率とは、SRAMの使用量の点で小さいことを意味しますが、巨大なコードのペナルティはありません。すべての値の保存を回避できますか?

1
RAMからバイナリコードを実行する方法はありますか?
PCからオブジェクトコードをロードするための限られた機能と単純なI / O周辺機器を使用して、アセンブリ言語でプログラムできる安価なシングルボードコンピューターを探しています。 理想的には、自分のマシン上のすべてのコードを妥当な時間内に記述できるようにしたいと考えています。OSを邪魔したくありません。RAMにコードを書き込んでから分岐して実行するプログラムが欲しいからです。Arduinoは、アセンブリプログラミングに適したシステムのシンプルさに関する限り、おそらく私の最良の選択ですが、ハーバードアーキテクチャがあり、RAMから実行することはできません。 数年前、私はVon Neumannアーキテクチャの8ビットCPUを使用していました。ROM、RAMなどにマップされているかどうかに関係なく、実行を任意のアドレスに分岐できます。これが今私がやりたいことです。 おそらく、RAMに書き込まれたオペコードのインタプリタをフラッシュメモリに書き込んでロードできますが、この種の仮想マシンがすでに存在しない限り、これは非常に複雑で時間のかかるソリューションです。 Arduinoを使用する他の回避策や、使用する可能性のある他のマイクロコントローラーについて何か提案はありますか? ありがとう! ピエール

2
ArduinoでのOOPとインライン
私はかなり長い間プログラミングをしていますが、ArduinoとAVRプログラミングは初めてです。これらのマイクロコントローラーのプログラミングに関して私が持っている主な質問は、オブジェクト指向クラスでのコードの設計と多くの例で見た従来のインラインプログラミングでは大きな違いがあるということですか? 言い換えれば、Arduino / AVRコントローラーの世界では、クラスを利用してメモリとパフォーマンスを節約したり、その逆を行ったりしますか? たとえば、クラスがあるとします。 class SomeClass(){ private: int x; int y; public: void foo(); void bar(); } SomeClass thisClass; thisClass.foo(); thisClass.bar(); 次のように、よりインラインでプログラムを設計すると、パフォーマンスやメモリが向上しますか? int x; int y; void foo(){ /*** Do something ***/}; void bar(){ /*** Do more stuff ***/}; Stack ExchangeとGoogleでいくつか検索してみましたが、見つけることができた最も近いものを探している答えが見つかりませんでした。このStack Exchangeの質問でした。 私がこれについて尋ねている理由は、できるだけ軽量である必要があるプロジェクトがあり、この環境で自分のプログラムをどのように設計すればよいのかわからないためです。 編集する 答えてくれてありがとう、これは物事に光を当てています。はっきりしない点が1つあります。 次のようにu8glibを利用する設計中のクラスがあるとします。 class UserInterface{ private: …

3
PROGMEM:読み取りのためにフラッシュからRAMにデータをコピーする必要がありますか?
メモリ管理を理解するのが難しいです。 Arduinoのドキュメントによれば、文字列などの定数や、実行時に変更したくないものはプログラムメモリに保持することが可能です。私はそれをコードセグメントのどこかに埋め込んでいると考えています。これは、フォンノイマンアーキテクチャ内でかなり可能でなければなりません。そこからLCDのUIメニューを可能にしたい。 しかし、プログラムメモリからデータを読み取って出力するだけの命令には戸惑っています。 strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy. Serial.println( buffer ); アクセスする前に、どうしてコンテンツをRAMにコピーする必要があるのですか?そして、これが本当なら、すべてのコードはどうなりますか?実行前にRAMに読み込まれますか?コード(32kiB)は2kiB RAMだけでどのように処理されますか?フロッピーディスクを運ぶ小さなゴブリンはどこにいますか? そしてさらに興味深い:この式のようにリテラル定数に何が起こるか: a = 5*(10+7) 5、10、7をレジスタにロードする前に実際にRAMにコピーするのですか?信じられません。

5
スタックメモリは関数とローカル変数にどのように使用されますか?
一部の値をEEPROMに保存し、いくつかの変数宣言を回避してSRAMを解放したかったのですが、EEPROMメモリはバイト単位です。 int値を格納する場合は、いくつかの式を繰り返し使用する必要があります。それらのためにいくつかの機能を作りたいと思いました。しかし、関数を作成してもSRAMメモリを占有するのではないかと心配しています。EEPROMを使用する代わりにint変数を宣言した方がよいでしょう。 関数とローカル変数はSRAMにどのように保存されますか?フラッシュメモリーからの関数ポインターのアドレスのみを保存しますか、それともすべての変数とコマンドがスタックに保存されますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.