大好きArduino

Arduino総合情報サイト

Arduinoプログラミング基礎

3.Arduinoのメモリーの基本を押さえよう

2016/08/16

メモリーの種類

Arduinoには 1.Flashメモリー  2.SRAM  3.EEPROM の3種類のメモリーが基板上に搭載されています。
そしてこのメモリーは次のような役目で使用されています。
ArduinoはPCのように莫大なメモリーが使えるわけではないため、ちょっと凝ったプログラミングを行うと、すぐにメモリーのパンクを起こします。

メモリーのパンクとは、

①作ったプログラムが大きすぎて保存できない
→結局プログラムを転送することができないため動かないプログラム

②作ったプログラムがメモリーを使いすぎてうまく動かない

→プログラム転送時に「これはオーバーしてるから転送しても動かないよ~」という警告を出してくれてダウンロードできなかった場合はいいのですが、ギリギリラインで転送まではできてしまって、いざ動かしたらなんか動きが変になる!ということもあります。

こんなことがないように、コンパイル時のメッセージはしっかり見ておく必要があります。(後述)

1.Flashメモリー

Flashメモリーは、あなたが作ったプログラムが格納されるメモリーです。
統合環境で作成されたプログラムはUSBケーブルを通じてこのFlashメモリーへ転送されます。
Flashメモリーはボード事態の電源を消してもプログラムが消えることはありません。
またFlashメモリーには、Arduinoのブートローダと呼ばれるOSのような基本ソフトがあらかじめ書き込まれています。
Arduinoに電源が入ると、まずこのブートローダが起動され、その後、ダウンロードしたあなたのプログラムを起動する動きになります。
基本的に、プログラム内部で使用する変数などはSRAMに展開されて動作しますが、SRAMはとても小さなもので、すぐにパンクしてしまいます。
そのため、Flashメモリー部分をSRAMのように使用する方法もArduinoにはあります。
プログラムを作った結果を見て、上手にこの方法法を使いわけて行きます。(PROGMEM文法による

2.SRAM

SRAMはPCで一般的に呼ぶメモリーと同じ役目をします。
プログラムが動作している間に、一時的に利用する変数などを読み書きするときに利用されます。
そのため、とても小さなメモリー量なので、プログラムを作成するときに変数や配列などを使用する場合、気を付けて使います。
できるだけサイズに合った変数の型を利用し、できるだけコンパクトなプログラムを作ることをお勧めします。
また、#defineなどで定数として使用できる変化しないものは、できるだけ#defineで定数化します。
定数はFlashのプログラム領域として使用されるためです。
SRAMは電源を切った場合にすべて消されてしまうため、電源が消されても記憶しておきたい値などは、EEPROMに記憶させます。
 (EEPROMを使う方法....記事作成後リンクをを貼ります) 

3.EEPROM

通常プログラムで使用する変数 int型やbyte型などの変数は、どんなにグローバル変数としても、Arduinoの電源が消えてしまえばずべて消えてしまいます。
たとえば、操作パネルのような機器を作り、その設定値を覚えさせておき、次の電源投入時にそのままの状態から動かしたい場合などがあります。
そのようなときは、変数に格納していたそれらの値をEEPROMにわざわざ書き込む必要があります。
また、EEPROMのデータは、自動で変数にロードされないため、電源投入時にはわざわっざ変数に読み込んでこなければいけません。
これはPCのプログラムでいう、設定値をiniファイルに保存し、iniファイルによって状態を再現するプログラムの方式と同じです。
なお、EEPROMへの読み書きは、C言語の一般的関数ではなく、digitalWriteのようなArduino専用の拡張命令として用意されています。
digitalWriteと少し異なるのは、digitalWriteのような必ず使う命令は、Arduinoの標準機能として、統合環境をたちあげた段階ですんなり使えますが、EEPROMのような関数は、ライブラリーとして用意されており、これを使用する場合は、includeでライブラリーを読み込まなくてはいけません。
さらにEEPROMで注意する点は、EEPROMには読み書きの電気的な制限回数があることです。
何十万回という制限機能でとても大きな数字に見えますが、何年も使用する機器において、操作・変更・のたびに書き換えていたのでは、あっという間に何十万回は到達します。
そのため、EEPROMへの読み書きは、電源のON/OFF時程度にとどめるか、変更が起こったとき、変更が起こった部分だけを書き換えるといった、小技が必要です。
 (EEPROMを使う方法....記事作成後リンクをを貼ります) 

プログラムが使うメモリー量を知るために

統合環境のメニューで ファイル-環境設定 を選択しダイアログを表示させ、かきの赤枠をチェックしておきます。

Arduino環境設定コンパイルオプション

これによってコンパイル状況やメモリー状況を統合環境の厳談に表示させ確認することができます。
もっと詳細に知る方法はありますが、これは後ほど記載します。<<LINKを後日はります>>

-Arduinoプログラミング基礎