本内容主要介绍在 S32DS 中自定义 Kernel 的方法。以上采样(upsample) 算法实现为例子建立工程说明。本文中所使用的环境为开发工具为 S32 Design studio for version 2.0 for windows 。
Section1、S32DS 中新建 upsample_application 工程
该部分内容主要详述了如何在 S32DS 中新建upsample_application工程,实现 upsample 功能,并能够在电脑上仿真以及开发板中运行。
一、S32DS 中新建upsample_kernel
Step1: 切换 workspace 。
为了方便,首先是在新建 workspace 目录,例如D:NXPworkspaceS32DS.Vision.2.0 workspace_upsample,在File → Switch Workspace ,选中我们新建的工程目录,workspace_upsample。
Step2:新建 kernel .
点击 File →New → APEX2 Kernel Project ,新建名为 upsample_kernel 的工程文件。如下图所示:
在工程空白处右键点击选择 validate diagram 选项,验证设置是否正确。右键选中upsample_kernel 的特性,对 kernel 里面的相关参数概念如下:
SpatialDep : 空间依赖性。
E0DataType: 数据类型。
E0SizeX/Y: 代表 X/Y 方向上 e0 单元,构成每个像素的最小单元
EKSizeX/Y: ek,以 e0 为元素组成的单元。例如ek(3,4)=(3*e0x,4*e0y).
二、S32DS 中新建upsample_graph
新建完成 upsample_kernel 工程后,需要在建立 upsample_graph工程,用来kernel 进行调用。Ps:该步骤中和 NXP 的官方手册中提供的操作相同,只是调用了我们自建的 kernel。具体操作步骤如下:
Step1:新建upsample_graph 工程文件。
File → New APEX2 graph project ,命名为 upsampel_graph 文件,在左侧窗口可以看到新建的文件。
Step2:调用 upsample_kernel 。
先熟悉一下 Palette 工具栏,该工具栏共有如下三行定义:分别是Graph Definition ,Connection Definition,Kernel Definition 。
Graph Definition:定义输入、输出的端口。
Connection Definition:连接线,Kernel 的端口与Input , Output 端口连接到一起。
Kernel Definition:选择新建立 Graph 所调用的 Kernel 。可以看到有 Kernel from Registry 和 Kernel from Workspace 共两个选项。分别是软件自带的 Kernel 以及自己开发编写的 Kernel。
以上介绍完毕,了解功能各项功能以后。下一步即是在Graph 文件中调入之前所建的 upsample_kernel ,并连接好 Port。按照如下的顺序操作分别连接好 upsample_kernel 和 port 。
①:在Kernel Definition 下选择 Kernel from Worksapce,点击后鼠标箭头,出现加号并且左移到空白工作区域,继续点击出现 upsample_kernel 选项,点击后添加到空白区域。
②:选择 Connector 连接对应的端口。也即是将 INPUT_0 与 IN_0 相互连接, OUTPUT_0 与 OUT_0 相互连接。最终 upsample_graph 结果如下图所示。
同样右键validata 看是否有问题。
三、S32DS 中新建upsample_program
Step1:按照 New →APEX2 Program Project 新建一个 Program 工程,命名为 upsample_program ,如下图所示。
Step2: 在 Program 中调用 upsample_kernel 。点击Palette 工具栏中的 Process → Process form graph ,弹出 upsample_graph 窗口选项。
添加工程输入图片(IMAGE_INLET_0)输出图片(IMAGE_OUTLET_0) 端口.
点击 Connections →Connector,连接输入的图片端口 IMAGE_INLET_0 和 IMAGE_OUTLET_0 端口。用于处理输入的图片和输出的图片,可以看到输入的图片为红色框代表有些设置并没有设置正确。由于还未有选定新建 APEX 工程,这里先不用进行设置。
四、S32DS 中新建upsample_application
如下图所示,New →S32DS Application Project
选择Family S32V 芯片,有如下的若干选项如下图所示,选择带有 APEX2 功能带系统的选项,也即:S32V234 Cortex – A53 APEX2/ISP Linux。
选择说明,一个是带操作系统一个是裸板
S32V234 Cortex – A53 APEX2/ISP Linux: Linux Cortex-A53 project with APEX2/ISP support for GCC toolchain
S232V234 Cortex – A53 APEX2/ISP :Bareboard Cortex-A53 project with APEX2/ISP support for GCC toolchain
选择相应的编程内容,注意不要选择 ISP Programing、 ISP visual modeling 和APEX2 visual modeling 的选项,在 APEX2 工程中用不到该选项。
最终的 APEX2 Application 工程如下:
在这里我们完整的一个 APEX2 工程既建立好了。从 kernel →graph→ program →application 的次序建立完整的工程。
Section2、upsample_application 工程编译及仿真
upsample_kernel 要实现的功能:将 in_grey_256x256如下图是像素大小为256x256 的源文件,经过 upsample ,输出名称为image_out.png,变成大小为512x512 的图片。
一、upsample_kernel 添加源文件
Setup1:确定 src。这里我们将源文件放置于 upsample_application 的目录下,如下图所示:
返回到 S32DS 工程目录下,右键刷新即可以看到源文件位于upsample_application 下面。如下所示:
注意:每次添加源文件,右键刷新一下,使得文件工程目录更新。
Setup2、在 upsample_program中添加源文件。
请注意上图中相关的设置:
①右上角的角标中选择最左边的标志。用来对 Graph 的输入、输出端口特性进行设置。
②点击 IAMGE_INLET_0,可以看到 ③ 处有相关的特性,点击 path ,选中之前的源文件。
③ 点击 IAMGE_OUTLET_0,同样位置处,在 Image Name 中填写 Image_out ;Image Type 中填写图像格式为:png 格式。因为我们输入的图片格式为png 格式。
则整个upsample_program 完成,没有错误提示。右键validate diagram。
二、upsample_application编译
该步骤是APEX 代码的产生,在 S32DS 中如将要实现的 upsample 功能。分别按照以下步骤产生 APEX2 源码:
Step1:upsample_kernel 生成 APEX 代码
在 upsample_kernel 空白处右键弹出 Emit as → Emit configurations → APEX2 sources upsample_program-upsample_program → emit ,生成 APEX 代码中对数据格式及参数的相关部分代码。
Step2:upsample_graph 生成 APEX 代码
upsample_graph 生成的相关的配置生成 APEX2 Source ,步骤如下:
在空白处右键弹出 Emit as → Emit configurations → APEX2 sources upsample_program-upsample_program → emit
Step3:upsample_program 生成 APEX 代码
① 空白部分右键单击emit as 弹出 Emit configurations 和APEX2 Sources 。因为要对其中代码的文件产生位置修改,进入 Emit configurations 。
② 选择 APEX sources upsample_ Output:Browse Workspace ,选择产生的代码目录位置。
③ 选择的 upsample_application 工程目录,生成的APU_kernels 该目录下。
④ 点击emit 生成 APU_kernels 下的目录文件,右键刷新后才能有看到如下的结果。
生成这几个文件后,下一步就是如何能够将相关的 upsample 算法实现,并且编译成功。先看代码部分如下:
主要是从 Kernel Metadata 、Kernel Interface 、Kernel Implementation 来对 upsample 实现,如下所示:
具体的意义在开始的部分已经有介绍说明,这里不再说。APU_Kernel 中内容完成后可以开始进行编译及仿真,在EVB 板上运行结果。
三、在 S32DS 中Emulation 及板子中运行
为了能够验证我们所编写的 kernel 是否正确需要能够使用 S232DS 对我们所编写的 kernel 进行仿真验证。需要注意的是在 windows 下的 S32DS 是能够直接调用仿真库的,但是 Ubuntu 16.04 版本的工程中则需要对仿真的库重新进行编译才能进行仿真。
运行Emulation 的方法
Step1:选择右上角的C /C++ 选项,并且点击选中 upsample_application 工程目录。
Step2: 点击如下图所示的锤子图标,共有三个选项,分别为 A53 ,APU ,EMU 。这三个选项。分别是编译 A53核板子上运行,APEX 核 ,Emulation仿真。编译生成点击A53 的选项,编译完可以生成upsample_application.elf 文件并在 S32V板上运行。
至此,工程完成,生成目标文件。
Step3: 对 Emulation 的说明 。仿真的步骤:如下所示,分别首先点击编译 EMU ,然后点击绿色的箭头开始仿真。下面的图为仿真的结果。
点击 A53,同时在 apu_gen 中运行的程序中添加如下代码,将图像在开发板中显示( EVB2 板)
vsdk::UMat output_umat = vsdk::UMat(720, 1280, VSDK_CV_8UC3);
{
cv::Mat output_mat = output_umat.getMat(ACCESS_WRITE | OAL_USAGE_CACHED);
memset(output_mat.data, 0, 720*1280*3);
cv::UMat inRGB(256, 256, CV_8UC3);
cv::UMat outUpsampledRGB(512, 512, CV_8UC3);
cvtColor((cv::UMat)matImageOutlet0, outUpsampledRGB, CV_GRAY2RGB);
cvtColor((cv::UMat)matImageInlet0, inRGB, CV_GRAY2RGB);
inRGB.copyTo(output_mat(cv::Rect(0, 232, 256, 256)));
// outDownsampledRGB.copyTo(output_mat(cv::Rect(300, 296, 128, 128)));
outUpsampledRGB.copyTo(output_mat(cv::Rect(500, 104, 512, 512)));
}
// Put it on screen
output.PutFrame(output_umat);
之后在继续在 S32DS 中编译生成 upsample_application.elf 文件,拷贝到板子中并执行。EVB2 屏幕中显示如下画面。
|