RapidIO 逻辑层IO操作与Message操作的原理和区别
接上一篇 SRIO RapidIO (SRIO)协议介绍(一)
1 说明
查看协议手册时会发现,逻辑层的操作分成了IO和Message 2类动作,那么为什么要分成2类操作?从原理和应用角度来看IO和message的区别是什么呢?
1、 分成2类是为了应对不同的互联类型,IO操作主要为了应对远端的内存访问,设备间可以访问彼此的物理内存;
2、 Message操作提供了一个基于消息的通用、安全的数据传输方式,设备间无法访问对方的物理内存,但是又需要进行数据的场景Messages and doorbells are port based operations that allow devices to communicate with each other without visibility to each other’s address space. The packet contains an identification value pertaining to the message, and the receiver defines the memory location for the message to be buffered.
A doorbell is a simple sixteen bit message sent to a target device, which is useful for generating an interrupt.
A message provides inter-device communication through explicit messages instead of direct memory access. It can consist of up to sixteen packets, where each packet can contain up to 256 bytes, enabling messages up to a maximum of four kilobytes.
3、 RapidoIO是基于请求、相应的传输机制,其中IO请求操作占据了FTYPE(frame type包类型)的0-8(主要为FTYPE2 - Request Class,FTYPE5 - Write Class,FTYPE6 - Streaming Write Class),Message请求操作占据了FTYPE的10-11(主要为FTYPE10 - Doorbell Class,FTYPE11 - Message Class);
1.1 包格式说明
参考 https://blog.csdn.net/m0_52840978/article/details/121666138?spm=1001.2014.3001.5501 (该链接内容参考自 《RapidIO: The Next Generation Communication Fabric For Embedded Application》)
RapidIO包由代表3级规范体系结构的多个字段组成。下图显示了典型的请求包和响应包的格式,这些包的格式属于并行物理层包格式,串行物理层包的格式与此稍有不同。某些字段是依赖于具体的上下文的, 并不会在所有的包中出现。
请求包以物理层字段开始, S位指示这是一个包还是一个控制符号(S=0表示是一个包,S=1表示是控制符号), AckID表明交换结构器件将用控制符号来确认哪一个包。PRIO字段指示用于流量控制的包优先级。TT、目标地址( Target Address)和源地址( Source Address)字段指示传输地址的机制类型、包应被传送到的器件的地址和产生包的器件的地址。Ftype和事务(Transation)指示正被请求的事务。长度(Size)字段等于编码后事务的长度, RapidIO事务数据的有效裁荷(Payload)长度从1到256字节不等。SrcTID(源事务ID)指示事务ID, RapidIO器件在两个端点器件间最多允许有256个未完成的事务。对于存储器映射事务,跟随在srcTID后面的是器件偏移地址 (Device Offset Address ) 字段。写事务必须附带数据的有效裁荷,所有包以16位(2个字节)循环冗余校验码(CRC)结束。
响应包与请求包类似。状态(Status)字段指示是否成功完成了事务。目标TID(目标事务ID)字段的值与请求包中源事务 ID字段的值相等。下图是请求包与响应包的包格式示意图

图 1‑1 请求包与回应包格式
对于用户来说,最需要关注的就是逻辑层(上图中蓝色部分)各个字段的含义,逻辑层中Ftype与Ttype(Ttype字段和上图中的Transaction字段是同一个字段,只不过叫法不同而已)两个字段唯一的确定了这个请求包的功能。下表列出了Ftype与Ttype所确定的包含义
表 1‑1 Ftype与Ttype说明
|
Ftype (Format Type) |
Ttype (Transaction Type) |
包类型 |
功能 |
|
0~1 |
—— |
Reserve |
无 |
|
2 |
4’b0100 |
NREAD |
读指定的地址 |
|
4’b1100 |
ATOMIC increment |
先往指定的地址中传递数据,在把传递的数据加1,此操作为原子操作,不可打断 |
|
|
4’b1101 |
ATOMIC decrement |
先往指定的地址中传递数据,在把传递的数据减1,此操作为原子操作,不可打断 |
|
|
4’b1110 |
ATOMIC set |
把指定地址中的数据每个bit全部写1 |
|
|
4’b1111 |
ATOMIC clear |
把指定地址中的数据清0(每个bit全部清零) |
|
|
3~4 |
—— |
Reserve |
无 |
|
5 |
4’b0100 |
NWRITE |
往指定的地址写数据 |
|
4’b0101 |
NWRITE_R |
往指定的地址写数据,写完成以后接收目标器件(Target)的响应 |
|
|
4’b1101 |
ATOMIC test/swap |
对指定地址中的数据进行测试并交换,此操作为原子操作,不可打断 |
|
|
6 |
4’bxxxx |
SWRITE |
以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,此方式效率最高 |
|
7 |
—— |
Reserve |
无 |
|
8 |
4’b0000 |
MAINTENANCE read request |
发起读配置,控制,状态寄存器请求 |
|
4’b0001 |
MAINTENANCE write request |
发起写配置,控制,状态寄存器请求 |
|
|
4’b0010 |
MAINTENANCE read response |
产生读配置,控制,状态寄存器响应 |
|
|
4’b0011 |
MAINTENANCE write response |
产生写配置,控制,状态寄存器响应 |
|
|
4’b0100 |
MAINTENANCE write resquest |
端口写请求 |
|
|
9 |
—— |
Reserve |
无 |
|
10 |
4’bxxxx |
DOORBELL |
门铃 |
|
11 |
4’bxxxx |
MESSAGE |
消息 |
|
12 |
—— |
Reserve |
无 |
|
13 |
4’b0000 |
RESPONSE no data |
不带有效数据的响应包 |
|
4’b1000 |
RESPONSE with data |
带有效数据的响应包 |
|
|
14~15 |
—— |
Reserve |
无 |
2 IO操作
2.1 IO操作的目的
先看看spec的说法:
The operations described in this section are used for I/O accesses to physical addresses in the target of the operation. Examples are accesses to non-coherent memory, ROM boot code, or to configuration registers that do not participate in any globally shared system memory protocol. These accesses may be of any specifiable size allowed by the system.
为了访问Target设备的物理内存,比如非连续的内存、ROM配置代码、非全局系统共享内存的配置寄存器(简单理解为寄存器即可);
2.2 IO操作的类型
Spec中列出的类型如下:

