sdsoc 2016.3+yocto project
TRANSCRIPT
linaro toolchain 6.2.1 + OpenCV 3.1.0on the Z-Turn Board
SDSoC 2016.3+ yocto project
+ Libraryアプリケーション開発環境構築
on SDSoC
アジェンダ
SDSoCのPlatform構築事例
ただし、SDSoCのPlatformの構築事例ではありません。
⇒ /opt/Xilinx/SDx/2016.3/platform の作成事例ではない。
SDSoCを使用したApplication Development Platformの構築事例です。
背景
ソフトウェアをFPGAにオフロードすることが目的ではない
● システムを開発する● アルゴリズムを開発する● 便利なライブラリは積極的に使用する● バージョンは最新を使用する
SDSoCはアプリケーションを開発する道具であって、高位合成が目的の道具であってはならない。
アプリケーションをFPGAと協調開発することが最大の目的
背景になっているシステム構成
主に画像処理系システムの開発
カメラ 独自アルゴ①
OpenCV
独自アルゴ②
カメラ入力
モニタ
ネットワーク
映像出力
システム構成の領域
カメラ
独自アルゴ①
OpenCV
独自アルゴ②
カメラ入力
モニタ
ネットワーク
映像出力
外部ハードウェア層
ソフトウェア層
FPGA層
SDSoCでできること - 入力部
カメラ
独自アルゴ①
OpenCV
独自アルゴ②
カメラ入力
モニタ
ネットワーク
映像出力
外部ハードウェア層
ソフトウェア層
FPGA層
SDSoC(現状) ⇒ 直接メモリ参照実現したいこと ⇒ V4L2で入力
SDSoCでできること - 処理部
カメラ
独自アルゴ①
OpenCV
独自アルゴ②
カメラ入力
モニタ
ネットワーク
映像出力
外部ハードウェア層
ソフトウェア層
FPGA層
SDSoC ⇒ フルスクラッチ実現したいこと ⇒ 様々なライブラリ混載
SDSoCでできること - 出力部
カメラ
独自アルゴ①
OpenCV
独自アルゴ②
カメラ入力
モニタ
ネットワーク
映像出力
外部ハードウェア層
ソフトウェア層
FPGA層
SDSoC(現状) ⇒ 直接メモリ参照実現したいこと ⇒ ???(アイデア無し)
ソフトウェアでの階層
FPGA層カメラ入力 独自アルゴ①
V4L2
Linux Kernel
独自アルゴ①
OpenCV
制御アプリケーション
API???
独自アルゴ②
独自アルゴ②
API???
映像出力
???Kernel
Middle
App
データの流れ
FPGA層カメラ入力 独自アルゴ①
V4L2
Linux Kernel
独自アルゴ①
OpenCV
制御アプリケーション
API???
独自アルゴ②
独自アルゴ②
API???
映像出力
???Kernel
Middle
App
映像 映像
SDSoCでできる範囲
FPGA層カメラ入力 独自アルゴ①
V4L2
Linux Kernel
独自アルゴ①
OpenCV
制御アプリケーション
API???
独自アルゴ②
独自アルゴ②
API???
映像出力
???Kernel
Middle
App
映像 映像
独自ソースコードはFPGA連携できる
ライブラリは使えない
SDSoCで現状では・・・
FPGA層カメラ入力 独自アルゴ①
V4L2
Linux Kernel
独自アルゴ①
OpenCV
制御アプリケーション
API???
独自アルゴ②
独自アルゴ②
API???
映像出力
???Kernel
Middle
App
映像 映像
アプリAアプリB
アプリEアプリDアプリC
本当に開発したいアプリケーション
FPGA層カメラ入力 独自アルゴ①
V4L2
Linux Kernel
独自アルゴ①
OpenCV
制御アプリケーション
API???
独自アルゴ②
独自アルゴ②
API???
映像出力
???Kernel
Middle
App
映像 映像
たぶん、ここがひとつのアプリケーション
ソフトウェアを開発できても
アプリケーションを開発する環境ではない
なので、
今のSDSoCは・・・
SDSoC + 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で玲奈ちゃんを読み込んでラプラシアン処理して保存してみよう。
対応状況
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ファイルだけ
linaro toolchain 6.2.1 + OpenCV 3.1.0on the Z-Turn Board
SDSoC 2016.3+ yocto project
+ Library環境構築
yocto project(morty) 2.2
作業内容はごくごく普通にbitbake
● pokyダウンロードして・・・● bblayer、confを設定して・・・● bitbake core-image-minimal● bitbake core-image-minimal -c populate_sdk
SDKインストール
インストールするのはtoolchain+sysroot
● toolchain
– linaro gcc 6.2.1● sysroot
– OpenCV 3.1.0
– gstreamer 1.0
– libav
– libjpeg-turbo
単純にソースがコンパイルできるか?/* * 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で玲奈ちゃんを読み込んでラプラシアン処理して保存してみよう。
toolchainの設定
XilinxのPreferenceにToolchainを設定するところがあるじゃないか![Window]→[Preferences]→[Xilinx SDK]→[Toolchain Preferences]
なぁ〜んだ、yocto対応って楽勝じゃん
toolchainの設定
これSDKの設定です
SDx not SDK
toolchainの設定
プロジェクトを作成して、プロジェクトのPrererencesで個別設定できるかな?
コマンドが”sdscc”、”sdsc++”、たやすくはなさそう・・・
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
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社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。
SDSoCの実行スクリプトの編集bin/xdcc.tclがsdscc、sds++を 実行するときに読み込むスクリプト
apc_set_global APCC_TOOLCHAIN_NAME "arm-linaro" ↓apc_set_global APCC_TOOLCHAIN_NAME "arm-poky"
Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。
SDxのミス
Eclipseでc++のincludeパスを設定できない?
原因は.cprojectの構築ミス?
libraryの指定
eclipseで設定する
Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。
これでコンパイルができるか?
ワクワク・・・♪
/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社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。
これでコンパイルができるか?
OpenCV 2.4なんて見向きもしません!
% rm -rf Vivado_HLS/include/opencv*
Vivado HLSのOpenCVは使わないので削除
単純なソースコードがコンパイルできた!
Xilinx社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。
次は高位合成だ! 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社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。
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社はこのような使い方は推奨しておりません。聞き流しながらお楽しみください。
できたけど、見せようがない(^-^;