• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

建立在STM32MP157 openAMP 上的IO-RPC协议

互联网 diligentman 2周前 (11-18) 7次浏览

老实说,很久以前就知道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作为调试串口来使用。

建立在STM32MP157 openAMP 上的IO-RPC协议

 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形式。

建立在STM32MP157 openAMP 上的IO-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

实现(略)

以后放出来。


喜欢 (0)