7.7 VDSP开发指南
基础调试指南
CPU侧开发
镜像加载卸载
S100系统在启动时默认不启动VDSP FW(Firmware),需要用户通过命令的形式手动加载和卸载FW,命令如下所示:
echo -n <firmware路径> > /sys/module/firmware_class/parameters/path
#S100 VDSP0
# 设置VDSP0 FW名称:
echo <firmware名称> > /sys/class/remoteproc/remoteproc_vdsp0/firmware
#VDSP0的FW加载:
echo start > /sys/class/remoteproc/remoteproc_vdsp0/state
#VDSP0的FW卸载:
echo stop > /sys/class/remoteproc/remoteproc_vdsp0/state
用户可通过以下命令修改FW路径(必须是绝对路径):
echo -n <firmware路径> > /sys/module/firmware_class/parameters/path
用户可根据自己命名的FW名称在加载之前进行调整:
#S100 VDSP0
echo <firmware名称> > /sys/class/remoteproc/remoteproc_vdsp0/firmware
用户需要修改原始镜像,配置init.rc,kernel启动后由init进程自动加载VDSP镜像。
#首先将编译出的FW镜像(如vdsp0)拷贝到/userdata 下
echo -n <firmware路径> > /sys/module/firmware_class/parameters/path
#S100 VDSP0
echo <firmware名称> > /sys/class/remoteproc/remoteproc_vdsp0/firmware
echo start > /sys/class/remoteproc/remoteproc_vdsp0/state
FW版本查看
#S100 VDSP0
cat /sys/class/remoteproc/remoteproc_vdsp0/version # for vdsp0
VDSP运行状态查看
#running表示已加载,offline表示未加载
#S100 VDSP0
cat /sys/class/remoteproc/remoteproc_vdsp0/state # for vdsp0
心跳监控
默认处于关闭状态,可通过下列命令打开或关闭;心跳监控、发送周期为100ms,监控到连续7次心跳被丢失就会上报诊断并reset VDSP。
# 打开心跳监控
echo Y > /sys/module/hobot_remoteproc/parameters/heartbeat_enable
# 关闭心跳监控
echo N > /sys/module/hobot_remoteproc/parameters/heartbeat_enable
通过函数接口形式操作vdsp
通过libvdsp.so动态链接库加载DSP程序,实现加载、启动、停止、复位、获取DSP状态等功能,API介绍可参考 VDSP启停控制接口。
消息连接和发送
目前用户只可使用系统预设的服务名称,可使用的服务名如下表所示:
| VDSP | 服务名称 | 作用 | 是否必须启动 | VDSP侧是否默认启动 |
|---|---|---|---|---|
| DSP0/1 | dcore0_device_op/dcore1_device_op | 系统软件内部对DSP的调试控制,系统软件已经使用,用户不可再次注册和使用 | 是 | 是 |
| DSP0/1 | dcore0_acore_heart/dcore1_acore_heart | 心跳机制使用,目前未使用,用户可用作其他用途 | 否 | 否 |
| DSP0/1 | dcore0_rpmsg_bpu/dcore1_rpmsg_bpu | BPU相关的控制,目前未使用,用户可用作其他用途 | 否 | 否 |
| DSP0/1 | dcore0_rpmsg_op/dcore1_rpmsg_op | 工具链算子相关的控制,目前未使用,用户可用作其他用途 | 否 | 否 |
| VDSP | 服务名称 | 作用 | 是否必须启动 | VDSP侧是否默认启动 |
|---|---|---|---|---|
| DSP0 | dcore0_device_op | 系统软件内部对DSP的调试控制,系统软件已经使用,用户不可再次注册和使用 | 是 | 是 |
| DSP0 | dcore0_acore_heart | 心跳机制使用,目前未使用,用户可用作其他用途 | 否 | 否 |
| DSP0 | dcore0_rpmsg_bpu | BPU相关的控制,目前未使用,用户可用作其他用途 | 否 | 否 |
| DSP0 | dcore0_rpmsg_op | 工具链算子相关的控制,目前未使用,用户可用作其他用途 | 否 | 否 |
用户可使用的API可参考下表:
| 接口 | 功能 | 头文件 | 相关库 |
|---|---|---|---|
| hb_rpmsg_connect_server | 连接服务 | rpmsg_lib.h | librpmsg.so |
| hb_rpmsg_disconnect_server | 断开服务 | rpmsg_lib.h | librpmsg.so |
| hb_rpmsg_send | 发送消息 | rpmsg_lib.h | librpmsg.so |
| hb_rpmsg_recv | 接收消息 | rpmsg_lib.h | librpmsg.so |
其中,同一个服务通道,不支持多进程、多线程并发接收或发送。
heap相关开发
VDSP提供了动态分配释放heap接口,支持配置自定义内存对齐大小,以及支持查看当前heap状态,当VDSP端需要动态分配heap时,可以通过以下接口实现。
| 接口 | 功能 | 相关头文件 |
|---|---|---|
| hb_mem_heap_initialize | 初始化mem alloctor接口 | hb_mem_allocator.h |
| hb_mem_heap_deinitialize | 解初始化mem alloctor接口 | hb_mem_allocator.h |
| hb_mem_heap_alloc | 分配heap空间 | hb_mem_allocator.h |
| hb_mem_heap_free | 释放已分配的heap空间 | hb_mem_allocator.h |
| hb_mem_heap_get_status | 获取当前heap状态 | hb_mem_allocator.h |
VDSP侧开发
代码获取步骤如下:
(1)首先获取到发布包,解压后确认有vdsp源码。如果无,联系地瓜相关人员进行获取。
(2)在vdsp路径下可以获取到vdsp源码。
Linux环境搭建
获取build包建立编译环境。其中build包的获取请联系地瓜相关人员进行获取。
本文档仅提供Linux环境搭建及编译的说明介绍。对于文档中提到的xplorer中获取调试文档请联系地瓜相关人员进行获取。
Linux环境下安装build的命令:
tar -zxvf Vision_Q8_linux.tgz \
&& mv RI-2023.11-linux/Vision_Q8/ /opt/xtensa/XtDevTools/install/builds/RI-2023.11-linux/ \
&& rm -rf RI-2023.11-linux
/opt/xtensa/XtDevTools/install/builds/RI-2023.11-linux/Vision_Q8/install --xtensa-tools \
/opt/xtensa/XtDevTools/install/tools/RI-2023.11-linux/XtensaTools/
编译
获取代码后编译步骤如下:
(1)cd vdsp_fw
(2)bash make.sh
静态库生成在library目录
library/libvdsp0.a
二进制镜像生成在samples目录
samples/{subdir}/vdsp0
调试指南
日志查看
VDSP FW的日志会通过串口输出。
需要注意的是VDSP FW与其他模块共用一个串口,如BL31、optee,若VDSP FW输出日志太多,可能会阻塞这些模块的日志输出,引起watchdog。 另外VDSP FW日志和kernel日志都输出到串口中,存在相互干扰的问题,用户可通过降低kernel日志等级来防止日志干扰:
echo 0 > /proc/sys/kernel/printk
当没有串口可用的情况下,用户 可通过ssh登录板子,后台默认会启动hrut_remoteproc_log服务:
#S100 VDSP0 默认开机执行的启动命令,日志保存路径:/log/dsp0/message
hrut_remoteproc_log -b /sys/class/remoteproc/remoteproc_vdsp0/log -f /log/dsp0/message -r 2048 -n 200
同样的,VDSP FW的日志会写入Share memory中,由CPU侧log服务进程存入文件系统中。因此用户可通过以下路径下的文件查看日志,但是需要注意的是这里的日志并不是实时的。
#S100 VDSP0的日志路径:
/log/dsp0/message
/log/dsp0/archive/
#message是临时文件,存满之后会写入到archive/目录下,当该目录下的文件达到一定数量后,会删除时间较早产生的文件