TIOVX自定义节点的开发流程
一、使用PyTiovx脚本工具生成TIOVX框架
TI官方提供的SDK包里面提供了一项比较方便的功能,能够使用Python脚本生成TIOVX相关的框架内容,减少用户手动Coding的步骤。
具体的详细操作步骤,可以查看以下链接:TIOVX User Guide: PyTIOVX User Guide
1.PyTiovx工具的python脚本create_my_tiovx.py,具体代码如下:
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from tiovx import *
#以下一行代码设置存储文件夹名称myTiovx
#运行在A72核上,要运行在其他核,可以进入Core类查看其他核的名称
#生成的文件夹保存的路径:CUSTOM_APPLICATION_PATH 第一点导入的内容
code = KernelExportCode("my_tiovx", Core.A72, "CUSTOM_APPLICATION_PATH")
#设置Kernel名为myTiovxTest
kernel = Kernel("my_tiovx_test")
#设置参与的参数
kernel.setParameter(Type.IMAGE, Direction.INPUT, ParamState.REQUIRED, "INPUT")
kernel.setParameter(Type.IMAGE, Direction.OUTPUT, ParamState.REQUIRED, "OUTPUT")
#设置运行的目标核上,要运行在其他目标核上,也可以进入Target类查看
kernel.setTarget(Target.A72_0)
#导出kernel内容
code.export(kernel)
2.导入环境变量,路径根据自己的需要设置,这里选择的是官方SDK 包里面的vision_apps作为存放路径。
export CUSTOM_APPLICATION_PATH="~/ti-processor-sdk-rtos-j721e-evm-08_06_00_12/vision_apps"
3.Python脚本修改成功以后,可以执行此脚本。
python3 ~/py_tiovx/py/create_my_tiovx.py
4.运行完毕后会自动在~/vision_apps/kernels/目录下生成文件,如下图所示,本文先以a72核同时作为host端和target端为例,当其他核为target端时,操作步骤基本一致,不一致的地方会特别说明:
其中,在a72文件夹下:
文件名 | 功能说明 |
---|---|
vx_kernels_mytiovx_target.c | 用于注册所有的target kernels节点 |
vx_mytiovxtest_target.c | 用于实现target端的处理过程 |
在host文件夹下:
文件名 | 功能说明 |
---|---|
tivx_mytiovx_node_api.c | 用于创建host的node节点 |
vx_kernels_mytiovx_host.c | 用于注册所有的kernel节点 |
vx_mytiovxtest_host.c | 用于实现具体的kernel处理过程 |
二、自定义节点的使用
1.host端注册
在程序主函数main( )中完成host端的kernel注册:
tivxMytiovxLoadKernels( )函数位于~/vision_apps/kernels/mytiovx/host/vx_kernels_mytiovx_host.c文件内
2.target端注册
(1) Target端在A72核心上运行的话,那么同样也是在程序主函数main( )中完成target端的kernel注册:
tivxRegisterMytiovxTargetA72Kernels( )函数位于~/vision_apps/kernels/mytiovx/a72/vx_kernels_mytiovx_target.c文件内
(2) 如果是运行在其他内核,如C71或C66等,则在对应的初始化函数里注册,如使用的开发板为j721e,则在~/platform/j721e/rtos/common/app_init.c文件内进行target端注册,如在C66核进注册,如下图所示:
3.创建Node,并添加进Graph,然后运行起来
执行以上三步,即可完成Host端/Target端的Kernel注册以及完成Node的创建,如上图所示为host端和target端都在A72核上运行。
4.相关库和头文件的链接
(1) 自定义的host和target端编译出来的头文件需要添加到host端A72中。
a.host端生成的头文件添加方法:
在~/vision_apps/apps/concerto_a72_inc.mak中添加
VISION_APPS_KERNELS_IDIRS += $(VISION_APPS_PATH)/kernels/mytiovx/include
IDIRS += $(CUSTOM_APPLICATION_PATH)/kernels/mytiovx/host
需将新生成的tivx_myc7xtiovx_kernels.h和tivx_myc7xtiovx_nodes.h放到~/tiovx/include/TI下,并在主程序中添加头文件
#include "mytiovx/include/TI/tivx_mytiovx.h"
#include "mytiovx/host/tivx_mytiovx_kernels_priv.h"
b.target端生成的头文件添加方法:
将~/vision_apps/kernels/mytiovx/host/tivx_mytiovx_kernels_priv.h放到/vision_apps/platform/j721e/rtos/common目录下,并在app_init.c文件中添加头文件
#include "tivx_mytiovx_kernels_priv.h"
在~/vision_apps/platform/j721e/rtos/concerto_c7x_inc.mak中添加
IDIRS += $(VISION_APPS_PATH)/kernels/myc7xtiovx/include
(2) 自定义的host和target端编译出来的库需要链接到对应的固件里。
a.host端生成的库链接:
host端对应A72核,则在~/vision_apps/apps/concerto_a72_inc.mak文件中链接上新生成的库
b.target端生成的库链接:
如果target端为A72核,则将新生成的~/vision_apps/kernels/mytiovx/a72/vx_kernels_mytiovx_target.c和 vx_mytiovxtest_target.c放到主程序目录下,并在conerto.mak文件中链接上target端的注册函数
TARGET := vx_app_test
CSOURCES := main.c vx_kernels_mytiovx_target.c vx_mytiovxtest_target.c
如果target端是其他内核,如C66,则在~/vision_apps/platform/j721e/rtos/concerto_c6x_inc.mak文件中链接上新生成的库,c7x也类似
5.验证是否添加成功
除了将交叉编译生成的程序vx_app_test.out放到开发板上,还需要将编译生成的libtivision_apps.so和libtivision_apps.so.8.6.0(对应sdk版本的库)替换开发板上/usr/lib/的libtivision_apps.so和libtivision_apps.so.8.6.0。
除了a72核外,如果target端是在其他内核运行,则需要替换对应的固件,如C6x核,则将生成的~/vision_apps/out/J7/C66/
FREERTOS/release/vx_app_rtos_linux_c6x_1.out替换开发板上的/lib/firmware/vision_apps_evm/vx_app_rtos_linux_c6x_1.out,如c7x核,则将~/vision_apps/out/J7/C71/FREERTOS/release/vx_app_rtos_linux_c7x_1.out替换换开发板上的/lib/firmware/vision_apps_evm/vx_app_rtos_linux_c7x_1.out,替换完对应的固件,重启开发板即可运行新增的自定义节点。
验证方法:
(1) 在host端对用于实现具体的kernel处理过程函数vx_mytiovxtest_host.c中添加打印信息:
在tivxAddKernelMytiovxtestValidate( )函数中添加打印信息。注意加上头文件#include <stdio.h>
运行结果如下:
(2) 在target端对用于实现具体的target处理过程函数vx_mytiovxtest_target.c中添加打印信息:
修改target端的内容后,即可在运行Host端主进程后,自动调用Target的Kernel参与运行,Target端有四个回调函数,tivxMytiovxtestProcess是每执行一次Host端的Graph,都会执行一次。修改tivxMytiovxtestProcess,添加一个打印函数,如下图所示,注意如果要查看其他核的log信息,需要先执行source /opt/vision_apps/vision_apps_init.sh
target端的目标核为A72的运行结果如下:
target端的目标核为C66的运行结果如下:
target端的目标核为C7x的运行结果如下:
验证成功后那么在之后的tiovx开发中就可以将自己编写的算法放到target端中的vx_mytiovxtest_target.c文件中的tivxMytiovxtestProcess( )函数中,将其封装成一个节点,方便后续的调用。
参考资料
[TI TDA4 J721E]TIOVX OpenVX框架下的Python脚本使用
[TI TDA4 J721E]TIOVX OpenVX 框架下Kernel注册/Node使用