sdsoc 2016.3+yocto project

32
linaro toolchain 6.2.1 + OpenCV 3.1.0 on the Z-Turn Board SDSoC 2016.3 + yocto project + Library アプリケーション開発環境構築 on SDSoC

Upload: hidemi-ishihara

Post on 13-Apr-2017

371 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: SDSoC 2016.3+yocto project

linaro toolchain 6.2.1 + OpenCV 3.1.0on the Z-Turn Board

SDSoC 2016.3+ yocto project

+ Libraryアプリケーション開発環境構築

on SDSoC

Page 2: SDSoC 2016.3+yocto project

アジェンダ

SDSoCのPlatform構築事例

ただし、SDSoCのPlatformの構築事例ではありません。

 ⇒ /opt/Xilinx/SDx/2016.3/platform の作成事例ではない。

SDSoCを使用したApplication Development Platformの構築事例です。

Page 3: SDSoC 2016.3+yocto project

背景

ソフトウェアをFPGAにオフロードすることが目的ではない

● システムを開発する● アルゴリズムを開発する● 便利なライブラリは積極的に使用する● バージョンは最新を使用する

SDSoCはアプリケーションを開発する道具であって、高位合成が目的の道具であってはならない。

アプリケーションをFPGAと協調開発することが最大の目的

Page 4: SDSoC 2016.3+yocto project

背景になっているシステム構成

主に画像処理系システムの開発

カメラ 独自アルゴ①

OpenCV

独自アルゴ②

カメラ入力

モニタ

ネットワーク

映像出力

Page 5: SDSoC 2016.3+yocto project

システム構成の領域

カメラ

独自アルゴ①

OpenCV

独自アルゴ②

カメラ入力

モニタ

ネットワーク

映像出力

外部ハードウェア層

ソフトウェア層

FPGA層

Page 6: SDSoC 2016.3+yocto project

SDSoCでできること - 入力部

カメラ

独自アルゴ①

OpenCV

独自アルゴ②

カメラ入力

モニタ

ネットワーク

映像出力

外部ハードウェア層

ソフトウェア層

FPGA層

SDSoC(現状) ⇒ 直接メモリ参照実現したいこと ⇒ V4L2で入力

Page 7: SDSoC 2016.3+yocto project

SDSoCでできること - 処理部

カメラ

独自アルゴ①

OpenCV

独自アルゴ②

カメラ入力

モニタ

ネットワーク

映像出力

外部ハードウェア層

ソフトウェア層

FPGA層

SDSoC ⇒ フルスクラッチ実現したいこと ⇒ 様々なライブラリ混載

Page 8: SDSoC 2016.3+yocto project

SDSoCでできること - 出力部

カメラ

独自アルゴ①

OpenCV

独自アルゴ②

カメラ入力

モニタ

ネットワーク

映像出力

外部ハードウェア層

ソフトウェア層

FPGA層

SDSoC(現状) ⇒ 直接メモリ参照実現したいこと ⇒ ???(アイデア無し)

Page 9: SDSoC 2016.3+yocto project

ソフトウェアでの階層

FPGA層カメラ入力 独自アルゴ①

V4L2

Linux Kernel

独自アルゴ①

OpenCV

制御アプリケーション

API???

独自アルゴ②

独自アルゴ②

API???

映像出力

???Kernel

Middle

App

Page 10: SDSoC 2016.3+yocto project

データの流れ

FPGA層カメラ入力 独自アルゴ①

V4L2

Linux Kernel

独自アルゴ①

OpenCV

制御アプリケーション

API???

独自アルゴ②

独自アルゴ②

API???

映像出力

???Kernel

Middle

App

映像 映像

Page 11: SDSoC 2016.3+yocto project

SDSoCでできる範囲

FPGA層カメラ入力 独自アルゴ①

V4L2

Linux Kernel

独自アルゴ①

OpenCV

制御アプリケーション

API???

独自アルゴ②

独自アルゴ②

API???

映像出力

???Kernel

Middle

App

映像 映像

独自ソースコードはFPGA連携できる

ライブラリは使えない

Page 12: SDSoC 2016.3+yocto project

