This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM6421: R5F to A53 interprocessor communications

Part Number: AM6421
Other Parts Discussed in Thread: TMDS64EVM

We are designing a data acquisition system using an AM642.  In our design the front end uses an FPGA interfaced to the R5F core running bare metal code.  The R5F will generate streaming data consisting 48 byte packets that need to be transmitted to A53 core running an embedded real-time Linux. Our initial tests using the RPMSG service without DMA is topping out at about 75000 packets/sec.  We'd like to get this up by an order of magnitude.

Note#2:  We're testing using a TMDS64EVM dev kit with the Linux that comes with it.  We've done very little to optimize the Linux core. 

Is there a better approach to getting streaming data from the R5F to the A53?

  • Hello Max,

    Does the data need to be delivered in separate 48 byte packets?

    I understand your throughput needs are around 750,000 packets * 48 bytes = 36 million bytes / sec. Do you have specific latency requirements?

    Each RPMsg message can transmit 496 bytes of information (512 bytes total, with a 16 byte header). I assume for your initial tests you are sending 480 bytes or 10 packets of information per message. That gives 75,000 packets / sec * (1 message / 10 packets) = 7,500 RPMsg messages sent a second, or ~133 us per RPMsg on average?

    Keep in mind that for each RPMsg transaction, I would expect us to be dealing with the Linux interrupt response time which puts a minimum latency on the RPMsg transaction. For more information, reference this FAQ and the other FAQs listed in the question prompt: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1183526/faq-linux-how-do-i-test-the-real-time-performance-of-an-am3x-am4x-am6x-soc

    One option would be to allocate a region or regions of shared memory, fill it up with packets, and then use RPMsg to notify Linux when the next chunk of shared memory is ready to be processed. That allows you to pass however many packets you want to per RPMsg interaction, rather than limiting you to 10 packets per RPMsg message. For more information, take a look at our shared memory example: https://git.ti.com/cgit/rpmsg/rpmsg_char_zerocopy/

    Regards,

    Nick