跳转至

quick_start_demo 快速入门

1. 概述与作用

quick_start_demo 是 Hi3516CV610 SDK 提供的最小化 VI+VPSS 链路快速启动示例,用于在 Hi3516CV610平台上验证从 sensor 上电到首帧到达再到 VPSS 取帧的端到端时延与通路连通性。该 sample 不做 H.265 编码(默认 ENABLE_VENC=0),仅 spawn 一个取帧线程在 VI chn 与 VPSS chn 上分别调用 ss_mpi_vi_get_chn_frame 与 ss_mpi_vpss_get_chn_frame,并在每个关键阶段通过 print_timestamp() 写入 PTS 与阶段标签,通过 popen("echo ... > /dev/kmsg") 把时间戳缓冲 flush 到内核 dmesg,方便用 dmesg 读取以度量 VI/VPSS 首帧时延与帧间 gap。

2. 执行准备

在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。

2.1 编译

进入样例目录执行 make 即可完成编译:

cd samples/mpp/quick_start_demo && make

编译成功之后,在当前目录下会生成一个sample_quick_start的可执行文件,可以放社区支持的开发板上运行。

2.2 加载 KO

ko加载脚本位于 output/mpp/ko/load_ko,有两个脚本,load3516cv610_20s和load3516cv610_20s_debug。区别为load3516cv610_20s_debug脚本会打开 logmpp_show=1(日志记录)、proc_show=1(proc信息打印),并将 mem_process_isolation 置为 0(不启用进程间mmz隔离)。

由于当前版本不支持进程间mmz隔离,因此需要在load3516cv610_20s脚本中将 mem_process_isolation 置为 0或者使用load3516cv610_20s_debug脚本,此处以load3516cv610_20s_debug脚本为例,20s内存大小为128MB,默认分配为 32MB OS、96MB MMZ,加载命令如下:

./load3516cv610_20s_debug -i

可以通过-h命令查看具体用法:

./load3516cv610_20s_debug -h
Usage:  ./load3516cv610_20s_debug [-option] [-sensor0~1] 
options:
    -i                       insert modules
    -r                       remove modules
    -a                       remove modules first, then insert modules
    -sensor0~1 sensor_name   config sensor type    [default: hy006_3814_0011]
    -mmz_start               config MMZ start addr [default: 0x42000000]
    -mmz_size                config MMZ mem size [unit: M, default: 96M]
    -ir_auto                 config ir_auto enable [default: 0]
    -profile                 config sys_profile [default: 0]
    -h                       help information
Available sensors:hy006_3814_0011 bt1120/bt656/bt601
for example: ./load3516cv610_20s_debug -i -sensor0 hy006_3814_0011 -sensor1 hy006_3814_0011 -mmz_start 0x42000000 -mmz_size 96M -ir_auto 1

加载后可以通过lsmod查看ko加载情况:

image-20260820104249254

如果需要调整os和mmz的大小,需要参考《内存布局调整指南》对内存大小进行调整。

如果是使用社区默认提供的镜像,这些ko已经打包到文件系统中,烧录到单板上后位于/ko目录下,在系统启动后会自动加载这些ko。

2.3 运行时依赖

在运行样例前,需要提前准备:

  • 指定运行时依赖的so库路径

MPP样例依赖的so库位于soc/libs/musl下,需要将该目录下的so库拷贝到开发板上(或将这些so库所在的目录挂载到开发板上),并指定运行时依赖库的环境变量,假设这些so库位于/mnt/libs/,执行如下命令:

```shell
export LD_LIBRARY_PATH=/mnt/libs/:$LD_LIBRARY_PATH
```

如果是使用社区默认提供的镜像,这些so库已经打包到文件系统中,烧录到单板上后位于/usr/lib目录下,该目录是系统默认搜索目录,不需要执行export LD_LIBRARY_PATH命令去指定。

  • 启动MPP服务

