PROGMEM

説明

SRAMの代わりにフラッシュ(プログラム)メモリにデータを保存します。Arduinoボードで使用できるさまざまな種類のメモリについての説明があります。

PROGMEMキーワードは変数修飾子であり、pgmspace.hで定義されたデータ型でのみ使用されます。これは、コンパイラに「この情報を通常のSRAMではなく、フラッシュメモリに入れてください」と指示します。

PROGMEMはpgmspace.hライブラリの一部です。最近のバージョンのIDEには自動的に含まれています。ただし、IDEのバージョンが1.0(2011)以下の場合は、まずスケッチの先頭で、次のようにライブラリをインクルードする必要があります。

#PROGMEMは1つの変数に使用することもできますが、実際に使用する価値があるのは、より大きなデータブロックを保存する必要がある場合だけです。これは通常、配列(または今回の議論の対象外である他のC++データ構造)に保存するのが最も簡単です。

PROGMEMの使用方法も2つのステップに分かれています。データをフラッシュ・メモリに格納した後、プログラム・メモリからSRAMにデータを読み出して、それを使って何かをするために、pgmspace.hライブラリで定義されている特別なメソッド(関数)が必要になります。

構文

const dataType variableName[] PROGMEM = {data0, data1, data3…};

PROGMEMは変数修飾子なので、どこに置くべきかという明確なルールはなく、Arduinoのコンパイラは以下の定義のすべてを受け入れます。しかし、実験によると、様々なバージョンのArduino(GCCのバージョンと関係があります)では、PROGMEMがある場所では動作し、別の場所では動作しないことがあります。以下の「文字列テーブル」の例は、Arduino 13で動作することが確認されています。それ以前のバージョンのIDEでは、PROGMEMが変数名の後に含まれているとうまく動作するかもしれません。

const dataType variableName[] PROGMEM = {}; // この形式を使用します。
const PROGMEM dataType variableName[] = {}; // またはこの形式を使用します。
const dataType PROGMEM variableName[] = {}; // この形式ではありません。

dataType: 許可されるデータ型:任意の変数型。
variableName: データの配列の名前です。

プログラム例

以下のコードは、PROGMEMに対するunsigned chars(バイト)およびints(2バイト)の読み取りおよび書き込み方法を示しています。

文字列の配列

LCDを使ったプロジェクトのように、大量のテキストを扱う場合、文字列の配列を設定すると便利なことが多い。文字列自体が配列なので、これは2次元配列の一例です。

このような配列は構造が大きくなりがちなので、プログラムのメモリ上に置くことが望ましい場合があります。以下のコードはその例です。

注意と警告

PROGMEMで動作させるためには、変数はグローバルに定義されているか、staticキーワードで定義されていなければならないことに注意してください。

以下のコードは、関数内では動作しません。

const char long_str[] PROGMEM = “Hi, I would like to tell you a bit about myself.\n”;
次のコードは、関数内でローカルに定義されていても、動作します。

const static char long_str[] PROGMEM = “Hi, I would like to tell you a bit about myself.\n”
F()マクロ
.Serial.print()のような命令があった場合

Serial.print(“Write something on the Serial Monitor”);
のような命令が使われると、通常、印刷される文字列はRAMに保存されます。もし、あなたのスケッチがシリアルモニターにたくさんのものを印刷するなら、簡単にRAMをいっぱいにすることができます。また、FLASHメモリの空き容量がある場合は、以下の構文を使って、文字列をFLASHに保存する必要があることを簡単に示すことができます。

Serial.print(F(“Write something on the Serial Monitor that is stored in FLASH”));

タイトルとURLをコピーしました