CORTEX-M4Fの識別はどうするのか

現在LPC1768への移植が大詰めですが、実はこの移植作業の真の目標はCORTEX-M4FマイコンTOPPERS/ASPを移植することにあります。その際、現在整備しているコードの大半が再利用できるだろう、NXPから出るCORTEX-M4Fマイコンは、LPC17xxに酷似しているだろうという皮算用があるからこそ、Blackfinをおっぽり出して今のところ大々的に活用する予定のないLPC1768*1に心血を注いでいるわけです。
さて、現在のコードを再利用つもりではいるのですが、asp/arch/arm_m_gccには改造が必要になります。CORTEX-M4Fは浮動小数コプロセッサ(FPv4-SP)を使用しており、レジスタが拡張しています。ということは、コンテキストの切り替え部には手を入れなければなりません。最低でも、dispatch()のレジスタ保存、レジスタ復帰、および例外入り口処理と出口処理のレジスタ保存、レジスタ復帰には変更が必要です。
この変更を行う上で重要なことは、変更後もCORTEX-M3/M4Fの依存部のコードを共通にしておくことです。もし、分離してしまえば、たった4カ所の変更のために、二つのコードをメンテすることになります。
コードを共有する場合には、レジスタの待避、復帰部分だけをプロセッサにあわせて変更します。変更の方法は次の二つが考えられます。

  • CPUのIDを見て実行すべきコードを決める
  • 条件コンパイルによって実行すべきコードを決める

RTOSの性質を考えれば、実行時に条件分岐する方法は採りたくありません。条件コンパイルを使うべきです。
条件コンパイルを使う場合、pre-defined macroを使ことが理想的です。CORTEX-M3向けのビルド時にはgccに対して-mcpu=cortex-m3という引数を与えます。これがCORTEX-M4Fならば-mcpu=cortex-m4になります。これらの引数を受けて、gccが適切なpre-defined macroを生成してくれるのなら、それを利用できます。
そこで、以下のようなコマンドを使って、どのようなpre-defined macroが与えられているかリストしてみました。

echo | arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -E -dM -

残念ながら、現段階ではcortex-m3cortex-m4をマクロで識別することはできないようです。使用しているコンパイラは2010q1ですので、cortex-m4についてきちんと対応できていないとしても不思議ではありません。cortex-m4については、チップが現れるタイミングで再度調査が必要です。

*1:失礼!