当前MPP媒体模块处于用户态,通过一个独立进程提供相关接口的调用服务,该进程位于samples/mpp/sdk_server下,执行如下命令即可生成sdk_server可执行文件:

```shell
cd samples/mpp/sdk_server && make
```

在单板上执行./sdk_server &即可启动MPP服务。

  1. sdk_server同样依赖soc/libs/musl下的so库,因此也需要参照上述export LD_LIBRARY_PATH指定路径;
  2. 如果是使用社区默认提供的镜像,sdk_server进程已经打包到文件系统中,烧录到单板上后位于/usr/bin目录下,并在系统启动时会自动启动sdk_server。
- 可以使用`ps`查看进程是否运行(下图以默认镜像中启动`sdk_server`为例,其位于`/usr/bin`目录下):

![image-20260820104643010](figures/image-20260820104643010.png)
  • 样例运行时候需要的资源文件

无。

3. 支持的 Case 列表

调用语法

仅 1 个 case,无参数;

./sample_quick_start

输出文件

无文件输出。时间戳缓存到 timestamp_buf[64][512],结尾通过 popen("echo ... > /dev/kmsg") flush 到 dmesg。

控制台日志

打印时间戳函数print_timestamp标记以下事件:

sample_main_enter、sample_main_sighandle_end、route_sys_start_end、route_vi_start_end、route_vpss_start_end、sample_vio_start_route_done、ss_mpi_vi_get_chn_frame_start、ss_mpi_vi_get_chn_frame_done_<pts>、ss_mpi_vpss_get_chn_frame_start、ss_mpi_vpss_get_chn_frame_done_<pts>、sample_main_exit

sample中记录了媒体初始化、获取第一帧等关键节点的耗时信息,耗时时间统一输入到内核打印buffer。可以通过dmesg命令查看,如下是sample默认打印信息:

[    2.522096] sample_main_enter pts is: 2119172, gap: 0
[    2.523357] sample_main_sighandle_end pts is: 2120163, gap: 991
[    2.524639] sample_vio_all_mode cfg start pts is: 2120175, gap: 12
[    2.525915] sample_vio_all_mode cfg end pts is: 2121647, gap: 1472
[    2.527188] sample_vio_start_route_start pts is: 2121808, gap: 161
[    2.528466] route_sys_start_end pts is: 2123520, gap: 1712
[    2.529749] mpi_isp_init start pts is: 2125851, gap: 2331
[    2.531106] ss_mpi_vi_get_chn_frame_start pts is: 2130683, gap: 4832
[    2.532361] mpi_isp_init end pts is: 2144386, gap: 13703
[    2.533625] route_vi_start_end pts is: 2144555, gap: 169
[    2.534892] route_vpss_start_end pts is: 2144800, gap: 245
[    2.536156] sample_vio_start_route_done pts is: 2144849, gap: 49
[    2.537420] ss_mpi_vi_get_chn_frame_done_2148675 pts is: 2177965, gap: 33116
[    2.538682] ss_mpi_vpss_get_chn_frame_start pts is: 2178012, gap: 47
[    2.539972] ss_mpi_vpss_get_chn_frame_done_2148675 pts is: 2185941, gap: 7929
[    2.541295] sample_main_exit pts is: 2521039, gap: 335098

结尾绿色 program exit normally! 表示成功,或红色 program exit abnormally!表示异常。

正确性判断

满足以下两点视为通过:

  1. 控制台结尾打印绿色 program exit normally!。
  2. dmesg 含时间戳行、PTS 与 gap 值,且相邻的vi_get_chn_frame_done 与 vpss_get_chn_frame_done 之间的 gap 在合理范围(首帧数十 ms 量级,后续帧接近帧周期)。

如出现红色 program exit abnormally!,结合 dmesg 中缺失的阶段标签定位卡在哪一段(sys / vi / vpss / get_chn_frame),常见原因为 sensor 未在 uboot 完成初始化、卷绕行buffer数不足。

快启的调试调优请参考《Hi35xxVxxx 快速启动优化指南》。