ROM・RAM・FLASHの違いとは?初心者でもわかるように図解で解説【組み込み】

目次

ROM・FLASH・RAMの違い(概要)

一言でいうと「消えるメモリ(RAM)と消えないメモリ(ROM/FLASH)」の違いです。

ROM・FLASH・RAMの違いは次の通りです。

メモリ書き込み電源OFF用途
RAM可能消える作業メモリ
ROM基本不可消えないプログラム保存
FLASH可能消えないプログラム保存
EEPROM可能消えない設定値保存など

RAM:作業メモリ(電源OFFで消える)→ 実行中のデータや処理で使用
ROM:読み出し専用の不揮発メモリ→ プログラム本体を保存
FLASH:書き換え可能なROM(現在の主流)→ プログラム本体を保存

組み込みでは
「FLASHに保存 → RAMで実行」
という構造になります。

ROM・FLASH・RAMとは?

組み込み開発を学び始めると、次のような言葉をよく目にします。

  • RAM
  • ROM
  • FLASH
初心者さん

ROMとFLASHって何が違うの?

初心者さん

プログラムはどこに保存されているの?

初心者さん

RAMは何に使われているの?

と疑問に思う人も多いのではないでしょうか。

この記事では、ROM・FLASH・RAMの違いと、組み込み開発における役割をわかりやすく解説します。

初心者さん

ROMとRAMは聞いたことがありますが、FLASHって何ですか?

エンジニアくん

いい質問だね。実はFLASHはROMの一種なんだ。

初心者さん

えっ、そうなんですか?

エンジニアくん

うん。まずはそれぞれの特徴を見ていこう。

メモリ領域解説シリーズ

本記事は「メモリ領域解説」シリーズの1つです。

メモリ領域解説シリーズの全体像はこちら

ROM・FLASH・RAMの全体像

まずはFLASH(ROM)・RAMの全体イメージを見てみましょう。

メモリ領域の全体像

簡単に言うと、

  • FLASH(ROM) → プログラムを保存する場所
  • RAM → プログラム実行中に使う作業メモリ

です。

例えば、プログラム本体はFLASHに保存され、
変数や関数の処理はRAM上で実行されます。

メモリ領域の全体像はこちらの記事で詳しく解説しています。

RAMとは(Random Access Memory)

RAMは Random Access Memory の略で、プログラム実行中に使うメモリです。

特徴は次の通りです。

  • 読み書きができる
  • 電源を切ると内容が消える
  • プログラムの実行中に使用される

例えば次のコード。

int x = 10;

この変数 x は、実行中には RAM上に配置されます。

また、mallocなどによる動的メモリ確保(heap)も、このRAM上で行われます。

ヒープ領域についてはこちらの記事で解説しています。

揮発性メモリと不揮発性メモリ

初心者さん

RAMってなんで電源切ると消えちゃうんですか?

エンジニアくん

RAMは“揮発性メモリ”だからだよ。電気で状態を保っているから、電源が切れると消えちゃうんだ

初心者さん

じゃあROMは消えないんですか?

エンジニアくん

そう。不揮発性メモリだから電源がなくても保持できるんだ

メモリは大きく次の2種類に分けられます。

  • 揮発性メモリ
  • 不揮発性メモリ

揮発性メモリとは、電源を切ると内容が消えてしまうメモリのことです。
一方、不揮発性メモリは、電源を切っても内容が保持されるメモリです。

揮発性メモリ   → RAM
不揮発性メモリ → ROM / FLASH / EEPROM

RAMは揮発性メモリであるため、電源を切るとデータが消えてしまいます。
そのため、プログラムを保存する用途には向いていません。

一方、ROMやFLASHは不揮発性メモリであり、電源を切ってもデータが消えないため、
プログラムの保存に使用されます。

この違いがあるため、組み込みシステムでは「プログラムは不揮発メモリに保存し、実行時は揮発メモリを使う」という構造になっています。


ROMとは(Read Only Memory)

ROMは Read Only Memory の略です。

本来は

読み出し専用メモリ

を意味します。

特徴

  • 電源を切っても内容が消えない
  • 基本的には書き換えない

組み込み開発では、ROMは

プログラムを保存する不揮発メモリ

という意味で使われることが多いです。


FLASHとは(フラッシュメモリ)

FLASHメモリは、

電気的に書き換え可能なROM

です。

特徴

  • 電源を切っても消えない
  • 書き換え可能
  • プログラムを書き込める

現在の多くのマイコンでは、

ROMとしてFLASHメモリが使われています。

本来のROMは書き換えできないメモリですが、現在の組み込み開発では、電気的に書き換え可能なFLASHメモリがROMとして使われています。

初心者さん

つまりROMとFLASHは同じなんですか?

エンジニアくん

完全に同じではないけど、実務ではほぼ同じ意味で使われることが多いね。

初心者さん

そうなんですね!

エンジニアくん

設計資料ではROMと書いてあっても、実際のハードウェアはFLASHだったりするよ。

EEPROMとは(補足)

初心者さん

EEPROMっていうのも聞いたことがあります

エンジニアくん

いいところに気づいたね。FLASHと同じ“書き換えできるROM”の仲間だよ

