我们在前面的文章有提到过Linux的remoteproc框架,并通过它体验了一番异构核心的控制和运行,这一次我们来体验一下异构核心通信。
异构多核心也不是最近才出现的技术,只是由于使用这些技术的人越来越多,才慢慢引起大家的关注。OpenAMP框架已经发展了很多年,他们这个框架感觉更激进一些,例如实现两个MCU核心之间的通讯功能,并且支持Linux平台以外的RTOS。他们提出的机制在2014年合并到Linux内核里,也就是现在常见的rpmsg(Remote Processor Messaging)框架。
RPMsg通信实现可以分为三个不同的层 - 传输层、媒体访问控制层和物理层。物理层就是mailbox,共享内存之类的硬件层。如图所示:
两个核心之间的通信,可以通过共享内存来实现,两个核心通过硬件中断或者轮巡来更新通信数据。由于两个核心需要关注有没有新数据,那最好是每个通信核心都有一个中断线用于接收通知。没有中断也可以实现,只是核心需要花时间来检查物理层里有没有新的数据,这样会影响性能。
核间通信使用环形缓冲区进行通信,两个核心不断在环形缓冲区里写入数据和读取数据。写入新数据则标记为已使用,读取完数据则标记为可用。
从Linux到mcu核心,首先从环形缓冲区这边申请空间,然后写入RPMsg消息头和传递的数据,再插入到环形缓冲区中,然后通知MCU来取消息。MCU从缓冲区拿到数据,再传递给终端回调函数处理数据,最后将RPMsg消息从队列取出,通知A53核心完成。反过来也一样,只是数据是由MCU负责填充,再通过队列发送给A53核心。如下图所示:
由于官方SDK默认加载的m4fss和r5fss核心程序,都是RPMsg示范程序,所以我们重启一下开发板,就可以运行SDK的示范程序了。
通过运行rpmsg_char_simple命令,可以看到Linux和两个核心的RPMsg通信已经跑起来了,也成功通讯了。
这两个命令,指定的设备id是固件里设置好的,m4fss是9,r5fss(唤醒核心)是15
更多回帖