SDSoCで現状では・・・

FPGA層カメラ入力 独自アルゴ①

V4L2

Linux Kernel

独自アルゴ①

OpenCV

制御アプリケーション

API???

独自アルゴ②

独自アルゴ②

API???

映像出力

???Kernel

Middle

App

映像 映像

アプリAアプリB

アプリEアプリDアプリC

Page 13: SDSoC 2016.3+yocto project

本当に開発したいアプリケーション

FPGA層カメラ入力 独自アルゴ①

V4L2

Linux Kernel

独自アルゴ①

OpenCV

制御アプリケーション

API???

独自アルゴ②

独自アルゴ②

API???

映像出力

???Kernel

Middle

App

映像 映像

たぶん、ここがひとつのアプリケーション

Page 14: SDSoC 2016.3+yocto project

ソフトウェアを開発できても

       アプリケーションを開発する環境ではない

なので、

今のSDSoCは・・・

SDSoC + yocto project 環境を構築することにした。

Page 15: SDSoC 2016.3+yocto project

単純にソースがコンパイルできるか?/* * OpenCV フィルタサンプル - ラプラシアン */#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/imgproc.hpp>

int main( int argc, char** argv ){ printf("exec: OpenCV_Sample01\n");

// Read lena-chan with Grayscale printf("read: lena.png\n"); cv::Mat src = cv::imread("lena.png", 0);

printf("exec: laplacian\n"); cv::Mat laplacian, tmp; cv::Laplacian(src, tmp, CV_32F, 3); cv::convertScaleAbs(tmp, laplacian, 1, 0);

// Write for laplacian not kuracian printf("write: lena_laplacian.png\n"); cv::imwrite("lena_laplacian.png", laplacian);

printf("finish: OpenCV_Sample01\n");

return 0;}

まずは単純にOpenCVで玲奈ちゃんを読み込んでラプラシアン処理して保存してみよう。

Page 16: SDSoC 2016.3+yocto project

対応状況

yocto project(morty) 2.2を適用

● toolchain

– linaro gcc 5.2.1 ⇒ linaro gcc 6.2.1● Linux Kernel

– Kernel 4.6.0 ⇒ Kernel 4.6.0(linux-xlnx)● rootfs

– ramfs(RAM) ⇒ mmc(SDカード)● OpenCV

– 2.4.5 ⇒ 3.1.0● gstreamer

– 無し ⇒ 1.0● その他もろもろ追加・・・

SDSoCの結果で使用するのはELFとbitファイルだけ

Page 17: SDSoC 2016.3+yocto project

linaro toolchain 6.2.1 + OpenCV 3.1.0on the Z-Turn Board

SDSoC 2016.3+ yocto project

+ Library環境構築

Page 18: SDSoC 2016.3+yocto project

yocto project(morty) 2.2

作業内容はごくごく普通にbitbake

● pokyダウンロードして・・・● bblayer、confを設定して・・・● bitbake core-image-minimal● bitbake core-image-minimal -c populate_sdk

Page 19: SDSoC 2016.3+yocto project

SDKインストール

インストールするのはtoolchain+sysroot

● toolchain

– linaro gcc 6.2.1● sysroot

– OpenCV 3.1.0

– gstreamer 1.0

– libav

– libjpeg-turbo

Page 20: SDSoC 2016.3+yocto project

単純にソースがコンパイルできるか?/* * OpenCV フィルタサンプル - ラプラシアン */#include <opencv2/core.hpp>#include <opencv2/imgcodecs.hpp>#include <opencv2/imgproc.hpp>

int main( int argc, char** argv ){ printf("exec: OpenCV_Sample01\n");

// Read lena-chan with Grayscale printf("read: lena.png\n"); cv::Mat src = cv::imread("lena.png", 0);

printf("exec: laplacian\n"); cv::Mat laplacian, tmp; cv::Laplacian(src, tmp, CV_32F, 3); cv::convertScaleAbs(tmp, laplacian, 1, 0);

// Write for laplacian not kuracian printf("write: lena_laplacian.png\n"); cv::imwrite("lena_laplacian.png", laplacian);

printf("finish: OpenCV_Sample01\n");

return 0;}

