タグ付けされた質問 「progmem」

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

2
PROGMEMで配列の代わりにポインターを使用できないのはなぜですか?
現在、一部のライブラリを変更して、プロジェクトでSRAMが不足しないように、文字列の格納にRAMではなくフラッシュを使用するようにしています。 ライブラリの一部の文字列は、次のように宣言されています。 const char *testStringA = "ABC"; これは、私がこれを通常行う方法とは異なります。 const char testStringB[] = "DEF"; ただし、これら2つはconstと宣言され、宣言で初期化された場合は同等であると思います。どちらもコードで正常に動作します。 これらをフラッシュに移動しようとしました: const prog_char *testStringC PROGMEM = "GHI"; その後、これが機能しないことがわかりました。印刷されたとき、それはゴブルデコックを生産していました。 ただし、次の一般的なパターンに従います。 const prog_char testStringD[] PROGMEM = "JKL"; 正常に動作します。 私は分解で見ることができます: 00000068 <testStringC>: 68: 04 01 .. 0000006a <_ZL11testStringD>: 6a: 4a 4b 4c 00 JKL. そのため、ポインターがクリアされ、PROGMEMによって文字列/配列が初期化されなくなります。 どうしてこれなの? コード例: #include <avr/pgmspace.h> …
11 progmem  pointer 

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にコピーするのですか?信じられません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.