【マイコン】メモリの概念『メモリ空間』、『メモリマップ』とは? CPUとメモリの関係について解説!

電子部品

エレクトロニクスの分野において、「メモリ」には様々な意味、用途があります。この記事では、メモリの概念(アドレス空間やメモリマップなど)や、CPUとメモリの関係について、汎用マイコン内部のメモリアクセスを例に分かりやすく解説します。

👉この記事で分かること

✔️組み込みシステムにおける「メモリ」の概念
✔️CPUによるメモリアクセスの仕組み
✔️「アドレス空間」とは何か
✔️「メモリマップ」とは何か(マイコン内部メモリの仕組み)

メモリとは?

メモリとは、ROMやRAMのような半導体チップに限らず、「アドレス(データの場所)を指定することで、その格納領域との間でデータのやり取りができる記憶装置」全般を指します。一つのアドレスには、通常1バイトのデータ格納領域が割り当てられます。

ここで言う「データ」とは、CPUが実行するプログラム自身や、そのプログラムが扱うデータのことです。メモリがなければ、CPUはプログラムを実行することができません。

メモリは通常、CPUによって制御されます(ここではDMAの概念は考えません)。CPUがメモリに対して実行する動作は大別すると下記の二つです。

✔️メモリライト(プログラム):メモリへデータを書き込みこと
✔️メモリリード:メモリからデータを読み出すこと

これらを総称して「メモリアクセス」といいます。単に、「ライト」、「リード」、「アクセス」と呼ぶことが多いです。

メモリ・アクセスの概念:上図において、例えばCPUがアドレス「3」を指定してメモリ・リードを行うと、メモリはデータ「1F」を出力する。                            

アドレス空間

CPUがメモリアクセスを行うには、メモリに対して一意のアドレスを指定する必要があります。

CPUが指定可能なアドレスの範囲を「アドレス空間」と呼びます。「メモリ空間」と表現されることもあります。

アドレス空間の広さは、CPUの持つアドレスバスのビット数(幅)で決まります。例えば、32ビットのアドレスバスを持つCPUは、232=4,294,967,295通りのアドレス(0番地〜4,294,967,294番地)を指し示すことができます。この番地それぞれが1バイト分のデータ格納領域を持つため、32bitのCPUのメモリ空間は、4,294,967,295バイトとなります。

この「4,294,967,294バイト」を「1,073,741,824(10243)」で割ると「4Gバイト」となります。
すなわち、32bitのCPUは4Gバイトのアドレス空間を持つ、ということになります。

32bit CPUのアドレス空間:
32bitのアドレスバスは4G通りのアドレスを表現できる。各アドレスには1バイトのデータ格納領域がある。
✔️単位 → 1K(キロ)は1024?
なお、コンピュータの世界では、1K(キロ)=1024で表現します(1024は210であり、2進法の観点でキリの良い数字であるため)。
同様に、1M(メガ)=1,048,576バイト(10242)、1G(ギガ)=1,073,741,824(10243)で表現します。

マイコンのメモリマップ

マイコン内部のメモリは、あらかじめ決められた用途ごとに専用の領域が割り当てられています。その割り当てを示したものが「メモリマップ」です。下図のようなメモリマップがマイコンのハードウエアマニュアルに定義されています。

以下、このメモリマップを例に解説します。

マイコンのメモリマップ:マイコンのデータシートに定義されており、メモリ空間の割り当てが示されている。

まず、この「メモリマップ」には、0000 0000h 〜 FFFF FFFFhのメモリ空間が定義されています。
FFFF FFFFh=4,294,967,294dですから、4Gバイトのメモリ空間を定義している(32bit CPUである)ことが分かります。

✔️アドレス値の末尾”h”や”d”とは?
末尾の”h”は16進数表記であることを示しています(hexadecimalの”h”)。同様に10進数表記の場合は末尾に”d”(decimalの”d”)を、2進数表記の場合は末尾に”b”(binaryの”b”)を付与することが一般的です。

このメモリマップには周辺機器を制御するための、「内蔵RAM」、「内蔵ROM」、「周辺I/Oレジスタ」、「外部アドレス空間」が定義されています。

マイコンはCPUと周辺機器で構成されており、CPUはメモリを介して周辺機器を制御します。

メモリアクセスを具体的に理解するための例として「内蔵RAM」、「内蔵ROM」、「周辺I/Oレジスタ」、「外部アドレス空間」についてそれぞれ解説していきます。

内蔵RAM

4GBのメモリ空間の内、0000 0000h〜0000 C000h領域には「内蔵RAM」が割り当てられています。

✔️RAMとは?
RAM(Random Access Memory)は記憶装置です。ROMよりも高速ですが、電源を切るとデータが失われるという特徴(揮発性)があります。主にCPUがプログラムを実行する領域として使用します。プログラム(CPU)がこのRAMを使用する場合は、0000 0000h〜0000 C000hにアクセスすれば良い、ということがメモリ・マップから読み取れます。

