2

関連スペック:

  • FPv4-SP FPU (Cortex M4F) を搭載した STM32F407IG プロセッサ。
  • STM32F40G-EVAL 開発ボード;
  • IAR 組み込みワークベンチ - ARM、v6.50

質問: FP 計算の前にプログラムで FPU をオンにし、終了時に再びオフにするにはどうすればよいですか?

  • IAR EWARM は、ビルド前にプロジェクト オプションで FPU をオフ/オンにする機能を提供します
  • SystemInit()の前に呼び出されるではmain、次のコードが実行されます。

    #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)    
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));    /* set CP10 and CP11 Full Access */
    #endif
    

    これにより、CPACR ビット [23:20] が 1 に設定されることに注意してください。これは必須です。そうしないと、次の FPU アセンブラー命令で HardFault IRQ が呼び出されます。しかし、これを無効にすると、消費電力の削減などの追加の影響がありますか、それともこのレジスタはコプロセッサ (FPU) を監視するだけですか?

  • それ以上の意味がない場合、おそらく CPACR を介して「オフにする」ことは何も達成せず、FPU 命令セットコマンドを実行している間のみ FPU が追加の電力を消費することを示します。

    ありがとう、

4

1 に答える 1

1

命令がコプロセッサー (FPU など) にアクセスしようとして、それが無効になっている場合、Usage Fault (または、Usage Faults が無効になっている場合は、Hard Fault に昇格) が発生します。使用フォルト ステータス レジスタの NOCP ビットを調べて、それがフォルトの原因であるかどうかを確認できます。次に、Usage Fault をトラップとして使用して、FPU を有効にし、実行を再開できます。

私のアプローチは次のようになります。

  • IAR プロジェクトで FPU を有効にします (IAR が FPU をターゲットにできるようにします)
  • 起動時に FPU を有効にします (障害ハンドラーが構成されるまで有効にする必要があります)。
  • 障害ハンドラーを構成して有効にしたら、電力節約のために FPU を無効にします。
  • フォルト (使用またはハード フォルト) の場合、Usage Fault Status Register の NOCP ビットを調べます。
  • NOCP が設定されている場合は、FPU を有効にし、障害から復帰します。
  • バックグラウンド アプリケーションでは、計算が完了したら FPU を無効にするか、タイマーを使用して定期的に無効にします。

RTOS を使用している場合は、アクティブ スタッキングではなくレイジー スタッキング (リファレンスを参照) を使用している場合、Usage Fault/Hard Fault にフックしようとする可能性があるため、コンテキスト スイッチングの実装を確認する必要があります。

電力が懸念される場合に考慮すべきことの 1 つは、浮動小数点が必要かどうかです。数値空間を 32 ビット値の固定小数点として表すことができる場合、浮動小数点の代わりに固定小数点演算を使用すると、FPU の有効化/無効化または FPU レジスタのスタックにオーバーヘッドがないため、全体的な消費電力が削減される可能性があります。コンテキストスイッチ。トレードオフは、固定小数点演算が操作ごとに数命令長くなる可能性があることです

参考:ARM AppNote 298

于 2013-09-24T15:05:44.717 に答える