RPMSG开发说明
===============


RPMSG接口使用序列
--------------------

Acore发送VDSP接收

.. image:: ./media/imagerpmsgapi.png
   :align: center
   :alt: 

VDSP发送Acore接收

.. image:: ./media/imagerpmsgvdspapi.png
   :align: center
   :alt: 

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

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                   工具链算子相关的控制，目前未使用，用户可用作其他用途                               否                 否
========== ================================= ========================================================================= ================= =======================

RPMSG注意事项
--------------------

-  地平线内部已经使用了dcore0_device_op和dcore0_acore_diag_errcode两个服务通道。
-  用户可用的服务通道为dcore0_acore_heart、dcore0_rpmsg_bpu和dcore0_rpmsg_op三个服务通道。
-  若应用对系统调度延时的波动比较敏感，可调整应用程序的调度策略为SCHED_FIFO。

RPMSG调试方法
--------------------

调试日志
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

error code (api 返回值)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

sysfs调试节点(Acore侧)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

statistic 调试节点
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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

【节点路径】

.. code:: bash

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

【节点作用】

.. code:: bash

	#统计服务通道接收&发送的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;
	};

【节点使用】

.. code:: bash

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

