跳转至

Hi3516CV610 FAQ

本文针对使用 Hi3516CV610 过程中可能遇到的常见疑问,提供解答与规避方案。


使用建议

  1. 首次使用: 先阅读"系统稳定性"和"性能对比"两个章节,了解用版本的基本特征
  2. 遇到问题: 先根据现象在对应模块FAQ中查找,多数问题有明确的规避方案
  3. 性能规划: 业务设计阶段参考FAQ中的性能约束条件,避免超限使用
  4. 持续更新: 本FAQ随版本迭代持续更新,建议关注最新版本说明

目录

  1. 系统和功能
  2. 性能
  3. 视频处理(VPSS)
  4. ISP/AIISP/AIBNR
  5. 智能算子(SVP/NPU)
  6. PQTools调参工具

1. 系统和功能

Q1.1 单板无响应,或sdk_server进程异常退出(OOM),如何处理?

现象:

部分业务负载较重的情况下,可能出现如下现象,业务中断或单板无响应

1、业务运行过程中出现频繁的如下异常打印,业务中断

[osal_uds_send_recv_multi:222]:send to 14 err:0xffffffff in thread(306267672)!
[osal_uds_send_recv_multi:222]:send to 14 err:0xffffffff in thread(306267672)!

2、通sdk_server进程异常退出、被os kill等,通过 ps 命令无法查询到 sdk_server 进程

[SDK Server] initialized successfully, entering main loop...
Killed

3、串口打印

[ot_irq: ,line:848] irq(62) VICAP_0_0 dropping old int!

业务场景可能包含:

  • AIISP aibnr场景下aibnr切换为WDR
  • VPSS全在线卷绕(帧中断模式EARLY_END)
  • VPSS全在线帧中断下动态创建销毁组(帧中断模式EARLY_END)
  • 在线WDR+ VPSS-VENC卷绕

原因: os内存紧张,导致sdk_server无法分配到足够的内存,或频繁触发os的内存回收,导致系统卡顿/卡死、或sdk_server因为OOM被os Kill。

解决方案:

  • 在当前的基础上,将OS MEM增大至少2M(默认os分配是32M),具体调整方式见文档《内存布局调整指南》"内存布局修改示例"章节
  • 重启单板

如仍有问题,请尝试重新运行业务后,通过cat /proc/umap/* > proc_log.txt和cat /dev/mpplog抓取日志


Q1.2 cat /dev/logmpp查看无任何日志输出?

现象: cat /dev/logmpp 日志无输出。

原因:

1、默认日志等级是 ERROR(严重)以上才打印,当前没有错误日志产生

2、没有打开logmpp功能

解决方案:

1、打开logmpp功能开,步骤如下

  • 加载ko时传递参数:insmod ot_base.ko logmpp_show=1

  • 修改samples/mpp/common/sdk_init/sdk_init.c中的base_init函数,具体修改内容如下

    static td_s32 base_init(td_void)
    {
        td_bool logmpp_show = TD_TRUE; /* 修改这里, 改为TD_TRUE */
        return ot_base_mod_init(logmpp_show);
    }
    
  • 进入samples/mpp/sdk_server执行如下命令重编sdk_server

    make clean -j;make -j
    
  • 重新运行sdk_server即可

2、如何修改各个模块的logmpp级别

  • 查看模块。数字表示日志级别,越小表示日志级别越高。例如3表示ERROR级别,6表示INFO级别。具体可以参考头文件"ot_debug.h"中的定义。

    # cat /proc/umap/logmpp_user
    ----------------------------------------log buffer state----------------------------------------------------------------
    max_len(KB)  read_pos write_pos butt_pos
             64         0         0    65536
    
    ----------------------------------------current log level---------------------------------------------------------------
    vb      :  3
    sys     :  3
    region  :  3
    ……
    
  • 修改具体模块的logmpp打印级别

echo "模块=级别" > /proc/umap/logmpp_user,以vi模块为例

```shell
echo "vi=6"  > /proc/umap/logmpp_user
```

表示将vi模块日志级别为0-6的都打印到/dev/logmpp中。

也可以修改所有模块的日志级别,命令为:

echo "all=6"  > /proc/umap/logmpp_user

表示将所有模块日志级别为0-6的都打印到/dev/logmpp中。

日志打印级别的修改,在单板重启或者sdk_server重启之后会恢复到默认级别3。


Q1.3 sdk_server的CPU占用过高(可能超过15%),如何处理?

现象: 业务负载较重的场景下,sdk_server占用率可能持续较高。

例如 单目4K20fps线性,VI开启3DNR,VPSS组打多个cover,送给智能分析后,出3路编码码流并存储码流。

原因: 社区架构采用多进程通信方式,多进程之间通过UDS通信,进程之间采用UDS连接池共享连接,进行通信。

解决方案:当前连接池最大个数默认是8,可以根据实际业务负载评估高频进程间通信的(每秒超过1000次交互)业务线程数量,并重新设置最大连接池数量,降低连接池管理消耗和线程数量。例如高频UDS通信的线程只有3个,则可以设置线程池最大数量为4,相对于默认节省4个线程的资源。具体设置方法为:

  • 修改soc/drivers/osal/src/linux/userspace/osal_uds_client.c的宏定义UDS_POOL_MAX

    #define UDS_POOL_MAX 8
    
  • 进入目录soc/drivers/osal/src/linux/userspace重新编译,得到libosal.so/libosal.a,替换对应的库即可


Q1.4 如何打开WDR?

现象:无法使用WDR功能。

原因: 默认WDR功能未打开。

