一、静态调度介绍
在 NXP S32V234 平台搭载的 ISP 模块中,在进行数据处理时,行缓冲区的管理和图像处理的逐行处理,都是由如下图圈中的视觉序列器来调度完成的,因此 IPU 算子由序列器的开始处理而触发,而对于数据流的处理方式有静态调度和动态调度两种方式。
动态调度 (Dynamic sequencing)
-基于缓冲区级别的处理步骤调度
-对于复杂度较高的 graph,比静态调度性能要低
-只能以较低的帧率来评价 IPUS/V,无法发挥 IPU 的性能
静态调度 (Static sequencing)
-基于摄像头数据的行来完成处理步骤
-通过行完成信号来驱动,相当于更小的缓冲区 ( 一般只有几行 )
-合理分配和利用 IPUS/V,序列器就能更高速的运行
-在不需要全部使用 1MB SRAM 内存的情况下,缓冲区使用的越少越好
-ISP graph 的各种修改需要手动修改静态序列器文件
二、使用静态调度
1、什么时候需要使用静态调度 (Static sequencing)?
(1) 首先 IPUs/v 算子性能计数器显示有 fps>32 的足够的性能。
(2) 增加相机帧率时,控制台显示发生了序列器错误。
那如何才能打印 IPUs/v 算子性能计数器 (IPUs/v engines performance counters) 的信息呢?很简单,在main.cpp 或者 isp_process.cpp 中添加如下代码。
添加一个值不超过 10 的 IPU_PROF_FRAMES 宏定义
添加如下两个函数,我这里是添加到按键处理中,按下 “p” 后会运行如下两个函数:
ISP_DumpPerfCounters(IPU_PROF_FRAMES): 用于打印信息。
SEQ_IpuPerformanceInfoRequest(IPU_PROF_FRAMES): 用于请求信息。
添加打印函数和申请信息函数
这里添加的 Demo 只使用了四个 IPUs ,所以只打印了如下四条信息。
IPUs/v 算子性能计数器打印的信息
2、怎样使用静态调度 (Static sequencing)?
(1) 生成静态调度文件
此处用例程 isp_sonyimx224_csi_dcu 来举例如何把 ISP 修改为的静态调度。
右键 ISP graph 空白处,选择 “Emit AS”,选择 “Emit Configurations”。
勾选 “Static sequencer”。
Emmit 成功之后,会在 “SEQ_gen” 目录生成 “static_mipi_simple.c”。
编译静态序列的话,“A53_gen” 目录下的如下文件也需要用到。
右键选择 “Properties”,在对话框中选择红框的部分的按钮来找到生成的文件。
|
(2) 移植文件
如上用 S32DS 工具是为了生成 isp 静态调度的文件,最终还是需要在 linux 命令行下编译 Demo ,
sony224 这个 Demo 在 SDK 中 “s32v234_sdk\isp\graphs\mipi_simple” 有 isp 文件的。
接下来需要把 “mipi_simple_c.h” 放入 “s32v234_sdk\isp\graphs\mipi_simple\inc” 中替换
“mipi_simple_c.h” 文件。
把 “mipi_simple.c”、“static_mipi_simple.c” 放入 “s32v234_sdk\isp\graphs\mipi_simple\src”。
复制 “dynamic_mipi_simple” 目录并改名为 “static_mipi_simple”,之后在这个目录里进行静态调度的编译。
再进入刚更改的目录中编辑 “BUILD.mk”。
编译模式改为 “static”, 保存退出。
(3) 编译
打开 msys32 。
输入环境变量:
export PATH=${PATH}:/D/NXP/VisionSDK_S32V2_RTM_1_2_0/msys32/mingw32/bin:/D/NXP/VisionSDK_S32V2_RTM_1_2_0/compilers/gcc-6.3.1-linaro-Xarmv8-linux/i686-mingw32/bin:/D/NXP/VisionSDK_S32V2_RTM_1_2_0/compilers/gcc-6.3.1-linaro-Earmv8-eabi/i686-mingw32/bin:/D/NXP/VisionSDK_S32V2_RTM_1_2_0/compilers/gcc-6.3.1-linaro-Earmv7-eabi/i686-mingw32/bin:/D/NXP/APU_Compiler_v1.0/bin
export ARCH=arm
export CROSS_COMPILE=aarch64-linux-gnu-
进入到我们创建的 “static_mipi_simple” 目录下进行编译。
编译得到 libstatic_mipi_simple.a 。
编译例程 isp_sonyimx224_csi_dcu ,该例程就是调用的 “mipi_simple” 的 isp graph 文件,但是需要修改编译文件 “BUILD.mk” 该 Demo 例程才会调用上面我们编译得到的 ISP 静态调度的库文件
“libstatic_mipi_simple.a”。
修改编译模式为 “static”,保存退出。
到这里编译 Demo 还会报错,还有如下两个点需要修改,打开“s32v234_sdk\isp\graphs\mipi_simple\static_mipi_simple\build-v234ce-gnu-linux-d” 目录下
“kmem.c” 拷贝如下数组名,到 “mipi_simple.c” 文件中。
|
打开 “s32v234_sdk\isp\graphs\mipi_simple\static_mipi_simple\build-v234ce-gnu-linux-d” 目录下
“sequencer_mipi_simple_srec.c”,拷贝如下数组名,到 “mipi_simple.c” 文件中。
|
进入 Demo 目录。
输入 make clean & make 编译得到 isp_sonyimx224_csi_dcu.elf,其中用到的就是我们修改得到的静态调度的 isp 库文件。
参考资料
[1] S32V234RM_Rev2.1.pdf
上一篇:NXP S32V234 的 copy_1to1_ipus ISP 算子解析
下一篇:NXP S32V234 ISP 模块的 IPUS 指令集
评论