電力管理、コアデバッグ、浮動小数点ユニット

電力管理

複数のスリープモード

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レジスタを読みます。

図1

デバッガの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.