PROGMEMとは
- Flashメモリにデータを格納するためのもの
Arduinoの仕組み
- ATmega328P
- プログラムとデータが物理的に分離された領域に配置される
種類 | 容量 | 揮発性 |
---|---|---|
Flashメモリ | 32kB | 不揮発性 |
SRAM | 2kB | 揮発性 |
EEPROM | 1kB | 不揮発性 |
Flashメモリ
- スケッチ書き込み時に使われる
- その後SRAMにコピーされる
- intとか使った場合はこのタイミングでコピーされる
SRAM
- スケッチの実行中に変数の作成と操作がおこなれる領域
EEPROM
- 長期的に情報を記録するための領域
問題点
- 大きなデータを扱うときにSRAMを使うと足りなくなってしまう
- そこでFlashメモリに書き込み、必要な時だけSRAMに読み込むことでSRAMを圧迫せずに済む
- このためのPROGMEM!!
PROGMEMを使ってみる
変数の宣言
- ググると
prog_int16_t
を使えみたいなのが書いてるけどそれはもう古いぞ - 正しくは
const 型 変数 PROGMEM = hoge;
読み出し
pgm_read_byte (フラッシュメモリ上アドレス)
- つまりは
pgm_read_byte(&(変数))
サンプルコード
- 2次元配列も大丈夫
- 昔のバージョンだと
#include <avr/pgmspace.h>
がいるみたい
(ファイル名は.inoだけどハイライトつけたいので.c)
progmem.c
const int train_x[4][2] PROGMEM = {{0,0},{0,1},{1,0},{1,1}};
void setup(){
Serial.begin(9600);
Serial.println("Values from PROGMEM");
}
void loop(){
for(int i = 0; i < 4; i++){
for(int j = 0; j < 2; j++){
int tmp = pgm_read_byte(&(train_x[i][j]));
Serial.println(tmp);
}
}
while(1);
}