ARM コミュニティにて公開されているホワイトペーパー “Cortex-M for Beginners”  和訳その2 (第3章~第4章)です.第2章までは以下のページです.

初心者のための ARM Cortex-M [1]
ARM コミュニティにて,"Cortex-M for Beginners" なるホワイトペーパーが公開されており,Cortex-M プロセッサの概要とプロセッサの比較が詳細に記述されいます.非常に良くまとまったドキュメントでしたので,勉強がてら和訳してみました.誤訳等々ある...

初心者のための ARM Cortex-M
Joseph Yiu

3. アーキテクチャ機能

3.1 プログラマモデル

Cortex-M プロセッサファミリプログラマモデルは非常に一貫しています.たとえば,R0 ~ R15,PSR,CONTROL,PRIMASK はすべての Cortex-M プロセッサで使用できます.2つの特殊レジスタ( FAULTMASK と BASEPRI )は Cortex-M3,Cortex-M4,Cortex-M7 でのみ使用でき,浮動小数点レジスタバンクと FPSCR (浮動小数点ステータスレジスタおよび制御レジスタ)は Cortex-M4/M7 のオプションである浮動小数点ユニット内で使用します.

(図5)

BASEPRI レジスタを使用すると,特定の優先レベルまたは優先順位の低い例外や割り込みをブロックすることができます.ARMv7-M では,Cortex-M3,Cortex-M4,Cortex-M7 プロセッサで優先度を多数設定できますが,ARMv6-M では4つのプログラムレベルに制限されているため,これは重要です.FAULTMASK は通常,複雑なフォルトハンドラ(3.4節参照)で使用されます.

特権のない実行レベルは ARMv6-M ではオプションであり,ARMv7-M では常に使用できます.これは Cortex-M0+ ではオプションであり,Cortex-M0 および Cortex-M1 では使用できません.この相違点は,CONTROL レジスタが,異なるCortex-M プロセッサ間で軽微な違いを持つことを意味します.図6に示すように,FPU オプションも CONTROL レジスタに影響します.

(図6)

プログラマモデルのもう1つの違いは、PSR(Program Status Register)の詳細です.すべての Cortex-M プロセッサでは,PSR を Application PSR,Execution PSR,およびInterrupt PSR に細分することができます.APSR の Q ビットおよびEPSR の ICI/IT ビットは ARMv6-M では使用できず,GE ビットは ARMv7E-M (Cortex-M4 など)のみで使用できます.また,IPSR の割り込み番号の使用できる範囲は ARMv6-M の方が狭くなっています.これらを図7 に示します.

(図7)

Cortex-M のプログラマモデルは,ARM7TDMI などの従来の ARM プロセッサとは異なっています.レジスタバンクのほかに,従来の ARM プロセッサの “モード”と “ステート”の定義は,Cortex-M では異なります.Cortex-M にはスレッドとハンドラの2つのモードしかなく,Cortex-M プロセッサは常に Thumb 状態で動作します( ARM 命令はサポートされていません).

3.2 例外モデルと NVIC

すべての Cortex-M プロセッサには Nested Vectored Interrupt Controller(NVIC)が組み込まれており,同じ例外モデルを共有しています.例外が発生し,現在のレベルより優先順位が高く,マスキングレジスタによってブロックされていない場合には,プロセッサは割り込み/例外を受け入れ,現在のスタックに 8個のレジスタをスタックします.このスタッキング機構は,割り込みハンドラを通常の C 言語の関数として記述することを可能にし,スタッキングがそれ以上必要ないため,多くの小さな割り込み関数が実際の作業をすぐに開始できるようにします.

ARMv7-M で使用できる一部の割り込みとシステム例外は,ARMv6-M では使用できません(図8参照).たとえば,Cortex-M0、M0+、および M1 では,割り込み数は 32 に制限されています.デバッグモニタ例外はなく,フォルト例外は HardFault に制限されています(フォルト処理の詳細については 3.4 節を参照してください).対照的に,Cortex-M3,Cortex-M4 および Cortex-M7 プロセッサは,最大 240 の周辺割り込みをサポートします.

もう1つの違いは,利用可能な優先レベルの数です.ARMv6-M アーキテクチャでは,割り込み/例外の優先レベルに2つの固定レベル( NMI および HardFault 用)と 4つのプログラマブルレベル(優先順位レベルレジスタごとに2ビット)が含まれています.ほとんどのマイクロコントローラアプリケーションにはこれで十分です.

ARMv7-M では,プログラム可能な優先レベルの数は,8レベル(3ビット)から 256(8ビット)の範囲です.ただし実際には,ほとんどのデバイスはシリコン領域のためにわずか 8(3ビット)から 16レベル(4ビット)しか実装していません.また,ARMv7-Mには優先度グループ化と呼ばれる機能もあり,優先度レベルレジスタをグループ優先度とサブプライオリティに細分することができ,プリエンプション動作を詳細に定義できます.