解决方案: 按照如下步骤打开WDR功能

  • 修改profile的值。sample/mpp/common/sdk_init/sdk_init.c中,sys_profile默认为0,需要修改sys_profile的值为1。

    static td_s32 sys_init(td_void)
    {
        td_u32 sys_profile = 0; /* 修改这里, 改为1 */
        return ot_sys_mod_init(sys_profile);
    }
    
  • 重编sdk_server。进入samples/mpp/sdk_server执行make clean -j;make -j命令重编sdk_server。

编译后使用新的sdk_server重新运行即可。


2. 性能

Q2.1 CPU使用率较高,SDK的接口调用耗时增加,这是正常的吗?

现象:部分场景下,CPU占用较高。涉及场景包括:

  • 单目4M30fps 线性/ 2to1WDR
  • 单目4K20fps 线性(录像机场景)
  • 单目4M12fps AI-ISP(黑光)智能IPC

原因: 当前架构采用多进程通信提供媒体功能(sdk_server进程),SDK的接口调用通过IPC发送给sdk_server,存在固有的用户态/内核态切换和IPC通信开销(跟交互的数据有关,0.2ms-1ms之间),导致部分性能指标变高。

解决方案:

  1. 当前多进程通信框架导致,可以根据实际业务降低连接池线程数量,具体参考Q1.3
  2. 当前版本需合理规划业务负载,关闭或裁剪不需要的功能

Q2.2 快启耗时达不到预期?

现象:当前支持快启功能,sdk_server开放了全量功能,导致快启时间变长。

解决方案:根据实际业务情况重新评估基线,并裁剪sdk_server中不需要的模块。裁剪方法为

  • 修改samples/mpp/common/sdk_init/sdk_init.c中的sdk_init函数,根据实际业务确认哪些模块不需要

  • 进入samples/mpp/sdk_server执行如下命令重编sdk_server

    make clean -j;make -j
    
  • 重新运行sdk_server即可


3. 视频处理(VPSS)

Q3.1 VPSS多路低延时+卷绕+普通叠加后编码通道过多,导致报错?

现象: VPSS开启6路低延时+6路卷绕+6路普通,对接16路编码,业务运行后出现错误日志信息

原因: 多路极限性能受限,资源不足导致异常打印

规避方案:

  1. 该场景为极限性能场景,不建议在实际业务中使用,需要减少低延时/卷绕通道的组合数量

Q3.2 VPSS通道VB缓存块不足时降帧率?

现象: 实际运行过程中,每个通道在只有2块对应大小的VB时会降帧率。

解决方案: 增加每个通道的VB缓存块数量,建议至少配置3-4块VB。


Q3.3 延时中断行号配置过大导致丢帧?

现象:全在线工作模式,帧中断类型EARLY、EARLY_END,1080P分辨率延时中断行号配置1079会导致丢帧

解决方案:将early_line设置为图像高度的2/3,避免延时中断与下一个帧起始中断太近。


4. ISP/AIISP/AIBNR

Q4.1 AIBNR切换为WDR时异常,sdk_server异常退出?

现象: AIBNR切换为WDR时,串口和日志出现异常打印,切换失败,sdk_server进程异常退出。

解决方案: 参见 Q1.1


Q4.2 WDR自动降帧场景下,镜头遮挡后放开时画面卡住?

现象: WDR在线业务中(VI在线,VPSS离线),AE自动模式下(短帧优先和长帧优先都存在),自动降帧模式,镜头对着工频闪灯泡,用手遮住镜头后放开,点播画面卡住,VI和VPSS通道帧率为0。

规避方案:

1、关掉BNR

2、避免在WDR自动降帧模式下进行极端的光照突变操作(如遮挡镜头后突然放开)


5. 智能算子(SVP/NPU)


Q5.1 SVP NPU Sample运行需要增大OS内存?

现象: 使用默认32M OS内存运行sample_svp_npu_main时,日志一直打印vi_pipe相关报错。

解决方案: 增大OS内存分配,建议从默认32M调整到48M或更高。


Q5.2 IVE任务队列满如何解决?

现象: 执行ive任务,出现The waiting queue is full of task队列满的打印报错。

解决方案: 当前ive队列默认节点数是64,需要实际情况增加ive节点数,建议每次增加32后重试,修改方案为

  • 修改samples/mpp/common/sdk_init/sdk_init.c中的ive_init函数,具体修改内容如下

    static hi_s32 ive_init(hi_void)
    {
        ive_module_params_s mod_param;
        mod_param.power_save_en = 1;
        mod_param.mod_node_num = OT_IVE_DEFAULT_NODE_NUM; /* OT_IVE_DEFAULT_NODE_NUM默认值64,直接修改此处,增大节点数 */
        return ot_ive_mod_init(&mod_param);
    }
    
  • 进入samples/mpp/sdk_server执行如下命令重编sdk_server

    make clean -j;make -j
    
  • 重新运行sdk_server即可


6. PQTools调参工具


Q6.1 默认32M内存下单板运行PQT工具异常?

现象: 默认32M内存配置下,PQT工具有多个场景运行异常

工具使用的业务场景可能包括:

  • 启wdr业务、3A统计抓图功能,无法获取统计信息
  • 部分aibnr业务:hy006_3814_0011_4M15_large_mem_aiisp_send_raw.ini、hy006_3814_0011_4M5_large_mem_aiisp_send_raw.ini(128M DDR不支持)
  • FPN标定(128M DDR不支持)
  • 灌raw/yuv后,进行点播、3A抓图、抓jpeg(128M DDR不支持)
  • 板端自动灌YUV抓码流

原因: 默认32M的OS内存不足,或128M DDR单板上无法运行

解决方案:

1、 增大OS内存分配,建议从默认32M调整到更大值。

2、需要128M以上DDR的场景,当前不支持