まずは単純にOpenCVで玲奈ちゃんを読み込んでラプラシアン処理して保存してみよう。

Page 21: SDSoC 2016.3+yocto project

toolchainの設定

XilinxのPreferenceにToolchainを設定するところがあるじゃないか![Window]→[Preferences]→[Xilinx SDK]→[Toolchain Preferences]

なぁ〜んだ、yocto対応って楽勝じゃん

Page 22: SDSoC 2016.3+yocto project

toolchainの設定

これSDKの設定です

SDx not SDK

Page 23: SDSoC 2016.3+yocto project

toolchainの設定

プロジェクトを作成して、プロジェクトのPrererencesで個別設定できるかな?

コマンドが”sdscc”、”sdsc++”、たやすくはなさそう・・・

Page 24: SDSoC 2016.3+yocto project

toolchainのPATH

toolchainはSDKが実行する

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

PATHを設定する/opt/Xilinx/SDx/2016.3/SDK/.settings64-Software_Development_Kit.sh

% cat .settings64-Software_Development_Kit.sh############################################################### Copyright (c) 1986-2016 Xilinx, Inc. All rights reserved. ###############################################################

if [ -n "${PATH}" ]; then export PATH=/opt/Xilinx/Sdx/2016.3/SDK/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/microblaze/lin/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/arm/lin/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/microblaze/linux_toolchain/lin64_be/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/microblaze/linux_toolchain/lin64_le/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch32/lin/gcc-arm-none-eabi/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch64/lin/aarch64-linux/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch64/lin/aarch64-none/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/armr5/lin/gcc-arm-none-eabi/bin:/opt/Xilinx/Sdx/2016.3/SDK/tps/lnx64/cmake-3.3.2/bin:/opt/poky/2.2.1-zturn/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:$PATHelse export PATH=/opt/Xilinx/Sdx/2016.3/SDK/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/microblaze/lin/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/arm/lin/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/microblaze/linux_toolchain/lin64_be/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/microblaze/linux_toolchain/lin64_le/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch32/lin/gcc-arm-none-eabi/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch64/lin/aarch64-linux/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/aarch64/lin/aarch64-none/bin:/opt/Xilinx/Sdx/2016.3/SDK/gnu/armr5/lin/gcc-arm-none-eabi/bin:/opt/Xilinx/Sdx/2016.3/SDK/tps/lnx64/cmake-3.3.2/bin:/opt/poky/2.2.1-zturn/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabifi

Page 25: SDSoC 2016.3+yocto project

toolchainの設定

data/toolchain/zynq.cfgでいろんなtoolchainを定義可能 <xd:toolConfiguration xd:os="linux" xd:cpu="cortex-a9" xd:tool="arm-poky"

xd:clangArchFlags="-target arm-poky-linux-gnueabi -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -O0 -g" xd:vhlsArchFlags="-m32" xd:sdsArchFlags=" -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/poky/2.2-zturn/sysroots/cortexa9hf-neon-poky-linux-gnueabi" xd:sdsInferredLinkFlags=" --sysroot=/opt/poky/2.2-zturn/sysroots/cortexa9hf-neon-poky-linux-gnueabi" xd:sdsSoftwareDir="aarch32-linux" xd:sdsIncludeDir="aarch32-linux/include" xd:sdsLibDir="aarch32-linux/lib"

xd:toolBaseName="arm-poky-linux-gnueabi" xd:toolVersion="6.2.1" xd:toolCC="arm-poky-linux-gnueabi-gcc" xd:toolCPP="arm-poky-linux-gnueabi-g++" xd:toolAR="arm-poky-linux-gnueabi-ar" xd:toolObjcopy="arm-poky-linux-gnueabi-objcopy">

