ESP32のメモリ
ESP32などのマイコンには、プログラムやデータを記録するためのメモリ(記憶装置)が搭載されています。今回はESPに搭載されているメモリについていろいろ調べていきます。
メモリの種類
コンピュータのメモリは、大きく『揮発性メモリ』と『不揮発性メモリ』に分類され、それぞれさらに構造や特性によって分類されています。
揮発性メモリ
揮発性メモリ とは、データを保持するために電源の供給が必要なものです。つまり電源を切るとデータが消えてしまいます。その代わり、多くの場合『読み書きが高速』『容量あたりの価格が安い』という特徴があるため、プログラム実行中の変数データなどを保持する主記憶装置として利用されます。いわゆる RAM (=Random Access Memory)が揮発性メモリです。RAMはさらにDRAM(=Dynamic RAM)とSRAM(=Static RAM)などに分類されます。
DRAM
メモリそのものの構造が単純で、安価に大容量の装置が作れるのが特徴です。PCの主記憶装置としてよく使われます。
SRAM
不揮発性メモリ
不揮発性メモリと は、データを保持するために電源の供給が必要ないものです。電源を切ってもデータが消えません。いわゆる ROM(=Read Only Memory)です。不揮発性メモリにも様々な種類があります。
マスクROM
マスクROMは、製造段階で内部回路そのものでデータが記録されます。よって、あとからデータを修正することは不可能ですが、大量生産には向いています。ただし一度製品に組み込まれてしまうと、プログラムやデータのアップデートのためには物理的にROMを交換することが必要になります。
PROM
PROMとは Programmable ROM の略です。工場出荷時にはデータが書き込まれておらず、ユーザが任意のデータを書き込むことが出来ます。狭義のPROMはデータの書き込みを内部回路のバイポーラトランジスタのPN接合やFETのMOS絶縁の破壊によって行っていたため、書き込みは一度のみで修正は出来ません。
EPROM
EPROMとは Erasable Programmable ROM の略です。ユーザがデータを書き込むことができ、また一定の手順で消去・再書き込みをすることができるものです。初期のEPROMは強い紫外線をチップに照射することで消去を行うようになっていたため、パッケージ上面にガラス窓が開いていました。現在このタイプは、後述のEEPROMと区別するため、UV-EPROMと呼ばれます。
EEPROM
EEPROMとは Electrically Erasable Programmable の略です。EPROMのうち、電気的な方法(通常の読み書きよりも高い電圧を使用するなど)でデータを消去・再書き込みすることができるものです。外付けの電気回路だけで読み書き可能なメモリとして使用でき、かつ電源の供給なしにデータ保持が可能なため、現在広く普及しています。
フラッシュメモリ
EEPROMの一種で、データの消去をブロック単位で行うようにして小型化したものです。機器内蔵の不揮発性メモリや携帯可能な小型記憶デバイスとして非常に広く利用されています。
EEPROM/フラッシュメモリの限界
EEPROM/フラッシュメモリは読み書き可能かつ電源なしでデータを保持できるといいことづくめのようですが、実は消去・再書き込みの回数の制限(寿命)があります。そのため、プログラム実行中にも頻繁に書き換えが発生する用途には向かず、RAMと置き換えて使うのは難しいのです。とはいえ、制限回数は100万回程度とされており、HDDのような外部記憶装置としての用途であればまったく問題ないでしょう。
EPS32の搭載メモリ
ESP32には様々な種類のメモリが内蔵されており、それぞれの特長を活かして使い分けられています。
以下は、手元にあるESP32-WROOM-32Eの場合のメモリ構成です。
種類 | 容量 | 用途 |
---|---|---|
ROM | 448kB | ブートプログラム |
SRAM | 520kB | データなど |
SRAM | 16kB | RTC |
FLASH | 4MB | プログラムなど |
上位のモデルになると、FLASHメモリの容量が増えたり、PSRAM というFLASHメモリよりも高速アクセスが可能なメモリが搭載されていたりします。
実験
回路・配線
今回はESP32-DevkitC単体で実験します。外付けの部品・配線は必要ありません。
プログラム
ソースコード
void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("ヒープメモリ容量:%d(利用可能%d)\n", ESP.getHeapSize(),ESP.getFreeHeap());
Serial.printf("FLASHメモリ容量 :%d\n",ESP.getFlashChipSize());
}
void loop() {
}
プログラム解説
今回のプログラムは、ヒープメモリ(SRAMのうち、プログラムの動的変数や関数呼び出し時のスタックとして使用される領域)およびFLASHメモリの容量を取得するものです。使用している関数はすべて ESP.h で定義されています。ESP.h は ESP32用の環境をセットアップするときにインストールされているので、新たな作業は不要です。
ESP.getHeapSize()関数
書式
uint32_t getHeapSize()
引数
なし
返却値
ヒープ領域の総容量をバイト単位uint32_t型の数値で返却します。
ESP.getFreeHeap()関数
書式
uint32_t getFreeHeap()
引数
なし
返却値
ヒープ領域のうち、利用可能な容量をバイト単位uint32_t型の数値で返却します。
ESP.getFlashChipSize()関数
書式
uint32_t getFlashChipSize()
引数
なし
返却値
FLASHメモリの総容量をバイト単位uint32_t型の数値で返却します。
実行結果
手元の環境(ESP32-WROOM-32E)では、
ヒープメモリ容量:380660(利用可能348356)
FLASHメモリ容量 :4194304
と表示されました。
まとめ
- ESP32にはいろいろな種類のメモリが搭載されており、その特性に応じて使い分けられている
コメント