PROGMEMを使用してフラッシュメモリに書き込むことはできますか?


11

Arduinoのドキュメントについて、私は引用します:

http://playground.arduino.cc/Learning/Memory 注:フラッシュ(PROGMEM)メモリは、プログラムの書き込み時にのみ装着できます。>プログラムの実行が開始された後は、フラッシュの値を変更できません。

そしてPROGMEMの説明:

http://arduino.cc/en/Reference/PROGMEM データをSRAMではなくフラッシュ(プログラム)メモリに保存します。Arduinoボードで利用可能なさまざまなタイプのメモリの説明があります。

PROGMEMキーワードは可変修飾子であり、pgmspace.hで定義されたデータ型でのみ使用する必要があります。これは、通常はSRAMにではなく、「この情報をフラッシュメモリに書き込む」ようコンパイラーに指示します。

だから私たちはできるかできないか?それとも同じではないのですか?


実行時に(フラッシュ)プログラムメモリに書き込むことができますが(ロックされていない限り)、プロセスは少し複雑で、基本的に割り当てプロセスを制御するPROGMEMディレクティブでは実行できません。それがどのように行われるかを見たい場合は、ブートローダーのソースを見てください。
クリスストラットン

ページ書き込みブロックは、フラッシュへの書き込みを非現実的にしません。実際、何かが楽しみでした。
Anothercg Gmail

回答:


9

簡単に言えば、PROGMEMデータは読み取り専用です。

フラッシュメモリの制限
理解しておくべき最初のことは、フラッシュメモリ(プログラムスペースが存在する場所)は長期の固定ストレージ用に設計されていることです。そこからの読み取りは非常に高速で正確です。ただし、一般的に言えば、バイト単位で変更することはできません(特定の変数の変更など)。通常、それを消去して大きなブロックに書き直す必要があります。消去と書き込みのサイクルを実行している間、他の場所に多くの冗長な情報を保存する必要があるため、実行時の操作には完全に非現実的です。

PROGMEMが実際
に実行することコードで指定されたリテラルデータ(文字列や数値など)は、常に最初はプログラム空間(つまりFlash)に常駐します。ただし、スケッチが実際に実行時にそのデータを使用する必要がある場合は、通常、SRAMにスケッチ用にスペースを割り当ててコピーする必要があります。つまり、フラッシュの元の修正とSRAMの一時的なコピーの2つのコピーが作成されます。

PROGMEM修飾子を使用する場合、SRAMにその2番目のコピーを作成しないように指示しています。代わりに、スケッチはFlashのオリジナルにアクセスするだけです。これは、割り当てとコピー操作を回避できるため、データを読み取る必要がある場合に非常に役立ちます。

ただし、データを変更する場合は、SRAMにコピーすることが不可欠です。上記のフラッシュの制限は別として、それはコードの安全性の問題でもあります。

プログラム空間に格納されているデータを変更できる場合、論理的には、プログラム空間に格納されているコードも変更できるということになります。つまり、単純なミス(または理論的には悪意のある攻撃)により、実行時にスケッチが部分的または完全に書き直される可能性があります。これは、単純に作業を停止することから、接続されている機器の損傷/破壊に至るまで、非常に予測できない結果をもたらす可能性があります。

詳細情報
ここから低レベルのPROGMEMに関する詳細を学ぶことができます。

同じPROGMEMチュートリアルの古いバージョンは、こちらから入手できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.