(図8)すべての Cortex-M プロセッサは,例外処理はベクタテーブルに依存します.ベクタテーブルには例外ハンドラの開始アドレスが格納されており,デフォルトではメモリマップの開始位置に配置されています(アドレス 0x0,図8 参照).ベクタテーブル開始アドレスは,ベクタテーブルオフセットレジスタ(VTOR)と呼ばれる機能を使用して変更することができます.これは次のような場合に便利な機能です.

  • 動的に変化する例外ハンドラのエントリーポイントを許可するために,ベクタテーブルをSRAMに再配置する
  • 高速ベクタフェッチのためにベクタテーブルを SRAM に再配置(フラッシュメモリが遅い場合)
  • ベクタテーブルを ROM(またはフラッシュ)内の異なる位置に再配置することにより,異なるステージの実行プログラムが異なる例外ハンドラを有することができる.

VTOR は,Cortex-M0+/M3/M4/M7 および ARMv8-M プロセッサ(Cortex-M0+ および ARMv8-M ベースラインではオプション)で使用できます.

NVIC プログラマのモデルには,Cortex-M プロセッサ間でいくつかの相違点があります.その違いを表5に要約します.

(表5)

ほとんどの場合,NVIC の割り込み制御機能へのアクセスは,マイクロコントローラサプライヤのデバイスドライバ・ライブラリに含まれている CMSIS-Core で提供される API によって処理されますが,Cortex-M3/M4/M7では,割り込みが有効になっていても優先順位を変更することができます.この動的優先レベル変更は ARMv6-M ではサポートされていないため,優先レベルを変更するときには一時的に割り込みを無効にする必要があります.

3.3 OS サポート機能

Cortex-M プロセッサのアーキテクチャは,OS を考慮して設計されています. OS をサポートする機能は次のとおりです.

  • シャドースタックポインタ
  • SVC および PendSV 例外
  • SysTick タイマー : 時間管理とタスク管理のための定期的な OS 例外を生成するための 24ビットダウンカウンタ
  • Cortex-M0+/M3/M4 および M7 の特権レベルの実行レベルとメモリ保護ユニット(MPU)

SVC 例外は,非特権状態で実行されているアプリケーションタスクが特権 OS サービスをトリガできるようにする SVC 命令によってトリガされます.PendSV 例外は,OS がコンテキスト切り替えのような重要でない操作をスケジュールするのに便利です.

Cortex-M1 を非常に小さな FPGA デバイスに適合させるために,これらの OS サポート機能はすべて Cortex-M1 ではオプションになっています. Cortex-M0 および Cortex-M0+ では,SysTick タイマはオプションです.

一般に,OS サポートはすべての Cortex-M プロセッサで利用できます.Cortex-M0,Cortex-M3,Cortex-M4,Cortex-M7,および ARMv8-M プロセッサでは,アプリケーションタスクは特権のない実行レベルで実行でき,メモリアクセス違反を防ぐためにメモリ保護ユニット(MPU)と併用できます.これにより,システムの堅牢性を高めることができます.

3.4 フォルトの取り扱い

ARM プロセッサと他のマイクロコントローラアーキテクチャの違いの1つは,フォルト処理機能です.フォルトが検出されると、そのソフトウェアが適切な処置を実行できるように,フォルト例外がトリガされます.フォルトとは次のようなものです.

  • 未定義の命令(フラッシュメモリが壊れているなど)
  • 不正なアドレス空間へのアクセス(スタックポインタの破損など)または MPU アクセス違反
  • 不正な操作(たとえば、プロセッサが既にSVCより高い割り込み優先順位にあるときに SVC 例外をトリガしようとする)

フォルト・ハンドリングにより,組み込みシステムはさまざまな問題に迅速に対応できます.そうでないと,システムがハングアップした場合に,ウォッチドッグタイマがシステムをリセットするのに時間がかかることがあります.

ARMv6-M アーキテクチャでは,すべてのフォルトイベントが HardFault ハンドラをトリガします.このハンドラは優先レベル-1(すべてのプログラマブル例外より優先度が高く,マスク不可割り込み NMI の直下)を持ちます.すべての障害は回復不能とみなされ,通常はエラー報告を実行し,HardFault ハンドラ内で自己リセットを生成する可能性があります.

ARMv7-M には,HardFault に加えて 3つの設定可能なフォルトハンドラがあります.

  • Memmanage(メモリ管理フォルト)
  • バスフォルト(バスはエラー応答を返します)
  • Usage フォルト(定義されていない命令またはその他の不正な操作)

これらの例外にはプログラム可能な優先レベルがあり,個々に有効/無効にすることができます.また,必要に応じてFAULTMASK レジスタを使用して優先順位を HardFault と同じレベルに引き上げることもできます.また,何がフォルト例外をトリガしたかについてのヒントを提示するフォルトステータスレジスタが数多くあります.フォルトアドレスレジスタは,フォルトをトリガしてデバッグを容易にする転送アドレスを特定するために使用できます.

