cortexm:cortexm4

Cortex-M

Cortex-M4

Cortex-M3に,以下の機能が追加

  • DSP,SIMD拡張命令セット
  • シングルサイクルMACHINE演算
  • 単精度浮動小数点ユニット(FPU)(オプション)
  • 飽和演算

DSP演算はCMSIS-DSPを使えるのが代表的
飽和演算は最小.最大のクリッピングによりオーバー,アンダーフローを防ぐ.
ソフトウェア的に範囲の確認(if文使っての確認とか)を行う必要がなくCPUの処理を減らせる.
PIDコントローラで,I項の飽和を制限してくれる,とかの使い方が可能.
まぁ実用の範囲に抑えたいとかもあり得るので実質自前でアンチワインドアップ処理は必要になりそう?ここは実際に処理を書いてみないとなんとも言えない.
デバッグも参照のこと

Cortex-M4 テクニカルトレーニング
PM0214 STM32 Cortex®-M4 MCUs and MPUs programming manual

DataWatchpint and Trace unit,ARMコアの機能であり、実装されているかはチップメーカ次第
stm32ばかり使っているのでひとまずstm32の関連に書いておく.

もともとはETM,ITMに使う機能なのか? DWTの中にもいくつかカウンタがあり,その中にARMコアのシステムクロックをカウントしてくれるものがある.このタイマのカウント値の差分を取ることでそのあいだのクロック数(≒その間の処理時間)を計測できる.
Cortex-M7の場合、Lock Access Register(LAR)というのがり、ここに解除キーをまず書き込む必要がある.Cortex-M4コアとは少し異なる点に注意.

単精度浮動小数点ユニット(FPU)
Cortex-M4(F)プロセサにて浮動小数点演算をハードウェアでサポートしているのは単精度のみであることに注意.Cortex-M7は物によって倍精度も使える.
以下は単精度浮動小数点数のみに着目して記載
C,C++は精度を維持するために明示的な宣言がないと倍精度に暗黙的に型変換を行う.倍精度だと結局ソフトウェアで処理を行ってしまうため,せっかくの浮動小数点演算ユニットのメリットを享受できない.
倍精度を使ってしまうと,実行の際は倍精度→単精度,単精度→倍精度への変換などをソフトウェアで行ってしまい速度が全く期待できなくなる.

http://www.ganssle.com/tem/tem370.html

平方根 単精度数値の平方根
gccのオプションに-ffast-mathをオプションにつけることでIEEE574なsqrtf()からVSQRT.F32一発で済むアセンブリ出力が得られるとのこと
gccでCortex-M4のsqrtf()の呼び出しの代わりにFPU命令一発のコードを出力をさせる方法

IEEE574は浮動小数点計算に最も広く用いられている標準規格
なお,-ffast-mathオプションを使うと高速化が図れるがIEEEやISO,C++に完全に準拠しない動作となるので注意. IEEE574準拠の場合,引数の正負をチェックして負だと標準ライブラリの関数を呼び出す.errnoにエラーコードを入れるなどの処理を行う. -ffast-mathオプションをつけるとこれらの処理を無くせるため高速化がはかれる.その代わり引数が負だったりNaNになるとHardfaultに飛ぶ.

Options That Control Optimizationも参照
浮動小数点と10,16進の変換できる,便利 → IEEE-754 Floating-Point Conversion

FPUを使用していると,コンテキストスイッチの際にスタックするレジスタの量が多くなる.RTOSを使用している場合にはこれにも気をつける必要がある. なんとスタック量が8ワードから26ワードにも増える!
レイジースタッキングという機能を使うとFPU関連レジスタのスタックとアンスタックが回避できるようにある.
詳細はApplication Note 298を参照

アプリケーション割込みおよびリセット制御レジスタ(AIRCR)のSYSRESETREQビットをHighにすることでシステムリセットの要求を実行
AIRCRレジスタに書き込身を行う場合,まずVECTKEYにアクセスキーとして0x5FAを書き込む必要があることに注意.

参考文献

  • cortexm/cortexm4.txt
  • 最終更新: 2024/02/14
  • by yuqlid