建立在STM32MP157 openAMP 上的IO-RPC协议
老实说,很久以前就知道cortex-A 和cortex-M 构成的异构处理器芯片是个好东西。比如NXP ,TI早就有这样的SOC出现了,但是总是怕怕的,觉得它们开发起来好麻烦。网络上的介绍也说得稀里糊涂。直到最近使用STM32MP157C 才发现,至少STM32MP157 用起来没有想象的难。在做了一些基础的实验之后,我还自己设计了一个应用层协议IO-RPC (IO 远程过程调用)。为设计Linux 的嵌入设备做准备。这将加快我们向基于Linux 的应用转移的步伐。相关内容和想法目前并不成熟,分享给大家探讨。
remoteprc,rpmsgAPI和open AMP
STM32MP157C 是异构多处理器结构,它有两个cortex-A7 核和一个cortex-M4 核构成。这是一种非对称处理机架构(AMP Asymmetric Multi-processing)。为了实现RTOS或者裸机程序能够与Linux 上的程序相互通信。需要一个标准化的多核架构。。在Linux的内和中,包含了remoteproc和rpmsgAPI 组件。这个基础架构最早是由Texas Instrument 开发的。在此基础上mentor 公司 开发了OpenAMP框架。在这个框架下,主Linux 内核通过remoteproc API 来控制和管理remote 内核的生命周期(可以启动,停止 其它内核运行),为remote processor 分配系统资源和创建虚拟IO virIO设备。而远程内核中的程序通过openAMP 库来注册virIO 并通过virIO 与主Linux 上的应用程序通信。
简单的虚拟IO就是串口(UART),下图中,就是在主Linux和远程处理器之间注册了两个虚拟UART。将复杂的多处理器通信转化为两个UART。是不是好神奇?当然,这样的UART 的传输速度应该是远远高于物理的UART。因为他们是通过共享内存的方式实现的。在具体实现中,我们将虚拟virUART0作为IO-RPC 的通信通道,而将virUART1作为调试串口来使用。
IO-RPC 协议
STM32MP157C的异构处理器架构中cortex-A7 与cortex-M 之间采用上述方式实现相互通信的,它提供了虚拟串口透明地传输数据。这还是不够的,我们在此基础上设计了IO-RPC 协议。使Linux 应用程序更加便捷地访问cortex-M4 的IO资源和程序。
。通常由cortex-A 完成网络和数据处理事务(基于Linux OS),cortex-M 完成实时IO 接口控制(基于RTOS),于是,需要数据设计·一种相对通用的双机通信协议来实现数据处理程序和IO控制程序之间的数据交换,有利于规范程序设计,提升程序的灵活性,可扩展性。
IO-RPC 使用了远程过程调用的机制,通过调用M4 上的过程实现对cortex-M 上接口资源和程序的访问和控制。为了提高效率,IO-RPC二进制编码RPC形式。
图-1 异构处理器之间的RPC 协议
与传统RPC不同之处是,当硬件接口的信号或者状态是随机发生时,需要有一种类似中断的通知机制。在协议中设置了通知(notification)帧,通知硬件发生的事件。
IO-RPC 的细节
对象程序设计的理念
IO-RPC 协议中引入了面向对象程序设计的理念,将各种IO 外设类型定义为对象,具体的IO 外设视作为对象的实体。
帧结构
RPC 调用(A7 –>M4)
对象类型,对象实体,方法,参数长度,参数
RPC 结果(M4 ->A7)
对象类型,对象实体, 结果 ,参数长度,参数
通知M4 ->A7)
对象类型,对象实体,通知,参数长度,参数
- 对象类型(Object Type ,1个字节)
- 对象实体(object instance ,1个字节)
- 方法,结果,通知(1 个字节)
- 参数长度(2个字节)
- 参数(n个字节)
对象类型
理论上对象可以是任何类型的,在这里我们仅限于一台基于STM32MP157C 的可编程控制器PAC为例。
PAC控制器提供了下列对象类型
- 数字输入(8 路数字输入)
- 数字输出(8 路数字输出)
- 模拟输入(两路模拟输入)
- 模拟输出(两路模拟输出)
- RS485(两路UART)
- FD-CAN(一路FD CAN)
对象实体
对象的实体使用二进制编码。
- 数字输入 (0~7)
- 数字输出 (0~7)
- 模拟输入 (0~1)
- 模拟输出(0~1)
方法
每一种接口对象中包含了若干方法。它们采用二进制顺序编码作为一个ID。比如:
- Read
- Write
- PWMOut
实现(略)
以后放出来。