CORTEX-M4のコンパイル時検出
以前「CORTEX-M4Fの識別はどうするのか - Embedded 脇見運転」で書いたとおり、cortex-m3とcortex-m4Fの差はわずかであり、そのわずかな差のために二つのプログラムをメンテするのは避けたいものです。したがって、コンパイル時に、どちらのコア向けにコンパイルしているのか知って条件コンパイルする必要があります。
「Codesourcery G++ LiteでCortex-M4Fプログラムをコンパイルする - Blackfin空挺団::Blog」で書いたとおり、cortex-m4f対応のコンパイラを入手したのでcortex-m3、cortex-m4f用のコードを生成するよう指示したときに、pre-defined macroがどのように変わるか試験してみました。
takemasa@hertz:~$ arm-none-eabi-gcc -v Using built-in specs. COLLECT_GCC=arm-none-eabi-gcc COLLECT_LTO_WRAPPER=/home/takemasa/arm-2010.09/bin/../libexec/gcc/arm-none-eabi/4.5.1/lto-wrapper Target: arm-none-eabi Configured with: ...中略... Thread model: single gcc version 4.5.1 (Sourcery G++ Lite 2010.09-51) takemasa@hertz:~$ echo | arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -E -dM - | sort > m3 takemasa@hertz:~$ echo | arm-none-eabi-gcc -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -mcpu=cortex-m4 -E -dM - | sort> m4 takemasa@hertz:~$ diff m3 m4 3c3 < #define __ARM_ARCH_7M__ 1 --- > #define __ARM_ARCH_7EM__ 1 5c5 < #define __ARM_PCS 1 --- > #define __ARM_PCS_VFP 1 149d148 < #define __SOFTFP__ 1 takemasa@hertz:~$
この結果を見る限り__ARM_PCS_VFP__と__ARM_ARCH_7EM__が定義されている時にはcortex-m4fであるとしてFPUのレジスタを退避すればよいようですが、cortex-m4のFPUはVFPではなく、FPv4_spであることが気になります。
もう少し注意して追いかける必要がありそうです。