海思新出的HI3559A和Hi3519A自带了DSP,对于我们这种做图形图像处理及加速的太有用了。拿到开发板后,才发现海思只提供了一个膨胀和腐蚀的例子。更坑的是,居然没有源代码,关键算法被封装成库了。

经过几番折腾,在某宝上买到了廉价的xtensa xplorer开发工具(官方的太贵了,哈哈),终于把海思的DSP用了起来。使用步骤简单描述一下吧:

1. 首先得有xplorer的编译工具,这个工具不是免费的,要有license才能用,包括开发和性能调优。

2. 买一个海思的开发板,一般某宝上的几千块的就行,不过只能接一个摄像头。例子中我是使用了自己做的开发板,直接接入了4路3G-SDI摄像头做输入源了,开发板我就不多说了,免得被误解是打广告的海思 DSP xtensa xplorer-编程知识网

3. 使用海思自带的svp/dsp例子,在里面加入一个自己的算法(反正就是依葫芦画瓢,理解一下dsp的调度),难点主要是算法的优化,海思SDK给的膨胀和腐蚀两个例子都是没有源码的,这个比较坑。我也是自己用xplorer工具一点一点的理解加优化,实现了一个边沿检测算法(sobel和candy两种算法都实现了)。代码这种东西,这里我就不分享了哈。

4. 运行并显示画面,vio和dsp两个程序是相互独立的,所以我单独开dsp程序就能看到处理后效果,不开的话就是处理前原始画面。

效果图如下:
4.1. 使用dsp前画面:海思 DSP xtensa xplorer-编程知识网

4.2. 使用dsp处理画面:

海思 DSP xtensa xplorer-编程知识网

另外看一下dsp的调试信息:
~ # cat /proc/umap/dsp

[DSP] Version: [Hi3559AV100_MPP_V2.0.2.0 B060 Release], Build Time[Dec 21 2018, 17:05:06]

——————————-MODULE PARAM————————————–
    max_node_num
              30

——————————-DSP CORE STATUS————————————–
    CoreId    Enable
         0       Yes
         1       Yes
         2       Yes
         3       Yes

——————————-DSP PRI STATUS————————————–
    CoreId  Pri    Create
         0    0       Yes
         0    1        No
         0    2        No
         1    0       Yes
         1    1        No
         1    2        No
         2    0       Yes
         2    1        No
         2    2        No
         3    0       Yes
         3    1        No
         3    2        No

——————————–DSP TASK INFO————————————
    CoreId  Pri       Hnd   TaskFsh   HndWrap   FreeNum   WorkNum
         0    0      4403      4403         0        30         0
         0    1         0         0         0        30         0
         0    2         0         0         0        30         0
         1    0      4395      4395         0        30         0
         1    1         0         0         0        30         0
         1    2         0         0         0        30         0
         2    0      4388      4388         0        30         0
         2    1         0         0         0        30         0
         2    2         0         0         0        30         0
         3    0      4380      4380         0        30         0
         3    1         0         0         0        30         0
         3    2         0         0         0        30         0

———————————–DSP RUN-TIME INFO—————————–
    CoreId  Pri  CntPerSec  MaxCntPerSec  TotalIntCntLastSec  TotalIntCnt   QTCnt   CostTm   MCostTm   CostTmPerSec   MCostTmPerSec  TotalIntCostTm   RunTm
         0    0         31            33                4381         4402       0       3        11             97             167           17079    1049
         0    1          0             0                   0            0       0       0         0              0               0               0    1049
         0    2          0             0                   0            0       0       0         0              0               0               0    1049
         1    0         31            32                4377         4394       0       4        17             91             148           14916    1049
         1    1          0             0                   0            0       0       0         0              0               0               0    1049
         1    2          0             0                   0            0       0       0         0              0               0               0    1049
         2    0         31            32                4376         4387       0       3        12             89             169           15492    1049
         2    1          0             0                   0            0       0       0         0              0               0               0    1049
         2    2          0             0                   0            0       0       0         0              0               0               0    1049
         3    0         31            32                4373         4379       0       3        15            116             162           16776    1049
         3    1          0             0                   0            0       0       0         0              0               0               0    1049
         3    2          0             0                   0            0       0       0         0              0               0               0    1049

———————————-DSP INVOKE INFO——————————–

    CoreId       Pri       RPC
         0         0      4402
         0         1         0
         0         2         0
         1         0      4394
         1         1         0
         1         2         0
         2         0      4387
         2         1         0
         2         2         0
         3         0      4379
         3         1         0
         3         2         0

可以看到,4个DSP核每个核都是按照30帧来处理视频的。测试极限是1080P的画面,单核DSP可以每秒处理200帧左右。性能相当的强悍。难点就是怎么优化,怎么去使用啦,后续继续研究新的算法。包括图像的增强、锐化、白平衡、融合、跟踪等等,都可以在DSP上加速使用。