<xd:toolInfo> <xd:includeDirs xd:includeType="cc" xd:includeCount="4"> <xd:includeDir xd:path="lib/gcc/arm-poky-linux-gnueabi/5.2.1/include" xd:id="0"/> <xd:includeDir xd:path="lib/gcc/arm-poky-linux-gnueabi/5.2.1/include-fixed" xd:id="1"/> <xd:includeDir xd:path="arm-poky-linux-gnueabi/include" xd:id="2"/> <xd:includeDir xd:path="arm-poky-linux-gnueabi/libc/usr/include" xd:id="3"/> </xd:includeDirs> <xd:includeDirs xd:includeType="cpp" xd:includeCount="7"> <xd:includeDir xd:path="../../../cortexa9hf-neon-poky-linux-gnueabi/usr/include/c++/6.2.1" xd:id="0"/> <xd:includeDir xd:path="../../../cortexa9hf-neon-poky-linux-gnueabi/usr/include/c++/6.2.1/arm-poky-linux-gnueabi" xd:id="1"/> <xd:includeDir xd:path="../../../cortexa9hf-neon-poky-linux-gnueabi/usr/include/c++/6.2.1/backward" xd:id="2"/> <xd:includeDir xd:path="../lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/6.2.1/include" xd:id="3"/> <xd:includeDir xd:path="../lib/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/6.2.1/include-fixed" xd:id="4"/> <xd:includeDir xd:path="../../../cortexa9hf-neon-poky-linux-gnueabi/usr/include" xd:id="5"/> <xd:includeDir xd:path="arm-poky-linux-gnueabi/libc/usr/include" xd:id="6"/> </xd:includeDirs> </xd:toolInfo>

</xd:toolConfiguration>

“arm-poky”という定義を追加

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

Page 26: SDSoC 2016.3+yocto project

SDSoCの実行スクリプトの編集bin/xdcc.tclがsdscc、sds++を         実行するときに読み込むスクリプト

apc_set_global APCC_TOOLCHAIN_NAME "arm-linaro"             ↓apc_set_global APCC_TOOLCHAIN_NAME "arm-poky"

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

Page 27: SDSoC 2016.3+yocto project

SDxのミス

Eclipseでc++のincludeパスを設定できない?

原因は.cprojectの構築ミス?

libraryの指定

eclipseで設定する

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

Page 28: SDSoC 2016.3+yocto project

これでコンパイルができるか?

ワクワク・・・♪

/opt/Xilinx/SDx/2016.3/Vivado_HLS/include/opencv2/core/mat.hpp:58:13: error: incomplete type 'cv::Mat' named in nested name specifierinline void Mat::initEmpty()

Vivado HLSのincludeでOpenCVヘッダがエラー

結局、素直にコンパイルできなかった

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

Page 29: SDSoC 2016.3+yocto project

これでコンパイルができるか?

OpenCV 2.4なんて見向きもしません!

% rm -rf Vivado_HLS/include/opencv*

Vivado HLSのOpenCVは使わないので削除

単純なソースコードがコンパイルできた!

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

Page 30: SDSoC 2016.3+yocto project

次は高位合成だ! printf("[EXEC] conv_data in\n"); { int rslt = 0;

unsigned char *buf_in, *buf_out;

if(width > 256){ rslt = -1; return rslt; }

buf_in = (unsigned char *)malloc(width); buf_out = (unsigned char *)malloc(width);

for(int y = 0; y < height; y++){// printf("line: %d\n", y); memcpy(buf_in, &img_in[y * width], width); // ハードウェア処理 rslt += conv_data(buf_in, buf_out, width); memcpy(&img_out[y * width], buf_out, width); }

free(buf_in); free(buf_out); } printf("[EXEC] conv_data out\n");

関数を追加してconv_dataをFPGA化

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

Page 31: SDSoC 2016.3+yocto project

FPGA部分は輝度を+128

#pragma SDS data zero_copy(img_in)#pragma SDS data zero_copy(img_out)int conv_data(unsigned char img_in[1024], unsigned char img_out[1024], int width){

for(int x = 0; x < width; x++){if(img_in[x] < 128){

img_out[x] = img_in[x] + 128;}else{

img_out[x] = 255;}

}

return 0;}

目的はFPGA化コンパイルができること性能は気にしない

Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。

Page 32: SDSoC 2016.3+yocto project

できたけど、見せようがない(^-^;