初心者さん

じゃあ何が違うんですか?

エンジニアくん

EEPROMは少量のデータを細かく書き換えるのが得意で、FLASHは大きなデータをまとめて扱うのが得意なんだ

FLASHメモリと似たものとして、EEPROMというメモリもあります。

EEPROMは

電気的に書き換え可能なROMの一種で、FLASHと同じく不揮発メモリです。

ROM
 ├ EEPROM
 └ FLASH

主な違いは次の通りです。

  • EEPROM → 少量のデータを細かく書き換える用途
  • FLASH → プログラムなどをまとめて扱う用途

そのため組み込み開発では、

  • プログラム → FLASH
  • 設定値など → EEPROM

のように使い分けられることがあります。


ROM・FLASH・RAM・EEPROMの違い

それぞれの違いを整理すると次の通りです。

メモリ書き込み電源OFF用途
RAM可能消える作業メモリ
ROM基本不可消えないプログラム保存
FLASH可能消えないプログラム保存
EEPROM可能消えない設定値保存など

まとめると

  • RAM → 作業メモリ
  • ROM → 不揮発メモリ
  • FLASH → 書き換え可能なメモリ
  • EEPROM→書き換え可能で設定値など保存するメモリ

です。

起動時に何が起こるのか

組み込みプログラムでは、起動時に次のような処理が行われます。

スタートアップコードが行う処理

例えば次のコード。

C
int g = 10;

この 10 という初期値は

FLASHに保存されています。

そしてプログラム起動時に

FLASH → RAM

へコピーされます。

この処理は スタートアップコード が行っています。

※なぜ直接FLASHで実行しないのか?
→ RAMの方が高速にアクセスできるためです

つまり処理の流れは次の通りです。

C
FLASH(保存)

RAMへコピー

CPUが実行

スタートアップコードについてはこちらの記事で解説しています。

FLASHからRAMへのコピー、data領域についてはこちらの記事で解説しています。

RAMには種類がある(SRAMとDRAM)

RAMにはいくつか種類がありますが、代表的なのが次の2つです。

  • SRAM(Static RAM)
  • DRAM(Dynamic RAM)

それぞれ特徴が異なります。

種類速度価格容量用途
SRAM速い高い小さいマイコン内蔵RAM
DRAM遅い安い大きいPCメインメモリ

SRAMとDRAMの違いの詳細についてはこちらの記事で解説しています。


SRAMとは(組み込みで使うRAM)

SRAMは電源が入っている間、データを保持し続けるRAMです。
リフレッシュが不要で高速にアクセスできます。

そのため、

  • マイコン内蔵RAM
  • スタック領域
  • ヒープ領域
  • .data / .bss

などに使われます。

組み込み開発で「RAM」と言う場合、
多くはこの SRAM を指します。


DRAMとは(PCで使うRAM)

DRAMはデータを保持するために、
定期的にリフレッシュが必要なRAMです。

その代わり、

  • 安価
  • 大容量

という特徴があります。

そのためPCではメインメモリとして使われます。

  • DDR4
  • DDR5
  • LPDDR

これらはすべてDRAMです。


なぜ組み込みはDRAMを使わないの?

理由は次の通りです。

① 制御が複雑(専用コントローラが必要)
② リフレッシュ処理が必要
③ アクセス遅延が不定でリアルタイム性に不向き

そのため、リアルタイム性が重要な組み込みでは
扱いやすいSRAMが使われます。

だからマイコンはSRAM内蔵が多いです。


よくある疑問

初心者さん

ROMとFLASHは同じですか?

エンジニアくん

厳密には違いけど、実務ではほぼ同じ意味で使われます。


初心者さん

ROMとRAMの違いは何ですか?

エンジニアくん

一番大きな違いは「電源OFFで消えるかどうか」だね


初心者さん

RAMにプログラムは保存できる?

エンジニアくん

できますが、電源を切ると消えるため保存用途には向きません。


初心者さん

なぜFLASHからRAMにコピーするの?

エンジニアくん

RAMの方が高速に実行できるためです。


初心者さん

プログラムはどこで実行されているの?

エンジニアくん

実行自体はRAM上で行われるよ

まとめ

ROM・FLASH・RAMの違いを整理すると次の通りです。

  • RAM
    プログラム実行中の作業メモリ(電源OFFで消える)
  • ROM
    プログラムを保存する不揮発メモリ
  • FLASH
    書き換え可能なROMで、多くのマイコンでROMとして使われる

組み込み開発では、

  • FLASHにプログラムを保存し
  • RAMを使ってプログラムを実行する

という構造になっています。

この記事が参考になった方へ

メモリ領域については他の記事でも解説しています。

メモリ領域解説シリーズの全体像はこちら

また、static、const、ポインタ、mallocなど、メモリ領域の理解に関わるC言語文法についても当サイトで解説しています。

エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。

副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X・Qiita・noteでも発信しています。
X:更新情報・日常
Qiita:技術発信
note:キャリア・副業

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ
割り込み処理解説シリーズ
ソフトウェア設計解説シリーズ
キャリアと副業ロードマップ

コメント

コメントする


目次