電力管理
複数のスリープモード
Cortex-M7もCortex-M3/M4と同じように低消費電力モードをサポートしています。基本はCortex-M3/M4と同じです。Cortex-M7にはWIC(ウェイクアップ割り込みコントローラ)を含むと3種類のスリープを持っていることになります。
- スリープモード
- ディープスリープモード(WIC無し)
- ディープスリープモード(WIC有り)
各モードの詳細、遷移の条件、ウェイクアップ手段については、「Cortex-M編 第20回」をご参照ください。
あわせて読みたい
WIC
WICはベンダーオプションですので、搭載されていない製品もあります。 Cortex-M3やM4でも持っている機能ですが、Cortex-M3のレビジョン2(r2p0)以降で搭載されていますので、初期のCortex-M3を搭載したマイコンにはありません。
WICは、割り込みを検出し、ディープスリープモードからプロセッサをウェイクアップさせることができます。WICを有効にするには、SCRレジスタのDEEPSLEEPビットを1にします。WICは、プログラマブルではないので、レジスタまたはユーザーインターフェイスは持っていません。完全にハードウェア信号で動作します。
WICが有効になっていて、Cortex-M7がディープスリープモードに入ると、システム内の電力管理ユニットは、Cortex-M7プロセッサの大部分をパワーダウンします。その時は、システムタイマ(SysTick)も停止しますので、注意が必要です。
WICが割り込みを受け付けると、割り込みを処理する前に、プロセッサを起き上がらせます。その時に、状態を復元する処理のためにクロックサイクル数が必要です。すなわち、割り込み処理の遅延時間がディープスリープモードで増えることになります。プロセッサは、デバッガへの接続を検出した場合には、WICを無効にします。
低消費電力モードへの入り方
①WFI(Wait for interrupt)
WFI(割り込み待ち命令)は、スリープモードへの即時エントリを引き起こします。
②WFE(Wait for event)
WFE(イベント待ち命令)、1ビットのイベント・レジスタの値に応じて、スリープモードへのエントリを引き起こします。プロセッサはWFEを実行すると、イベント・レジスタの値をチェックします。
- 0:プロセッサは、命令の実行を停止し、スリープモードに入ります。
- 1:プロセッサは0にレジスタをクリアすると、スリープモードに入らずに命令を継続して実行します。
イベントレジスタが1の場合、これは、プロセッサがWFE命令の実行でスリープモードに入らないことを示します。それは、外部イベント信号(実装されている場合)がアサートされたか、またはシステム内のプロセッサがSEV命令を実行したからです。ソフトウェアは、直接このレジスタにアクセスすることはできません。
③スリープオンエグジット(SLEEP on EXIT)
SCRレジスタのSLEEPONEXITビットが1に設定されている場合、プロセッサは、すべての例外ハンドラの実行を完了した時には、スレッドモード(Cortex-M編 第8回参照)に戻り、すぐにスリープモードに入ります。
例外を一つしか使っていなくて、その例外の終了時に、自動的にスリープモードに入りたいアプリケーションの場合は、このメカニズムはとても便利です。
低消費電力モードからの復帰
①WFIによる低消費電力モードからの復帰とスリープオンエグジット(SLEEP on EXIT)
通常、プロセッサは、例外処理を起動するために十分な優先度を持った例外を検出した場合にのみ低消費電力モードから起き上がります。いくつかの組み込みシステムでは、プロセッサが起き上がった後、 割り込みハンドラを実行する前に、システムがタスクを復元実行しなければならないことがあります。
その為には、PRIMASKビットを1にセットし、FAULTMASKビットを0にします。有効な割り込みが発生し、現在の例外の優先度よりも高い優先度を持っている場合、プロセッサが起き上がりますが、プロセッサがPRIMASKを0にするまで、割り込みハンドラを実行しません。
②WFEによる低消費電力モードからの復帰
プロセッサは次の事象が発生すると低消費電力モードから起き上がります。
- 例外エントリを引き起こすのに十分な優先度の例外を検出した時
- オプションの外部イベント入力が実装されている場合、外部イベント信号を検出した時
- マルチプロセッサシステムでは、システム内の別のプロセッサがSEV命令を実行した時
一方、SCRレジスタのSEVONPENDビットが1に設定されている場合は、いくつかの新しい保留中の割り込みは、割り込みが無効になっている場合、または例外エントリを引き起こすのに十分でない優先順位の場合でも、イベントをトリガし、プロセッサを起き上がらせます。
コアデバッグ
Cortex-M7のデバッグ機能
Cortex-M7のデバッグ機能は、プロセッサHalt、シングルステップ、プロセッサコアレジスターアクセス、ベクトルキャッチ、無限のソフトウェアブレークポイント、およびフルシステムメモリアクセスを持っています。また、プロセッサは、インプリメンテーションの時に設定されたハードウェアブレークポイントとウォッチポイントのサポートも含みます。
- 4~8の命令コンパレーターをサポートしているブレークポイントユニット
- 2または4つのウォッチポイントをサポートしているウォッチポイントユニット
デバッグを実施するプロセッサのために、Armは、デバッガが識別し、CoreSight(Cortex-M編 第3回参照)デバッグインフラストラクチャーを使ってデバッグコンポーネントと接続するように推奨しています。
下図に、 CoreSightデバッグインフラストラクチャーにおいて、コンポーネントを見つけるためにデバッガが追って行く推奨フローを示します。このケースでは、デバッガが周辺装置とCoreSightシステム内の個々のCoreSightコンポーネント用のコンポーネントIDレジスタを読みます。
デバッガのCortex-M7識別
CoreSightシステム内のCortex-M7プロセッサを識別するために、Armは、デバッガが以下を実行するように推奨しています。
- CoreSight IDを使っているCortex-M7プロセッサROMテーブルを特定し、配置してください。
- Cortex-M7 プロセッサROMテーブル~PPB ROMテーブル内のポインターに従ってください。PPB ROMテーブル・ポインターから、以下の構成要素は特定することができます。
- a. システム制御スペース(SCS:System Control Space).
- b. ブレークポイントユニット(FPB:Breakpoint unit).
・BKPT比較の数 – 4または8
・命令フェッチとの合致 - c. データウォッチポイントとトレースユニット(DWT:Data Watch point and Trace unit).
・DWT比較の数 – 2または4
・データアクセスとPCとデータ値とサイクルカウント - d. インスツルメントトレースマクロセルユニット(ITM:Instrumentation Trace Macrocell unit).
・ソフトウエアでコントロールされるトレースの「printf-style」をサポート
浮動小数点ユニット
概要
Cortex-Mシリーズの浮動小数点ユニットはCortex-M4で初めてFPv4アーキテクチャーのものが搭載されました。FPv4では単精度演算しかできませんでしたが、Cortex-M7ではFPv5にアップデートされ、倍精度演算も可能になりました。倍精度演算用にいくつかの命令が追加になっています。FPv4拡張で、すでに64ビットデータのサポートは可能でしたので、同じロード/ストア命令を使います。
マイコンベンダーのオプションになっていますので、搭載の有無は製品のマニュアルを確認してください。搭載していても、単精度演算のみという製品もありますので、注意が必要です。
統合されたハードウェア浮動小数点(マイコンベンダーのオプション)
- FPv5 アーキテクチャ
- 16個の64ビットダブルワードレジスタ :D0~D15
- 32個の32ビットシングルワードレジスタ:S0~S31
- ANSI/IEEE Std 754-2008, IEEE Standard for Binary Floating-Point Arithmetic準拠
演算はハードウエアで実行
- 掛け算、足し算、引き算、積和演算
- 比較、フォーマット変換(固定小数点⇔浮動小数点)
- 割り算、平方根
リセット直後ディセーブル
- ソフトウエアでイネーブルにし、諸設定を行う必要有り
ANSI/IEEE Std 754-2008との互換性
デフォルトNaN(DN)とFlush-to-Zero(FZ)モードを使わなければ、FPv5機能はハードウェア上でのIEEE754スタンダードに準拠しますので、サポートコードは不要です。
- Flush-to-zeroモード:非正規化数を0に置換
- デフォルトNaNモード:入力がNaN(非数)、又は結果がNaNになる全ての演算でデフォルトNaNが返されるモード
FPUの有効化
FPUはリセット直後は無効になっていますので、ユーザーは不動小数点命令を使用する前に、FPUを有効化しなければなりません。以下に、特権モード(スーパーバイザモード)で、FPUを初期化するサンプルコードを示します。プロセッサは、CPACRレジスタを読み出し/書き込みを行うために特権モードでなければなりません。
CPACR EQU 0xE000ED88 LDR R0, =CPACR ; Read CPACR LDR r1, [R0] ; Set bits 20-23 to enable CP10 and CP11 coprocessors ORR R1, R1, #(0xF « 20) STR R1, [R0] ; Write back the modified value to the CPACR DSB ISB ; Reset pipeline now the FPU is enabled.
3つのフィールド
- 符号
- バイアスされた指数(指数+一定のバイアス値の合計)
- 仮数
単精度:32ビットコード長
倍精度:64ビットコード長
半精度:16ビットコード長
正規化浮動小数点数
- 正規化された浮動小数点数
- 数値を下記の様にコード化:符号 + 固定小数点値(1.0~2.0)x 2N
- 符号部(1ビット)
- 0:正
- 1:負
- 単精度指数部(8ビット)
- 指数レンジ:1 ~254(0 及び255は予約済み)
- バイアス:127
- 指数 – バイアス値のレンジ:-126 ~ +127
- 単精度仮数部(23ビット)
- 仮数:0 ~ 1の間の数値: ∑(Ni.2-i) (i = 1 ~ 24の範囲)23ビットのNi値が仮数部に保存される
- (-1)s x (1 + ∑(Ni.2-i) ) x 2 (指数 – バイアス)
浮動小数点の丸め
- 最近接丸め
- デフォルトの丸め方
- 2つの近接値の中間の値の場合:仮数のLSBが0になる値を採用する
- 方向丸め
- ユーザーで選択可能な3つの方向丸めモード
- +∞, -∞ 又は0に近い側への丸め
浮動小数点演算
加算、減算、乗算、除算、剰余算、平方根
浮動小数点フォーマットの変換
浮動小数点数から整数、丸め浮動小数点数から整数値、2進数-10進数変換、比較
例外処理
- 無効な演算:演算結果はNaN(非数)
- 0による除算
- オーバーフロー:丸め方に依存し、行先レジスタに書かれる値が+/-の無限大値、又は+/-の最大値を超える場合
- アンダーフロー:行先レジスタに非正規化数を書き込んだ場合
- 不正確な結果:丸めにより生じる結果
こちらも是非
“もっと見る” Cortex-M7編
AXI転送
AXI転送を行う際には、次に示す制限があります。バーストは、最大32バイト。バースト長さは、最大4転送。Strongly-orderedメモリまたはDeviceメモリの書き込みバーストの最大長は2転送です。Strongly-orderedメモリまたはDeviceメモリの読み出しは、常に1転送です。
キャッシュの初期化と有効化
Cortex-Aで採用されているユニフィケーションのポイント(Point of unification:PoU)と一貫性のポイント(Point of coherency :PoC)の考え方がCortex-M7でも採用されています。
キャッシュと属性
データ・キャッシュにヒットする書き込みアクセスは、キャッシュRAMにデータを書き込みます。もし、メモリ領域が、Write-Throughにマークされているのであれば、書き込み動作はAXIMインターフェース上でも実行されて、外部メモリにも同じデータがストアされ、外部メモリとキャッシュの一貫性が保たれます。