PROGMEMを使用する意味は何ですか?


12

大量のテキスト変数では、PROGMEMを使用してフラッシュメモリに保存する必要があることがわかりました。Arduinoでフラッシュ(PROGMEMを使用)とSRAM、EEPROMに大きな変数を格納することのプラスとマイナスの結果は何ですか?

回答:


10

現在の多くのArduinoボード(Due、Leonardo、古いArduinos、およびその他の互換性のあるボードを除く)の多くのマイクロコントローラーであるAtMega328のフラッシュ、EEPROM、およびSRAMの簡単な比較を以下に示します。

  • フラッシュ:10,000回の書き込み/消去サイクル。アクセスは高速ですが、SRAMよりも低速です。を介しPROGMEMたコードアクセス。
  • EEPROM:100,000回の書き込み/消去サイクル。アクセスはミリ秒単位でゆっくりです。比較的複雑なアクセス手順。
  • SRAM:無制限の書き込み/消去サイクル。アクセスは非常に高速で、2クロックサイクルです。コードによる直接アクセス。

そのため、PROGMEMを使用した場合の主要な負の結果は、10,000書き込みサイクルの制限です。EEPROMを使用することの重要なマイナスの結果は、データの読み取り/書き込み/コピーのコード複雑さです。SRAM、容量が非常に限られています


EEPROMアクセスに関する情報はどこで入手できますか?少し見てみる 、EEPROMの読み取りには 5クロックサイクルかかるようです。書き込みは遅くなりますが、読み取りはできません。
コナーウルフ

OPは多くのものを保存したいと考えています。
Anindoゴーシュ

ええ、しかし、それは一度書くか、多く読むか、逆ですか?「テキスト変数」は、コンパイル時に指定され、デバイスに書き込まれ、その後変更されないもの(メニューテキストやsommatなど)である可能性があります。
コナーウルフ

私が読ん「コンパイル/アップロード時にストア」として、問題のを。変数が実行時に読み取り/書き込みで使用されることを意図している場合、FLASHに保存しないでください。最初にページ全体を消去しないとFL​​ASHを変更できないという追加の制限はありませんか?
マイクロテリオン

... 文字列定数ではなくテキスト変数
Anindoゴーシュ

2

主な意味は、PROGMEMに保存されている情報を変更できないことです。また、文字列を一度に1バイトコピーする必要があるため、(非常に小さな)パフォーマンスヒットが発生します。

プログラムを変更するには、とにかくFLASHを再プログラムする必要があるため、FLASHの消耗は(主要な)懸念事項ではありません。

IDE 1.xの概要には、F()マクロが含まれていました。これにより、PROGMEMに文字列を保持しやすくなります。

たとえば、Serial.print( "Hello World!");を使用する代わりに

以下を使用できます。

Serial.print(F( "Hello World!");

F()は関数ではなく、単なるマクロであるため、使用が多少制限されることに注意してください。


1

PROGMEMは、不変データに最適です。急速に変化する変数を維持する場合は、SRAMに保存するだけです。一方、あまり頻繁にフェッチされない不変テキスト変数(表示するものなど)が必要な場合は、PROGMEMをお勧めします。

EEPROMについて-永続的なもののためにこれを保存してください。IIRCでは、SRAM / PROGMEMを介してEEPROMからデータをフェッチするのが遅くなります。通常、私(およびその他)は、使用する前にデータをEEPROMからSRAMにコピーします(公式の例でもこれを行います)。

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