创建在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形式。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

实现(略)

之后放出来。

相关文章
相关标签/搜索