AMP相关:5 OpenAMP以及RPMsg-Lite
OpenAMP是一个开源框架,专为非对称多处理系统设计,提供生命周期管理和处理器间通信能力,支持与Linux兼容的组件以及独立库,适用于RTOS和裸机环境。
1 OpenAMP说明
OpenAMP框架包含提供了三个重要组件:Virtio、RPMsg和Remoteproc。Remoteproc实现了主处理器对远程处理器程序的加载、启停远程处理器,实现对远程处理器的生命周期管理;RPMsg依托Virtio实现了主处理器和远程处理器之间的核间通信。
OpenAMP主要基于以下关键技术和协议:
- remoteproc - 它提供了启动、停止和管理远程处理器的能力,让异构系统中的不同处理器能够协同工作。
- rpmsg - 一种轻量级的消息传递机制,用于在处理器之间进行低延迟、高性能的数据传输。rpmsg 支持动态通道创建,使得进程间通信更加灵活。
- virtio - 类似Linux内核中的vring接口,OpenAMP实现了高效的双向通信缓冲区管理,降低了CPU负担和提高了通信效率。
- Platform Abstraction Layer (PAL) - 提供了一组API,隐藏了底层硬件的复杂性,使OpenAMP能够在各种平台上无缝运行。
2 OpenAMP相关资源
OpenAMP官方代码:GitHub - OpenAMP/open-amp: The main OpenAMP library implementing RPMSG, Virtio, and Remoteproc for RTOS etc。
OpenAMP文档:Welcome to the OpenAMP Project Documentation — OpenAMP documentation。
OpenAMP中remoteproc介绍:Life Cycle Management — OpenAMP documentation。
OpenAMP中RPMsg介绍:RPMsg Messaging Protocol — OpenAMP documentation、RPMsg Communication Flow — OpenAMP documentation。
3 OpenAMP在STM32MP157的M4实现
M4使用OpenAMP框架,创建和A7对等的架构:rproc、virtio、vring、rpmsg,以及一个虚拟的UART和A7的/dev/ttyRPMSGx进行通信。
main
HAL_Init
MX_IPCC_Init--初始化IPCC硬件。
HAL_IPCC_Init
MX_OPENAMP_Init
MAILBOX_Init
HAL_IPCC_ActivateNotification
IPCC_channel1_callback--Channel1的中断回调函数。
IPCC_channel2_callback--Channel2的中断回调函数。
OPENAMP_shmem_init
rproc_virtio_create_vdev--创建virtio device。
rproc_virtio_wait_remote_ready
rproc_virtio_get_status--等待直到remoteproc组合中Master端就绪。
rproc_virtio_init_vring--使用vring0和vring1。
rpmsg_virtio_init_shm_pool
rpmsg_init_vdev--初始化virtio设备。
VIRT_UART_Init--基于rpmsg创创建endpoint用于和Linux段的rpmsg tty设备通信。
OPENAMP_create_endpoint
VIRT_UART_RegisterCallback
VIRT_UART0_RxCpltCallback--读取vring中buffer放到Copy_Buffer中。
->循环任务处理A7发送的字符串,执行,返回执行结果。
->OPENAMP_check_for_message
->MAILBOX_Poll
->rproc_virtio_notified
->VIRT_UART_Transmit--
->OPENAMP_send--即调用rpmsg_send发送消息给对端remote processor。
IPCC中断处理函数:
.word IPCC_RX0_IRQHandler // Mailbox RX0 Free interrupt .word IPCC_TX0_IRQHandler // Mailbox TX0 Free interrupt .word DMAMUX1_OVR_IRQHandler // DMAMUX1 Overrun interrupt .word IPCC_RX1_IRQHandler // Mailbox RX1 Free interrupt
.word IPCC_TX1_IRQHandler // Mailbox TX1 Free interrupt
4 RPMsg-Lite
RPMsg-Lite组件,它是远程处理器消息传递 (RPMsg) 协议的轻量级实现。RPMsg 协议定义了一个标准化的二进制接口,用于在异构多核系统中的多个核之间进行通信。与OpenAMP框架的RPMsg实现相比,RPMsg-Lite 减少了代码大小、简化了 API 并改进了模块化。
RPMsg-Lite代码:GitHub - nxp-mcuxpresso/rpmsg-lite: RPMsg implementation for small MCUs。
RPMsg-Lite官方介绍:《RPMsg-Lite User's Guide: RPMsg Component (nxp-mcuxpresso.github.io)》。
参考文档:《多核异构通信框架(RPMsg-Lite)》、《RPMsg-Lite上手_rpmsg lite》。