Exchanging buffers with the coprocessor

Revision as of 11:52, 19 September 2019 by Registered User

1. Introduction[edit source]

In the STM32MPU Embedded Software distribution, the RPMsg protocol is in charge of the the communications between the Cortex-A and the Cortex-M Cite error: Invalid <ref> tag; invalid names, e.g. too manyCite error: Invalid <ref> tag; invalid names, e.g. too many.

To implement a feature relying on RPMsg protocol, it is important to understand that this protocol has not been designed to directly transfer high data rate streams. In consequence, the implementation has to be adapted depending on the use case constraints:

  • For control and low data rate exchange RPMsg is enough.
  • For high rate transfer, large data buffers, an indirect buffer exchange mode should be preferred.

2. RPMSG protocol awarness[edit source]

The RPMsg provides through the virtio framework a basic transport layer based on a shared ring buffer:

  • The buffers are pre-negociated and preallocated during coprocessor loading (size , number of buffers).
  • the buffers are allocated in non cacheable memory.
  • There is no direct access from RPMSG client to these buffers , they are filled by a copy (no zero copy or DMA transfers).
  • No bandwidth is guaranty. Buffers can be shared between several RPMsg clients.

The size of the buffers is hard-coded ( 512 bytes), but it is possible to customize the number of buffers used. Acting on this parameter will impact the number of buffers allocated in both direction ( refer to [resource table]] for details. Associated to a RPMsg transfer a doorbell signal is sent to the destination processor via the stm32 IPCC mailbox, generating an IRQ for each message transfer.

3. Direct Buffer exchange mode[edit source]

This mode consists in using the RPMsg buffer to transfer the data between the processor.

  • The RPMsg message contains effective data.
  • Memory allocation is limited to the RPMsg buffers allocation.
  • RPMsg client implementation is quite straight forward in term of code implementation.

This implementation is recommended:

  • for control message, for instance to control a remote processor application,
  • to exchange low data rate stream (similar to a slow data rate bus).

For application sample, please refer to List of Availables Projects and have a look into OpenAMP_TTY_echo application.

4. Indirect buffer exchange mode[edit source]

This mode also called Big Data mode consists in using RPMsg to carry references to some other buffers that contains the effective data. Theses other buffers can be:

  • any size,
  • allocated by multiple means, in cached or non cached memory, in DDR or MCU SRAM, ...
  • mmapped for direct access by application,
  • accessed by DMA or any master peripheral.

This implementation allows to limit data copy between producer and consumer, offering client direct data access to user application.

This implementation is recommended:

  • for High bit rate transfer (e.g. visual buffers),
  • for real time transfer (e.g. audio buffers),
  • to privilege dynamic buffers allocation,
  • ...

For application sample, please refer to How to exchange big data between Cortex M4 and Cortex A7 demo.

5. References[edit source]