簡単に言えば、PROGMEMデータは読み取り専用です。
フラッシュメモリの制限
理解しておくべき最初のことは、フラッシュメモリ(プログラムスペースが存在する場所)は長期の固定ストレージ用に設計されていることです。そこからの読み取りは非常に高速で正確です。ただし、一般的に言えば、バイト単位で変更することはできません(特定の変数の変更など)。通常、それを消去して大きなブロックに書き直す必要があります。消去と書き込みのサイクルを実行している間、他の場所に多くの冗長な情報を保存する必要があるため、実行時の操作には完全に非現実的です。
PROGMEMが実際
に実行することコードで指定されたリテラルデータ(文字列や数値など)は、常に最初はプログラム空間(つまりFlash)に常駐します。ただし、スケッチが実際に実行時にそのデータを使用する必要がある場合は、通常、SRAMにスケッチ用にスペースを割り当ててコピーする必要があります。つまり、フラッシュの元の修正とSRAMの一時的なコピーの2つのコピーが作成されます。
PROGMEM修飾子を使用する場合、SRAMにその2番目のコピーを作成しないように指示しています。代わりに、スケッチはFlashのオリジナルにアクセスするだけです。これは、割り当てとコピー操作を回避できるため、データを読み取る必要がある場合に非常に役立ちます。
ただし、データを変更する場合は、SRAMにコピーすることが不可欠です。上記のフラッシュの制限は別として、それはコードの安全性の問題でもあります。
プログラム空間に格納されているデータを変更できる場合、論理的には、プログラム空間に格納されているコードも変更できるということになります。つまり、単純なミス(または理論的には悪意のある攻撃)により、実行時にスケッチが部分的または完全に書き直される可能性があります。これは、単純に作業を停止することから、接続されている機器の損傷/破壊に至るまで、非常に予測できない結果をもたらす可能性があります。
詳細情報
ここから低レベルのPROGMEMに関する詳細を学ぶことができます。
同じPROGMEMチュートリアルの古いバージョンは、こちらから入手できます。