OpenCoresで公開したワイヤーフレーム3D CG IPコア(wf3d)は、ZedBoardまたはDE0でサンプル実装を行っています。このサンプル環境には、Vivado 2015.4のXilinx SDKで作成したサンプルアプリが含まれています。このサンプルアプリは、ビルドに必要な最低限のファイルしか含んでいません。このため、サンプルアプリのビルドは、まずXilinx SDKを立ち上げ、BSP(Board Support Package) を作成し、サンプルアプリの環境をXilinx SDKにインポートするという手順で行います。しかし、Vivado 2016.1のXilixn SDKにサンプルアプリをインポートしてビルドを実行すると、コンパイルエラーが発生することがわかりました。
Xilinx SDK 2016.1のコンパイルエラー
具体的には、次のエラーが発生します。
arm-xilinx-eabi/bin/ld.exe: error: standalone_bsp_0/ps7_cortexa9_0/lib\libxil.a(errno.o) uses VFP register arguments, simple_cube.elf does not
浮動小数点演算に関連したエラーのようです(VFP register)。原因を特定するために、Xilinx SDK 2015.4と2016.1でそれぞれ簡単なアプリケーションプロジェクトを作成し(File->New->Application Project)、そのプロジェクトのプロパティを比較します。
SDK Version | 2015.4 | 2016.1 |
C/C++ Build->Settings:Tool Settings | ||
ARM v7 gcc assembler | arm-xilinx-eabi-gcc | arm-none-eabi-gcc |
ARM v7 gcc compiler | arm-xilinx-eabi-gcc | arm-none-eabi-gcc |
Miscellaneous: Other flags | -c -fmessage-length=0 -MT”$@” | -c -fmessage-length=0 -MT”$@” -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard |
ARM v7 gcc linker | arm-xilinx-eabi-gcc | arm-none-eabi-gcc |
Miscellaneous: Other flags | (none) | -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -Wl,-build-id=none -specs=Xilinx.spec |
C/C++ Build->Settings:Build Steps | ||
(none) | a9-linaro-pre-build-step |
バージョン2015.4と2016.1は、かなり設定が変わっています。まず、コンパイラがarm-xilinx-eabi-gccからarm-none-eabi-gccに変わっています。また、オプションに-mfpu=vfpv3 -mfloat-abi=hardというエラーに関係する設定が追加されています。さらにXilinx.specというgccの設定ファイルも追加されています。まとめると、次の箇所がバージョン2015.4と2016.1で変わっています。
- gccがarm-xilinx-eabi-gccからarm-none-eabi-gccに変わっている
- コンパイルオプションに-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hardが追加されている
- リンクオプションに-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -Wl,-build-id=none -specs=Xilinx.specが追加されている
- a9-linaro-pre-build-stepというビルドステップが追加されている
原因と解決策
ビルドエラーの直接の原因は、 BSPとアプリのコンパイルに異なるgccが設定されていたためでした。具体的には、BSPは2016.1で生成したためにarm-none-eabi-gccが使用され、アプリのプロジェクトは2015.4で作成してインポートしたためにarm-xilinx-eabi-gccが使用されていました。このため、最終的なリンク時にVFP registerに関係したエラーが発生したようです。
解決策ですが、新たに2016.1でインポート用のプロジェクトを作成し、それ以前のバージョン用のプロジェクトとは別に管理するのが間違いがなさそうです。