大好きArduino

Arduino総合情報サイト

Arduino文法

PROGMEM

2016/06/09

Flashメモリにデータを格納するための修飾子です。
Arduino UnoのSRAM は小さいため、大きなデータはPROGMEMを使って Flashメモリから読み込みます。

変数を宣言時に使用します。
注意: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で定義されているデータ型を扱う必要があります。

●Example from Arduino Web Site

 
const dataType variableName[] PROGMEM = {data0, data1, data3...};
#include <avr/pgmspace.h>


// save some unsigned ints
const PROGMEM  uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};

// save some chars
const char signMessage[] PROGMEM  = {"I AM PREDATOR,  UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};

unsigned int displayInt;
int k;    // counter variable
char myChar;


void setup() {
  Serial.begin(9600);
  while (!Serial);

  // put your setup code here, to run once:
  // read back a 2-byte int
  for (k = 0; k < 5; k++)
  {
    displayInt = pgm_read_word_near(charSet + k);
    Serial.println(displayInt);
  }
  Serial.println();

  // read back a char
  int len = strlen_P(signMessage);
  for (k = 0; k < len; k++)
  {
    myChar =  pgm_read_byte_near(signMessage + k);
    Serial.print(myChar);
  }

  Serial.println();
}

void loop() {
  // put your main code here, to run repeatedly:

}

/*
 PROGMEM string demo
 How to store a table of strings in program memory (flash),
 and retrieve them.

 Information summarized from:
 http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

 Setting up a table (array) of strings in program memory is slightly complicated, but
 here is a good template to follow.

 Setting up the strings is a two-step process. First define the strings.
*/

#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "String 0";   // "String 0" etc are strings to store - change to suit.
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";


// Then set up a table to refer to your strings.

const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};

char buffer[30];    // make sure this is large enough for the largest string it must hold

void setup()
{
  Serial.begin(9600);
  while(!Serial);
  Serial.println("OK");
}


void loop()
{
  /* Using the string table in program memory requires the use of special functions to retrieve the data.
     The strcpy_P function copies a string from program space to a string in RAM ("buffer").
     Make sure your receiving string in RAM  is large enough to hold whatever
     you are retrieving from program space. */


  for (int i = 0; i < 6; i++)
  {
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy.
    Serial.println(buffer);
    delay( 500 );
  }
}

Arduino 原文

-Arduino文法