ZYNQのLinuxアプリをVSCodeでビルドする方法


VSCodeを使ってZYNQのLinuxで動くプログラムをビルドし、さらにデバッグまですることができたので、そのやり方を紹介します。

用意するもの

  • Linuxが動くZYNQのボード (Cosmo-Z とか Zynqberry とか・・)
  • VSCode と C/C++拡張
  • LAN接続。sambaでファイル共有すると便利
  • ZYNQ上で動作するgdbserver
  • XILINX SDK (XSDK)

VSCodeのインストールとC/C++拡張

まずVSCodeをインストールし、C/C++拡張wインストールします。

特に説明は不要かと思います。

XILINX SDKのインストール

ZYNQで動くLinuxに入っているGLIBCのバージョンが2.19とかならXSDK2018.3以前を、2.27とかならXSDK2019.1以降を選びます。
ややこしいのですが、詳しくは 「XILINX SDKをアップデートしたらGLIBCのバージョン相違で動かない」 を参照してください。
熱心なXILINXユーザならいろんなバージョンのツールが入っているから大丈夫だと思います。

プロジェクトのフォルダを作ってVSCodeで開く

VSCodeで作業するためのフォルダを作り、VSCodeでOpen Folderで開きます。
ここでは D:\naitou\vstest としておきます。

C/C++ファイルの設定をする

私自身がVSCodeを使い始めて間もないのでよくわかっていませんが、CTRL+SHIFT+Pでプルダウンが開いたら、C++と打って、C/C++: Edit Confiturations (UI)を開きます。

C/C++拡張の設定が開くので、構成名のところにArmLinuxとか適当な名前を付けます。

コンパイラパスには、XSDKのarm-linux-gnueabihf-gcc.exeへのパスを指定します。
私の環境では D:\Xilinx\SDK\2018.3\gnu\aarch32\nt\gcc-arm-linux-gnueabi\bin\arm-linux-gnueabihf-gcc.exe です。ターゲットのLinuxのGLIBCのバージョンに合わせてXSDKのバージョンを変えてください。

IntelliSenseモードをlinux-gcc-armにして、インクルードパスには、XSDKのディレクトリの中のincludeパスを指定しておきます。

D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr/include/**

これで.vscodeフォルダの中にc_cpp_properties.json というファイルが作られているはずです。

c_cpp_properties.json
{
    "configurations": [
        {
            "name": "ArmLinux",
            "includePath": [
                "${workspaceFolder}/**",
                "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/arm-linux-gnueabihf/libc/usr/include/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.19041.0",
            "compilerPath": "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-gcc.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-arm"
        }
    ],
    "version": 4
}

これはコード補完や、テキストエディタ上でのWarningを出すための設定なので、実際に使われるコンパイラとは違っていてもいいのだと思います。

タスクの設定

次に、VSCodeに戻ってCTRL+SHIFT+Pを押しbuildと打ちます。候補が出てくるのでTasks:Configure Default Buld Taskを選びます。

この時点ではcl.exeを使うものが出てくるので、それを選びます。


そうしたら、tasks.jsonがcl.exeを使うように出来ているのでいったん全部消して、gccを使うように変更します。

tasks.json
{
    // tasks.json 形式の詳細についての資料は、
    // https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "Build by ARM g++",
            "command": "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf-g++.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.elf"
            ],
            "options": {
                "cwd": "D:/Xilinx/SDK/2018.3/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

commandのパスはXSDKをインストールしたフォルダに合わせてください。cwdは${workspaceFolder}でもいいかもしれません。

適当なプログラムを書く

ファイルを新規作成して、ビルドしましょう。

test.cpp
#include <stdio.h>

int main() {
    printf("Hello World, Zynq!\n");
    for(int i = 0 ; i < 100 ; i++)
    {
        printf("%d\n" , i);
    }
    return 0;
}

ビルド

VSCodeでCTRL+SHIFT+Bを押すとtasks.jsonに書かれたタスクのうち、

"group": {
    "kind": "build",
    "isDefault": true
}

が指定されたタスクが実行されます。今回は"Build by ARM g++"というタスクで、"command"で指定されたg++のプログラムが実行されます。VSCodeの下段にあるTerminalにビルド結果が表示されます。コンパイルエラーもここに表示されます。

実行

出来上がったプログラム、test.elf ををZYNQのLinuxに転送します。

SCPとか意識高いコマンドを使ってもいいですが、私はsambaで共有させておいてWindowsのExplorerでファイルコピーするのが好きです。もしくはZYNQ Linux上にsambaで共有するフォルダを作って、その上にVSCodeにプロジェクトフォルダを作ってもいいかもしれませんね。

そして、Linuxにログインしたら実行してみましょう!

まとめ

c_cpp_properties.json にはファイルの属性などが書かれる。
tasks.json にはビルドするためのコマンドの起動方法が書かれる。

感想

はじめてVSCodeでエディタ以上の使い方をしてみようと思ったのですが、無事に動いてよかったです。
これでもうXSDKやVitisのEclipse環境から抜けられるかも!?

↓↓↓↓↓↓↓↓ 続く
デバッグ編に続く
↑↑↑↑↑↑↑↑ 続く