Skip to content

# 12.3. RPMSG开发说明

## 12.3.1. RPMSG接口使用序列

Acore发送VDSP接收

VDSP发送Acore接收

RPMSG在Acore侧和VDSP侧提供相同的收发接口，VDSP作为slave端，具有start和stop接口，Acore侧作为master端，具有connect和disconnect接口。RPMSG一个服务通道只支持一个进程使用，用户单次发送数据包小于等于240Bytes。

## 12.3.2. RPMSG通道资源

目前用户只可使用系统预设的服务名称，可使用的服务名如下表所示：

VDSP | 服务名称 | 作用 | 是否必须启动 | VDSP侧是否默认启动
--- | --- | --- | --- | ---
DSP0 | dcore0_device_op | 系统软件内部对DSP的调试控制，系统软件已经使用，用户不可再次注册和使用 | 是 | 是
DSP0 | dcore0_acore_diag_errcode | 系统软件内部对STL的控制，系统软件已经使用，用户不可再次注册和使用 | 否 | 否
DSP0 | dcore0_acore_heart | 心跳机制使用，目前未使用，用户可用作其他用途 | 否 | 否
DSP0 | dcore0_rpmsg_bpu | 和使用bpu相关的控制，目前未使用，用户可用作其他用途 | 否 | 否
DSP0 | dcore0_rpmsg_op | 工具链算子相关的控制，目前未使用，用户可用作其他用途 | 否 | 否

## 12.3.3. RPMSG注意事项

- 地平线内部已经使用了dcore0_device_op和dcore0_acore_diag_errcode两个服务通道。

- 用户可用的服务通道为dcore0_acore_heart、dcore0_rpmsg_bpu和dcore0_rpmsg_op三个服务通道。

- 若应用对系统调度延时的波动比较敏感，可调整应用程序的调度策略为SCHED_FIFO。

## 12.3.4. RPMSG调试方法

### 12.3.4.1. 调试日志

LIBRPMSG及底层的RPMSG驱动、Mailbox驱动都提供了较完整的log信息，若有调试问题，可查看log输出，帮助定位问题。

### 12.3.4.2. error code (api 返回值)

RPMSG定义了一些error code，覆盖了常见的错误类型，可使用接口：hb_rpmsg_error_message将error code转换为错误描述。

### 12.3.4.3. sysfs调试节点(Acore侧)

#### 12.3.4.3.1. statistic 调试节点

打印统计的通信信息，包括send_frame_count, recv_frame_count, recv_frame_count等。

【节点路径】

    #dcore0_rpmsg_bpu表示服务通道，可以选择5个服务通道中的任一个
    /proc/rpmsg_server/dcore0_rpmsg_bpu/statistics

【节点作用】

    #统计服务通道接收&发送的count
    #打印dcore0_rpmsg_op信息的统计，包括
    struct debug_statistics {
            int32_t send_frame_count;
            int32_t send_nonblock_fail_count;
            int32_t send_block_timeout_count;
            int32_t recv_frame_count;
            int32_t recv_nonblock_fail_count;
            int32_t recv_block_timeout_count;
            int32_t callback_fail_count;
            int32_t callback_succ_count;
            int32_t crc_error_count;
    };

【节点使用】

    echo 2048 > /proc/rpmsg_server/dcore0_rpmsg_bpu/statistics
    cat /proc/rpmsg_server/dcore0_rpmsg_bpu/statistics