以前にリンカライブラリ(*.lib)ファイルや静的ライブラリ(*.a)ファイル等のライブラリを追加する方法について紹介しました。その際にライブラリに合わせてFPUなしのMPUとしてビルドする設定について、STM32F3シリーズでの注意点について紹介します。
プロジェクトファイルのプロパティを開き(Alt+Enter)、「C/C++Build」の「Settings」、「MPU Settings」内の「Floating-point ABI」を「hard」から「soft」もしくは「softfp」に切り替えます。「hard」、「soft」、「softfp」の違いは下記の通りです。
soft | 浮動小数点の演算に整数命令のみで構成された浮動小数点演算ライブラリ(soft-float)を使用 |
softfp | 浮動小数点の演算に浮動小数点演算命令(hard-FPU)を使用するが、floatを引数にする関数の呼び出しはsoft-floatと同じく汎用レジスタを使用 |
hard | 浮動小数点の演算に浮動小数点演算命令(hard-FPU)を使用し、floatを引数にする関数は浮動小数点レジスタを使用 |
softのみFPUを使用しません。一方、softfp、hardは内蔵のFPUを使用します。STM32Fシリーズの場合は「soft」を選択した場合は「Floating point hardware」を「No unit」に合わせて設定する必要があります。逆に 「softfp」、「hard」を選択した場合は「fpv4-sp-d16」のFPUを選択する必要があります。この設定をチグハグにした場合、Hard Faultが起動直後に発生し、マイコンが停止する場合があります。
STM32マイコンのシリーズによっては「Floating point hardware」で「fpv4-sp-d16」のFPUを選択した状態でも「soft」で動作しましたが、STM32F3シリーズではHard Faultになって正常に動作しませんでした(SW4STM32+STM32F3 V1.11.0環境)。シリーズやバージョンによっては挙動が異なるかもしれませんが、「Floating-point ABI」の設定と「Floating point hardware」の設定は合わせてした方が良さそうです。