本文不对各个类型的包格式做详细说明,请参考Spec即可
2.3 请求包格式
RapidIO处理器发起一个请求包给目标器件(Target),目标器件收到这个请求包以后给一个响应包到处理器(前提是这个请求包需要目标器件的响应),比如存储器读操作。一个典型的请求包的格式如下图所示

图 2‑1 请求包格式,只需要关注logic layer

图 2‑2 header各个字段的含义
2.4 响应包格式
当一个RapidIO端点完成由另一个RapidIO端点发起的请求时,该端点就会发送一个响应事务。响应事务包总是以与请求事务包相同的方式被发送和路由。从广义上说,第12、13、14 和15类格式(Ftype=12表示的就是第12类格式)是响应类事务的格式。通常,第 12和14类是保留的,第15类由具体应用定义, 第13类才是主要的响应类事务。第13类包格式返回状态,数据(如果需要)和请求者的事务ID。带有“ERROR”状态或没有预期的数据裁荷的响应的RESPONSE包没有数据载荷。响应包使用第13类格式来响应除维护和无响应写之外的所有请求包。维护响应包响应维护请求。一个典型的响应包的格式如下图所示

图 2‑3 响应包格式 ,只关注逻辑层即可

图 2‑4 响应包中逻辑层各个字段的定义(Ftype是固定的,没有标出)

图 2‑5 Spec中描述的Ftype13对应的响应格式
3 Message操作
3.1 Message操作的目的
消息是一种编程模型,常用于分布式内存的计算系统,在这个模型中,计算单元只运行访问自己的本地内存,那么多个计算单元之间的数据交互就可以通过消息这样的安全传输机制,发送者无需访问接收方的物料内存,而是把消息字段固定发送到接收者的某块本地内存中即可,然后接收方通过中断通知本地逻辑将内存的消息字段读走进行处理。
Message passing is a programming model commonly used in distributed memory system machines. In this model, processing elements are only allowed to access memory that is local to themselves, and communication between processing elements is handled through specialized hardware manipulated through application or OS software. For two processors to communicate, the sending processor writes to a local message passing device that reads a section of the sender’s local memory and moves that information to the receiving processor’s local message passing device. The recipient message passing device then stores that information in local memory and informs the recipient processor that a message has arrived, usually via an interrupt. The recipient processor then accesses its local memory to read the message.
3.2 Message操作的类型
3.2.1 Data Message
一个消息源可以生成一个最多由16个独立包组成的4096字节长度的消息。实际上,会由不同长度的需求,这种机制也允许更小的包长。
A source may generate a single message operation of up to 16 individual packets containing as much as 256 data bytes per packet. A variety of data payload sizes exist, allowing a source to choose a smaller size data payload if needed for an application. RapidIO defines all data message packets as containing the same amount of data with the exception of the last one, which can contain a smaller data payload if desired. The packets are formatted with three fields: • One field specifies the size of the data payload for all except
第11类包为消息事务格式包。第11类包总有数据载荷,并且数据载荷长度总是双字(64-bits或8-bytes)长度的整数倍。没有规定子双字(sub-double-word)消息,如果需要的话,可以由软件管理子双字消息。



消息的响应事务也是由第13类包产生,与NREAD事务和NWRITE_R事务响应包不同的是,消息事务的响应包中的target_info字段占用了普通响应包中的target ID字段的位置,具体的响应包格式见下图

图 3‑1 消息响应
3.2.2 Doorbell Message
第10类包格式是门铃事务格式。它没有数据载荷。
The doorbell operation, consisting of the DOORBELL and RESPONSE transactions (typically a DONE response) as shown in Figure 3-1, is used by a processing element to send a very short message to another processing element through the interconnect fabric. The DOORBELL transaction contains the info field to hold information and does not have a data payload. This field is software-defined and can be used for any desired purpose

