メモリマップの特徴
Cortex-M3のメモリマップには、一般的なマイコンのメモリマップと若干異なる特徴があります。次にその特徴を説明いたします。
定義されたメモリマップ
Cortex-M3のメモリ領域は、プログラムカウンタ(PC)が32ビットですので、全部で4GBです。メモリマッピングの詳細は、本ページ内の「Cortex-M3のメモリマップ」で述べます。
一般的なマイコンでは、メモリ領域を変更できるものもあります。しかし、Cortex-M3のメモリマップは定義されたメモリマップになっており、アドレス領域のマッピングは固定です。理由はいくつかありますが、一番大きな理由は、ビットフィールド命令があり、オリジナルのアドレスとエイリアスのアドレスの相対関係が崩れないようにしているためです。またアドレスマッピングが固定であると、異なるCortex-M3を搭載したマイコン間での移植が容易になります。
コードエリアとデータエリアの区別がない
もうひとつの特徴は、コードエリアとデータエリアの区別がないという事です。そのため、RAM領域上に置かれたコードを実行することができます。RAM領域上にEEPROMを実装しているマイコンもあり、EEPROM上でもコードを実行できます。
一般的なマイコンの中には、Flash ROMの中が、プログラムエリアとデータエリアに分かれていて、データエリアにプログラムを記述できないものがあります。折角広いアドレス領域があっても、使用方法に制限があると、もったいないと思いませんか?
Cortex-M3では、その様な制限がありませんので、ユーザーは自由にアドレス領域を使用することができます。
RAM領域でもプログラムを実行できるというメリットを生かして、コードサイズの小さいプログラムなら、RAMまたはEEPROMにコードを置いて実行し、Flash ROMを停止させて消費電流の最適化ができる製品もあります。もちろん、この時、ベクタテーブルもRAMまたはEEPROMに移動して、割り込みも受け付けることができます。
ビット操作が容易
周辺領域とRAM領域にはビットバンドエリアがあり、容易にビットバンドを使うことができますが、すべての領域でビットバンドが使えるわけではありません。(本ページ内「Cortex-M3のメモリマップ参照」)
その他の特徴
すでに説明済みですが、アンアラインド・データ・アクセス(第8回参照)が可能です。また、リトルエンディアン、ビッグエンディアン(第13回参照)構成が選択可能です。
MPU(メモリ保護ユニット:Memory Protection Unit)
Cortex-M3には、MPUというオプション機能があります。オプションと言ってもマイコンのユーザーが選択できるオプションではなく、マイコンベンダーが自社の製品に搭載するかしないかを選択できるオプションです。
MPUには次のような機能が備え付けられています。
- ユーザーアプリケーションが、OSが使用するメモリ領域を破壊することから保護します。
- プロセスを分離し、プロセッシングタスク間のデータを分けることができます。
- 予期せぬメモリアクセス(例:スタック破損)を検出することができます。
- 保護領域の属性と許可を指定できます。
そして、主な特長は次のようになります。
- 最大8領域まで保護設定可能です。
- 特権アクセス用にメモリマップを定義可能です。
- MPU領域で定義されていないメモリ位置へのアクセスでメモリ管理フォールトを発生できます。
- MPU領域設定で許可されていないメモリ位置へのアクセスでメモリ管理フォールトを発生できます。
- MPU領域の重複が可能(属性指定、許可)です。
具体的には、次のような領域の設定ができます。
- 特権プログラムに対するプログラムコード(例:OSカーネルや例外ハンドラ)
- ユーザープログラムに対するプログラムコード
- コード領域内の特権プログラム用のデータメモリ(データ+スタック)
- コード領域内のユーザープログラム用のデータメモリ(データ+スタック)
- ほかのメモリ領域にある特権およびユーザープログラム用のデータメモリ(例:SRAM)
- システムデバイス領域(通常は特権アクセス専用:NVICおよびMPUレジスタ用)
簡単に言うと、アドレスマップの領域を、ユーザーの要望に従って、定義し、さらにアクセス許可または不許可の設定ができます。製品の仕様にMPU搭載という記述があれば、非常に便利な機能ですので、是非活用してください。
Cortex-M3のメモリマップ
ベンダー固有(0.5GB)
マイコンベンダーが従来システムのペリフェラルと互換性を実装するのを可能にするために、割り当てられます。
プライベート周辺バス(1MB)
システムコンポーネント用のアドレススペースです。(CoreSight, NVIC, etc.)
- プライベート周辺バス – 外部
ツール(ETMやトレース)等の外部とのインタフェースに使われます。 - プライベート周辺バス – 内部
データのウォッチやブレークポイント等の内部のインタフェースに使われます。
外部デバイス(1GB)
外部デバイスまたは配列 / ノンバッファが必要な外部メモリへの拡張用です。
外部RAM(1GB)
外付けメモリへの拡張用です。
周辺(0.5GB)
通常のペリフェラル用32MBのペリフェラル用アドレス領域の下位の1MB(0x40000000 – 0x400FFFFF)はビットバンドアクセス用に予約されています。 ビットバンドエイリアス領域32MB(0x42000000 – 0x43FFFFFF)はこの1MBに割り当てられています。
SRAM(0.5GB)
内蔵SRAMの領域。SRAMの下位の1MBのアドレススペース(0x20000000 – 0x200FFFFF)はビットバンド用に予約されています。
SRAM 32MBのビットバンドエイリアスエリア(0x22000000 – 0x23FFFFFF)へのアクセスはこの1MBに割り当てられます。
コード(0.5GB)
コード領域として予約されています(Flash, SRAM)。この領域はCortex-M3のIcodeバスとDcodeバスを経由してアクセスされます。
こちらも是非
“もっと見る” Cortex-M編
SysTick、電力管理
SysTick機能を有効にするには、SysTick制御およびステータスレジスタを使用します。このレジスタのENABLEビットを1にすると、カウンタは動作をはじめます。つまり、カウンタにリロード値がロードされてから、カウントダウンが開始されます。
ベクタテーブル
Cortex-M3のベクタテーブルは0番地から始まります。一般的なマイコンは、ベクタテーブルの最小アドレス部(0番地)にはリセットベクタが割り当てられていますが、Cortex-M3ではメインスタック(SP_main)の初期値が割り当てられています。
NVICレジスタ
NVIC(統合ネスト型ベクタ割り込みコントローラ)が持っている制御用レジスタを説明します。SysTick関係のレジスタもNVICレジスタに含まれますが、それらはSysTickの章で詳しく説明します。