| PROGMEMキーワードは変数を宣言するときに使います。pgmspace.hで定義されているデータ型だけを使用してください。PROGMEMはpgmspace.hライブラリの一部です。よって、このキーワードを使うときは、まず次のようにして、ライブラリをインクルードする必要があります。
#include <avr/pgmspace.h> 【構文】 dataType variableName[] PROGMEM = {dataInt0, dataInt1...}; dataType: データ型(後述) variableName: 配列の名前 PROGMEMキーワードを置く位置は次のどちらかです。 dataType variableName[] PROGMEM = {}; PROGMEM dataType variableName[] = {}; 次のようにしてもコンパイルは成功しますが、IDEのバージョンによっては正常に動作しません。 dataType PROGMEM variableName[] = {}; PROGMEMを単独の変数に対して使うこともできますが、大きなデータを扱うならば配列にするのが一番簡単です。 Flashメモリに書き込んだデータは、pgmspace.hで定義されている専用のメソッド(関数)を使ってRAMに読み込むことで、利用できるようになります。 先に触れたとおり、pgmspace.hで定義されているデータ型を使うことが重要です。通常のデータ型を用いると、わかりにくいエラーの元となります。次に使用可能なデータ型を示します。浮動小数点数はサポートされていません。 prog_char char (1バイト) -127〜128 prog_uchar unsigned char (1バイト) 0〜255 prog_int16_t int (2バイト) -32,767〜32,768 prog_uint16_t unsigned int (2バイト) 0〜65,535 prog_int32_t long (4 bytes) -2,147,483,648〜2,147,483,647. prog_uint32_t unsigned long (4バイト) 0〜4,294,967,295 【例】 PROGMEMを使って、char型(1バイト)とint型(2バイト)のデータを読み書きする例です。 #include <avr/pgmspace.h>
PROGMEM prog_uint16_t charSet[] =
{ 65000, 32796, 16843, 10, 11234 };
prog_uchar signMessage[] PROGMEM =
"I AM PREDATOR, UNSEEN COMBATANT.";
unsigned int displayInt;
char myChar;
int k;
displayInt = pgm_read_word_near(charSet + k); // 2バイト読み込み
myChar = pgm_read_byte_near(signMessage + k); // 1バイト読み込み
文字列の配列をFlashメモリに配置する例です。 #include <avr/pgmspace.h>
prog_char string_0[] PROGMEM = "String 0";
prog_char string_1[] PROGMEM = "String 1";
prog_char string_2[] PROGMEM = "String 2";
prog_char string_3[] PROGMEM = "String 3";
// Then set up a table to refer to your strings.
PROGMEM const char *string_table[] = {
string_0,
string_1,
string_2,
string_3
};
char buffer[30]; // 文字列を格納するのに十分なサイズ
void setup() {
Serial.begin(9600);
}
void loop() {
for (int i = 0; i < 4; i++) {
// strcpy_Pで文字列をプログラム領域からRAM(バッファ)へコピー
// キャストと逆参照が必要
strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i])));
Serial.println( buffer );
delay( 500 );
}
}
F()マクロ Frashメモリの文字列にアクセスするためのマクロです。PROGMEMよりも簡単に、長い文字列を扱うことができます。 【例】 Flashメモリから文字列を取得して出力する例 void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print( F("Hello World.") );
delay(1000);
}
[目次へ戻る] |
Creative Commons Attribution-ShareAlike 3.0 License.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください
[ドキュメント一覧]