ARMv7-M で追加されたフォルトハンドラはより柔軟なフォルト処理機能を提供し,フォルトステータスレジスタはフォルトイベントの検出とデバッグを容易にしました.商用開発スイートの多くのデバッガには,フォルトステータスレジスタを使用してフォルトイベントを診断する機能が含まれています.さらに,実行時にフォルトハンドラはいくつかの救済措置を実行することができる可能性があります.

4. システム機能

4.1 低消費電力サポート

低消費電力は,Cortex-M プロセッサの1つの主要な利点です.低消費電力のサポートは,アーキテクチャに組み込まれています.

  • WFIおよびWFE命令
  • アーキテクチャ上のスリープモードの定義

加えて,その他 Cortex-M プロセッサで利用可能な低消費電力機能がいくつかあります.

  • スリープモードとディープスリープモード:アーキテクチャ的にサポートされており,デバイス固有の電源制御レジスタを使用してさらに拡張できます。
  • スリープ・オン・イグジット:割り込み駆動型アプリケーションで低消費電力を実現します.有効にすると,プロセッサは例外ハンドラが終了し,他に保留されている例外がなければ自動的にスリープ状態になります.これにより,スレッドモードでコードを実行する余分なアクティブサイクルを回避し,不要なスタック操作を減らすことで消費電力を削減します.
  • ウェイクアップ割り込みコントローラ(WIC):特定の低電力状態の間,プロセッサの外側にある小さなブロックによって割り込み検出を実行することを可能にするオプション機能.例えば,プロセッサが SRPG(State Retention Power Gating)でパワーダウンしているときに発生します.
  • クロックゲーティングとアーキテクチャクロックゲーティング:プロセッサのレジスタまたはサブモジュールへのクロックをオフにして電力を削減できます.

これらの機能は,Cortex-M0,Cortex-M0+,Cortex-M3,Cortex-M4,および Cortex-M7 プロセッサでサポートされています.さらに,消費電力を低減するために様々な低電力設計技術が使用されています.

ゲート数が少ないため,Cortex-M0 および Cortex-M0+ プロセッサは Cortex-M3,Cortex-M4 および Cortex-M7 プロセッサよりも低消費電力です.さらに,Cortex-M0+ にはシステムレベルの消費電力を低く抑えるために,プログラムアクセスの量を減らすための追加の最適化機能(ブランチシャドウなど)があります.

4.2 ビットバンド機能

Cortex-M3 および Cortex-M4 プロセッサにはビットバンドと呼ばれるオプションの機能があり,ビットバンドエイリアスアドレスを使用して2つの 1MB アドレス範囲(1つはSRAM 0x20000000 から,もう一つはペリフェラル 0x40000000 から)を割り当てることができます.Cortex-M0,M0+,および Cortex-M1 プロセッサにはこの機能はありませんが,ARM Cortex-M システムデザインキット(CMSDK)のバスレベルコンポーネントを使用してシステムレベルで追加できます.Cortex-M7 プロセッサは,ビットバンドでキャッシュサポート機能を使用できないため(キャッシュコントローラはメモリ空間のエイリアシングを認識しないため)ビットバンドをサポートしていません.

4.3 メモリ保護ユニット(MPU)

Cortex-M0+,Cortex-M3,Cortex-M4,および Cortex-M7 プロセッサにはオプションの MPU があり,メモリアクセスのパーミッションと,メモリ属性またはメモリ領域の定義に使用できます.RealTime Operating System(RTOS)を備えたシステムでは,各タスクが他のタスクや OS カーネルで使用されるメモリ範囲を破壊できないように,各タスクのメモリアクセスのパーミッションとメモリ構成を定義できます.Cortex-M0+,Cortex-M3,Cortex-M4 の MPU はすべて8つのプログラマブル領域を持ち,プログラマモデルは非常に似ています.主な違いは,Cortex-M3/M4 の MPU は2レベルのメモリ属性(システムレベルのキャッシュタイプなど)をサポートし,Cortex-M0+ プロセッサのメモリ属性は 1レベルしかサポートしないことです.Cortex-M7 のオプションの MPU は,8または16の領域をサポートするように構成でき,2つのレベルのメモリ属性が可能です. Cortex-M0 および Cortex-M1 は MPU をサポートしていません.

4.4 シングルサイクル I/O インターフェース

シングルサイクル I/O インタフェースは,Cortex-M0+ プロセッサの独自の機能であり,I/O 制御タスクを非常に高速に動作させることを可能にします.他の Cortex-M プロセッサでは,バスインタフェースは AHB Lite プロトコルに基づいており,これはパイプラインバスプロトコルであり,高いクロック周波数動作を可能にします.ただし,1回の転送で2クロックサイクルが必要であることを意味します.シングルサイクル I/O インタフェースは,GPIO (汎用入力/出力)のようなデバイス固有の小さなペリフェラルセットに接続するためのパイプライン化されていないシンプルなバスインタフェースを追加します.この機能を Cortex-M0+ プロセッサの低分岐ペナルティ特性と組み合わせると(そのパイプラインは2段階に過ぎないため),他のほとんどのマイクロコントローラアーキテクチャよりも多くの I/O 制御動作を高速に実行できます.

参考