图 3‑2 门铃包格式
上图中Ftype字段固定为10,表示这是一个门铃事务,8位的Reserved字段应该置0,Source TID指的是请求方的事务ID, info(msb)表示的是发送信息的高8位,info(lsb)表示的是发送信息的低8位。如果信息是用数字表示的,而且长度大于8位,那么数据符合低地址存放高字节(big-endian)的格式。比特流中先到达的是高字节。门铃事务适合向处理器递送中断信息,在这种情况下,信息字段用来向接收者传递中断级别和目标信息,除此以外,还可以在处理器件间发送信号量。

4 总结
用Spec的图进行说明,我们还是只关注逻辑层即可,这个图只是为了方便我们区别各类传输格式。

RapidIO 逻辑层IO操作与Message操作的原理和区别的更多相关文章
- 小程序视图层(xx.xml)和逻辑层(xx.js)
整个系统分为两块视图层(View)和逻辑层(App Service) 框架可以让数据与视图非常简单地保持同步.当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新. 通过这个简单的例子来 ...
- C# .NET 逻辑层的框架设计
前述:在我的了解中,一个大项目的逻辑层是不可捉摸的,对于不同项目或场景都是不同的逻辑.先说明,我的想法是对逻辑层类结构,以及如何操作逻辑的方法进行抽象的封装.并且考虑将不同类,或者不同程序集中的逻辑方 ...
- 通过对DAO层的封装减少数据库操作的代码量
在学框架之前,写项目时总是要花大量的时间去写数据库操作层代码,这样会大大降低我们的效率,为了解决这个问题,我花了两天时间利用反射机制和泛型将DAO层进行了封装,这样我们只需要写sql语句,不需要再写 ...
- 八:SpringBoot-集成JPA持久层框架,简化数据库操作
SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例
转自:truemylife.linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例 基本概念: 磁盘.分区.物理卷[物理部分] 卷组[中间部分] 逻辑卷.文件系统[虚拟化后可控制部分] 磁 ...
- JAVA的IO操作:内存操作流
掌握内存操作流 输入和输出都是从文件中来的,当然,也可将输出的位置设置在内存上,这就需要ByteArrayInputStream和ByteArrayOutputStream ByteArrayInpu ...
- 【C#|.NET】从细节出发(三) 逻辑层事务和page object模式
一. 业务逻辑层的事务问题 如果你的程序分层清晰并且系统禁用复杂存储过程,那么在DA中的职责比较单一.程序的逻辑通过BLL调用各种不同模块的DA来实现数据操作.如果当需要不同模块在一个事务的时候,问题 ...
- 微信小程序-06-详解介绍.js 逻辑层文件-注册页面
上一篇介绍的是 app.js 逻辑层文件中注册程序,对应的每个分页面都会有的 js 文件中 page() 函数注册页面 微信小程序-06-详解介绍.js 逻辑层文件-注册页面 宝典官方文档: http ...
随机推荐
- 【C++】智能指针详解
转自:https://blog.csdn.net/flowing_wind/article/details/81301001 参考资料:<C++ Primer中文版 第五版>我们知道除了静 ...
- css3中什么时候用transition什么时候用animation实现动画
在css3中transition和animation都可以实现动画效果,但是我们什么时候用transition,什么时候用animation. 当有事件触发动画的时候我们就用transition.比如 ...
- HTML入门学习笔记(二)
第三章 文本 段落 p <p>毫不奇怪,p是最常用到的HTML元素之一</p> 作者联系信息 address address并不是用于标记邮政地址,而是定义与HTML页面或页面 ...
- H5打造属于自己的视频播放器(JS篇2)
回顾 算了不回顾了 直接搞起,打开JS1中写的bvd.js 播放视频 播放按钮隐藏 视频开始播放 当点击播放按钮的时候,播放按钮将会隐藏,播放视频,这个不难,在JS1中我们就已经实现.但我们改变一下思 ...
- 小程序wx.getRecorderManager()录音管理
小程序中提供了两种录音的API,wx.startRecord和wx.getRecorderManager(),前一个现在微信团队已经不再维护,所以在这里写一下新的录音管理,比之前要强大 1.小程序录音 ...
- Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
报错详细: Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preco ...
- tomcat 安装配置及问题解决
最近没写程序 刚想运行一个jsp程序发现tomcat出现一些问题,然后就重新装了程序,重新配置 总结经验就是不要怕报错,把错误复制下来,百度里面都有解决办法 要安装与自己jdk版本相匹配的tomcat ...
- vue中判断页面滚动开始和结束
参考链接:https://www.jianshu.com/p/adad39705ced 和 https://blog.csdn.net/weixin_44309374/article/deta ...
- js知识梳理5:关于函数的要点梳理(1)
写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,感谢它们的作者和译者.有发现什么问题的,欢迎留言指出 ...
- CTF大赛模拟-CFS三层内网漫游
CTF大赛模拟-CFS三层内网漫游 环境: 三台虚拟机,三个网络. target 1:192.168.161.178 ,192.168.52.132 (linux) target 2:192.168. ...