Xilinx SDK 2016.1のコンパイルエラー

FPGA

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にサンプルアプリをインポートしてビルドを実行すると、コンパイルエラーが発生することがわかりました。

3DCG IPコアとZedBoard

3DCG IPコアとZedBoard

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でインポート用のプロジェクトを作成し、それ以前のバージョン用のプロジェクトとは別に管理するのが間違いがなさそうです。

 

タイトルとURLをコピーしました