「内蔵RAM」に割り当てられた領域のサイズは、C0000h – 0000h = C0000h = 49,152dですから、このRAMは、49152/1024 = 48KBの容量を持つということが分かります。

内蔵RAMの容量はマイコンの型番によって大きく異なります。

RAMは主にプログラムの実行場所(ソフトウエアの作業場所)として使用されることが多いため、ハードウエア設計者は必要な容量を想定しづらいです。ソフトウエア設計者にヒアリングした上で必要な容量を確保しましょう。

内蔵RAMで容量が足りない場合は、外部メモリ拡張を行うのも一つの手段です(「外部メモリ空間」の項を参照)。

内蔵RAM:マイコンのメモリマップ上で内蔵RAMが割り当てられている例を示す

内蔵ROM

4Gバイトのメモリ空間の内、0010 0000h〜0010 8000h、00F8 0000h〜0100 0000hおよび、FF7F C000h〜FF80 0000h領域の3箇所には「内蔵ROM」が割り当てられています。

今回の例では、マイコンに3種類のROMが内蔵されていますが、これらのROMは、ユーザ・プログラムの保存、読み出し専用のブート・プログラムの保存、不揮発データ保存など、用途が定義されていることが一般的です。


プログラム(CPU)がこれらのROMを使用する場合は、それぞれのアドレス領域にアクセスすれば良い、ということがメモリ・マップから読み取れます。

✔️ROMとは?
ROM(Read Only memory)は記憶装置です。RAMよりも低速ですが、電源を切ってもデータが失われないという特徴(不揮発性)があり、CPUが実行するプログラムや、その他データを保存しておく領域として使用します。

「内蔵ROM」に割り当てられた領域からそれぞれのROMは32KB/511KB/16KBの容量を持つことが分かります。

・0010 8000h – 0010 0000h = 8,000h = 32,768d = 32Kバイト
・0100 0000h – 00F8 0000h = 80,000h = 524,228d = 512Kバイト
・FF80 0000h – FF7F C000h = 4,000h = 16,384d = 16Kバイト

内蔵ROMの個数、容量はマイコンによって大きく異なります。比較的小規模のプログラムであれば内蔵ROMのみで必要な容量を確保できる場合もありますが、足りなければ外部メモリ拡張を行う(「外部メモリ空間」の項を参照)のも一つの手段です。

内蔵ROM:マイコンのメモリマップ上で内蔵ROMが割り当てられている例を示す。

周辺I/Oレジスタ

4Gバイトのメモリ空間の内、0008 0000h〜0010 0000h、007F C000h〜007F C500hおよび、007F FC00h〜0080 0000h領域の3箇所には「周辺I/Oレジスタ」が割り当てられています。

マイコンには、CPU、RAM、ROM以外にも、外部の情報を入出力するためのハードウエアが搭載されています。これらを、「I/O(装置)」と呼びます。マイコンは、I/Oを通してセンサの情報を取得したり(入力)、アクチュエータを制御したり(出力)、外部のデバイスと通信します。
※I/Oとは広義でソフトウエアを含む場合もありますが、本記事内ではハードウエアのみを指します。

CPUがI/Oを制御するために使用するメモリを「周辺I/Oレジスタ」といいます。I/Oは対応する「周辺I/Oレジスタ」に書き込まれた値に従い、あらかじめ決められた動きをするハードウエアです。

つまり、CPUはI/OレジスタへのメモリアクセスによってI/Oを(および、その先に接続されるハードウエアを)制御します。例えば、外部に情報を出力したい場合、CPUは「周辺I/Oレジスタ」にデータをライトし、外部の情報を入力したい場合は「周辺I/Oレジスタ」からデータをリードするといった具合です。

周辺I/Oレジスタ:周辺I/Oレジスタがマイコンのメモリマップ上で割り当てられている例および、I/Oとの関係を示す。
✔️I/Oレジスタの種類と定義は?
I/Oレジスタのデータサイズは種類によって異なり、8bit、16bit、32bitなど様々です。それぞれのレジスタに対してアドレスが割り当てられます。各レジスタの動作と、対応するアドレスの情報はマイコンのデータシートで定義されています。

I/Oレジスタ 具体的にどう使う?

I/Oレジスタへのアクセス例として、マイコンの汎用IOポートの内、PORT3-4とPORT3-5に1(Hレベル)を出力したい場合を考えます。

下図の例では、CPUはまずメモリマップ上の0008 C003hにアクセスし、「PORT3方向レジスタ」を設定します。PORT3方向レジスタは、PORT3の各端子ごとに1bitが割り当てられ「0」を設定すると入力ポートに、「1」を設定すると出力ポートになる機能を持ちます。

