LoginSignup
7
7

More than 3 years have passed since last update.

ArduinoでPROGMEMを使ってみる

Last updated at Posted at 2019-10-24

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);
}
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7