老实说,好久之前就知道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形式。spa
图-1 异构处理器之间的RPC 协议设计
与传统RPC不一样之处是,当硬件接口的信号或者状态是随机发生时,须要有一种相似中断的通知机制。在协议中设置了通知(notification)帧,通知硬件发生的事件。调试
IO-RPC 的细节
对象程序设计的理念对象
IO-RPC 协议中引入了面向对象程序设计的理念,将各类IO 外设类型定义为对象,具体的IO 外设视做为对象的实体。blog
帧结构
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
实现(略)
之后放出来。