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
Data Watchpint and Trace(DWT)
DataWatchpint and Trace unit,ARMコアの機能であり、実装されているかはチップメーカ次第
stm32ばかり使っているのでひとまずstm32の関連に書いておく.
もともとはETM,ITMに使う機能なのか?
DWTの中にもいくつかカウンタがあり,その中にARMコアのシステムクロックをカウントしてくれるものがある.このタイマのカウント値の差分を取ることでそのあいだのクロック数(≒その間の処理時間)を計測できる.
Cortex-M7の場合、Lock Access Register(LAR)というのがり、ここに解除キーをまず書き込む必要がある.Cortex-M4コアとは少し異なる点に注意.
FPU
単精度浮動小数点ユニット(FPU)
Cortex-M4(F)プロセサにて浮動小数点演算をハードウェアでサポートしているのは単精度のみであることに注意.Cortex-M7は物によって倍精度も使える.
以下は単精度浮動小数点数のみに着目して記載
C,C++は精度を維持するために明示的な宣言がないと倍精度に暗黙的に型変換を行う.倍精度だと結局ソフトウェアで処理を行ってしまうため,せっかくの浮動小数点演算ユニットのメリットを享受できない.
倍精度を使ってしまうと,実行の際は倍精度→単精度,単精度→倍精度への変換などをソフトウェアで行ってしまい速度が全く期待できなくなる.
VSQRT.F32
平方根 単精度数値の平方根
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
を書き込む必要があることに注意.
参考文献
PM0214 プログラミング・マニュアル Cortex®-M4 プログラミング・マニュアル
ソフトウェアリセット
How to Reset an ARM Cortex-M with Software
マイコンがリセットされる要因
FPU
Cortex-M4F lazy FPU stacking
Cortex-M4 テクニカルリファレンスマニュアル
10 useful tips for using the floating point unit on the Cortex-M4
DWT
Cycle Counting on ARM Cortex-M with DWT
STM32 タイマーを使って処理時間を計測する
STM32 - How to enable DWT Cycle counter
ARM M4 Instructions per Cycle (IPC) counters
Cortex-M7コアについて
ARMのData Watchpoint and Trace Unitを使って処理時間計測をしてみよう
Measuring clock cycle count on cortex m7