PORT3-4とPORT3-5を出力設定するので、データ30hを書き込むことになります(アクセス前の状態は初期値00hとします)。次に、CPUは0008 C003hにアクセスし、PORT3出力データレジスタを同様に設定します。PORT3出力データレジスタは、PORT3の各端子ごとに1bitが割り当てられ、「0」を設定すると0(Lレベル)が、「1」を設定すると1(Hレベル)が、対応する端子から出力されます。

以上、2回のIOレジスタアクセスにより、CPUはハードウエア(マイコンの汎用IOポート)を制御したことになります。

「周辺I/Oレジスタ」の一例:CPUが「周辺I/Oレジスタ」の”PORT3方向レジスタ”と”PORT3出力データレジスタ”へデータ(30h)を書き込むと、マイコンの汎用I/O(PORT3-4、PORT3-5)から「1(Hレベル)」が出力される。このように、CPUはメモリアクセスを通じて周辺I/Oを制御する。

もちろん、CPUによるI/Oレジスタへのアクセスはリードの場合もあります(外部装置から入力された情報の取得、周辺I/Oのステータス取得、他)。

I/Oレジスタは多くの種類があり、その機能は制御したいI/Oや制御内容によって異なりますが、CPUの動きとしては指定するアドレスが違うという点を除けば、全て同じメモリアクセスです。

外部アドレス空間

マイコンには、内蔵のRAMやROMでは足りない場合等のために、マイコン外部にメモリ拡張する(マイコン外部にメモリデバイスを外付けする)機能を持つものがあります。

外部メモリへの直接的なアクセスは周辺機器(外部バスコントローラ)によって行われますが、これを制御するためのメモリ領域を「外部アドレス空間」と言います。

マイコンと外部メモリは、マイコンのハードウエアである外部バス(アドレスバス、データバス、コントロール信号)で接続します。

マイコンの外部バスには複数の外部メモリを接続可能です。

複数のデバイスで外部バスを共有することになるため、各デバイスへのアクセスが有効であることを示すCS(Chip Select)信号がデバイス毎に必要となります(下図)。

今回の例ではマイコンが出力するCS信号は4つ(CS0〜CS3)あります(外部メモリを4つまで接続できるということになります)。

例えば、外部メモリにCS0を接続して使用する場合、外部メモリを「CS0空間に割り当てる」といった言い方をします。

外部バス:外部メモリ拡張が可能なマイコンは外部バスを持ちます。外部バスはCS信号を含むコントロール信号、アドレスバス、データバスから構成されます。アドレスバス、データバスの幅によって接続可能なメモリのサイズが異なります。

今回例としたメモリマップ上では、「外部アドレス空間」は全部で48MBありますが内44MBは予約領域で、残り4MBを外部メモリとのやりとりに使用します(下図)。

CPUが外部アドレス空間にアクセスした場合、マイコン内部の外部バスコントローラがアドレスを変換し、CS信号とともに外部バス上に出力します。

✔️外部アドレス空間 具体的にどう使う?
例えば、CPUが「CS1空間にアサインされた外部メモリの12h番地」へアクセスしたい場合、外部アドレス空間上で、CS1領域の開始アドレスでオフセットした番地を指定します(12h+050F FFFF=0510 0011hへアクセス)。これにより、バスコントローラは外部バス上でCS1信号を有効にしアドレスバスに12hを出力します。マイコンは、外部バスを介し対象の外部メモリの12h番地に対しアクセスします。

このようにCPUは、「外部アドレス空間」へのメモリアクセスにより外部バス(マイコンのハードウエア)を制御し、外部メモリへアクセスします。

外部アドレス空間と外部デバイス:マイコン内部の外部アドレス空間は4つのCS空間に分割されている。CPUは外部アドレス空間に対して一意のアドレスを指定するが、マイコンのハードウエア(バスコントローラ)によりエンコードされ、各外部デバイスはCS信号と共にオフセットされた1MB空間のアドレス(0番地〜1,048,575番地)を指定される。
✔️4M(22bit)のアドレス空間 → 外部アドレスバスは1M(20bit)?
4MBの空間を指定するためには、2の22乗、つまり22本のアドレスバスが必要になりますが、今回の例では、外部バスのアドレスは20本(2の20乗=1MB分)となります。これは、メモリマップ上の4MBがCS空間ごとに4分割されているためです。
✔️マイコンの外部アドレス幅 < 外部メモリのアドレス幅のときは?
今回の例で言えば、1M以上のアドレス空間を持った外部メモリは接続できません。外部メモリとマイコンの仕様を確認してデバイスを選定する必要があります。ただし、CS空間を結合して大きな一つの外部メモリを接続できるマイコンもあります。

コメント