SRIO RapidIO 笔记

RapidIO 基础与底层包类型

1.RapidIO 是基于数据包交换的互联体系结构

类似 Mac 层使用以太网的计算机网络(IEEE802.3)?

首先 RapidIO 是一个互联协议(类似计算机网络 IEEE802.3),包含硬件与软件的定义,使用基于数据帧的传输。

RapidIO 使用 差分线 进行数据交换

2. RapidIO 主要用于嵌入式系统内部互联

类比以太网,一块板子上的两个处理器通过以太网进行链接?(芯片与芯片之间、板到板之间)

3. RapidIO 采用三层体系架构

  • 逻辑层:最上层,定义不同的类型的数据包帧格式。(这是软件?RapidIO 不仅包括硬件规范,还包括软件规范)
  • 传输层:中间层,定义路由信息,比如当前数据包的源地址,与目的地址。(这也是软件?地址如何确定?)
  • 物理层:最底层,提供电器特性,流量控制,错误管理等硬件相关的信息。(硬件?)

那么类比计算机网络:数据接收时。Mac 层触发数据收中断,把数据传递给 ARP/IP 等传输层软件协议栈。

RapidIO 数据接收时,物理层触发数据收中断,并把数据传递给传输层协议栈,进行路由信息分析,如果目的地址是本机,那么再传递给逻辑层协议栈,进行数据帧解析,并响应。

4. RapidIO 分为并行 RapidIO 与串行 RapidIO(SRIO)

并行 RapidIO 与 SRIO 的区别只存在于物理层不同。传输层与逻辑层等软件相关的处理一致。

5. RapidIO 数据传输使用请求与响应机制

也就是数据包分为请求数据包,与响应数据包,当目的地址是本机时,需要返回响应数据包,请求数据处理与响应涉及到协议栈的实现.(数据响应能否纯靠硬件?物理层的响应应该可以?)

6. RapidIO 端口一般不会直连,而是通过交换结构(fabric)连接

所以其实也可以直连,类似以太网,不过一般都是使用路由器组网。

7. RapidIO 物理层实现控制符号,用于对数据包的在物理层的应答,流量控制,维护

那么控制符号其实是一个纯硬件的实现,软件不需要关心,比如一个接收到 RapidIO 数据包的终端,应该向发送方返回一个控制符号,用于包确认,表示收到数据包。

控制符号只用于当前数据包的收发双方。

8. RapidIO 数据包格式

RapidIO 分为请求包与响应包.

请求包格式如下:

SAckIDrsrvPrioTTFtypeDest AddrSrc AddrTransactionSizeSrc TID(dev offset addr)(payload)CRC
1b3b4b2b2b4b8/16b8/16b4b4b8b(32/48/64 b)(8-256B)16b

请求包中各位域作用如下:

位域长度描述
S1bit指示当前包是一个数据包(S=0),还是一个控制符号(S=1)
AckID3bit当 S=1,此位域用于控制符号,表示某一个包已发送或接收。
rsrv4bit保留
Prio2bit包优先级,用于流量控制
TT2bit表示传输地址的机制类型(器件地址长度: 8bit/16bit)
Ftype4bit与 Transaction 位域共同确定事务类型
Dest Addr8/16bit目的器件地址
Src Addr8/16bit源器件地址
Tansaction4bit与 Ftype 位域共同确定当前包事务类型(用于确定不同的帧类型与帧格式
Size4bit编码后事务长度?(不同的帧类型对该位域的解释不同
Src TID8bit事务 ID,逻辑层软件维护的当前事务 ID(不同的帧类型对该位域的解释不同
device offset address32/48/64 bit器件偏移地址,对于存储器访问事务,跟随在 SRC TID 之后的必须是器件偏移地址。(不同的帧类型对该位域的解释不同
payload1-256Byte有效负载,对于写事务,必须存在 payload
CRC16bit包以16位循环冗余校验码结束

响应包格式如下:

SAckIDrsrvPrioTTFtypeDest AddrSrc AddrTransactionStatusTarget TID(Payload)CRC
1b3b4b2b2b4b8/16b8/16b4b4b8b(8-256B)16b

响应包各位域作用如下:

位域长度描述
S1bit指示当前包是一个数据包(S=0),还是一个控制符号(S=1)
AckID3bit当 S=1,此位域用于控制符号,表示某一个包已接收。
rsrv4bit保留
Prio2bit包优先级,用于流量控制
TT2bit表示传输地址的机制类型(器件地址长度: 8bit/16bit)
Ftype4bit与 Transaction 位域共同确定事务类型
Dest Addr8/16bit目的器件地址
Src Addr8/16bit源器件地址
Tansaction4bit与 Ftype 位域共同确定当前包事务类型
Status4bit表示请求事务是否成功完成
Target TID8bit事务 ID,逻辑层软件维护的响应事务 ID, 与请求包的 Src TID 一致
payload8-256Byte有效负载,对于读请求事务,必须存在 payload
CRC16bit包以16位循环冗余校验码结束

9. 每一个数据包(S=0)都称为一个具体的事务包

事务包的事务类型通过 Ftype 与 Ttype(transaction) 两个位域共同确定,不同的位域值确定的事务包类型与功能如下表(不同的事务包,也许有不同的帧格式):

Ftype(Format Type)Ttype(Transaction Type)事务包类型描述
0x0/0x1reservereservereserve
0x20b0100NREAD读指定的地址
0b1100ATOMIC Increment先往指定的地址传递数据,再把传递的数据加1
0b1101ATOMIC decrement先往指定的地址中传递数据,再把传递的数据减1
0b1110ATOMIC set把指定地址中的数据的每个位置1
0b1111ATOMIC clear把指定地址中的数据清0
0x3/0x4reservereservereserve
0x50b0100NWRITE往指定的地址写数据
0b1101NWRITE_R往指定的地址写数据,写完成之后等待接收目标器件的响应
0b1101ATOMIC test/swap对指定地址中的数据测试并交换
0x60bxxxxstream write以数据流的形式写指定的地址,比 NWRITE / NWRITE_R 效率更高
0x7reservereservereserve
0x80b0000MAINTENANCE read req专用寄存器维护操作读请求
0b0001MAINTENANCE write req专用寄存器维护操作写请求
0b0010MAINTENANCE read resp专用寄存器维护操作读响应
0b0011MAINTENANCE write resp专用寄存器维护操作写响应
0b0100MAINTENANCE write req端口写请求
0x9reservereservereserve
0xA0bxxxxDOORBELL门铃
0xB0bxxxxMESSAGE消息
0xCreservereservereserve
0xD0b0000RESP no data不带负载的响应
0b1000RESP with data带负载的响应
0xE / 0xFreservereservereserve

根据上表,可知,rapidIO 共有三种类型的事务类型:

  1. 存储区读/写访问, 使用 Ftype = 0x2/0x5/0x6 实现;
  2. rapidIO 专有寄存器访问,使用 Ftype = 0x8 实现;
  3. 门铃、消息数据中断传输,使用 Ftype = 0xA/0xB 实现。

(除了第二类事务-专有寄存器访问,其他事务的响应通过 Ftype = 0xD 实现)

10. RapidIO 使用消息邮箱与门铃两个事务实现消息

传递

消息邮箱与门铃对应两种不同的事务,即不同的事务帧格式。

11. 操作(Opeations)由不同的事务包组成

操作分为:

  1. I/O 逻辑操作;
  2. 维护操作;
  3. 消息操作。

I/O 逻辑操作用于 RapidIO 存储空间的基本读写,可通过请求和响应事务来完成。

12. I/O 逻辑操作

I/O 逻辑操作主要包括下列几种,都是操作目标器件的存储器空间:

操作使用的事务包描述
NREAD, RESP从目标器件中的读数据,存在负载响应
NWRITE往目标器件中写数据,无响应
有响应写NWRITE_R, RESP往目标器件中写数据,并接收响应
流写SWRITE数据流形式写数据,无响应
ATOMICATOMIC, RESP原子操作,读-修改-写

由上表也可以看出,操作由一个或多个事务包完成。

13 I/O 操作请求事务包格式

I/O操作请求事务包(读、写、ATOMIC)通用格式如下:

SAckIDrsrvPrioTTFtypeDest AddrSrc AddrTransactionWrSize/RdSizeSrc TID(Extended Addr)AddressWdptrXamsbs(payload)CRC
1b3b4b2b2b4b8/16b8/16b4b4b8b16/32b29b1b2b(8-256B)16b

物理层与传输层的位域定义与之前讲解的一致,只描述逻辑层的位域定义:

位域长度描述
Ftype4bitFormat Type, 与 Transaction 位域共同确定当前事务包类型
Transaction(Ttype)4bit事务类型,与 Ftype 共同确定当前事务包类型
WrSize/RdSize4bit读、写事务包长度,这个字段配合 wdptr 位域使用
Src TID8bit事务 ID
Extended Addr16/32bit可选的扩展地址,可再扩展16位或32位
Address29bit29 bit 的物理地址(每一个单元,表示 8 字节)
Wdptr1bit字指针,配合 WrSize/RdSize 字段指明数据的大小以及对齐方式?(由于负载最小 8 字节,0表示读取的是低4字节,1表示读取高4字节)
Xamsbs2bit扩展地址最高位,物理地址进一步扩展2位
payload8-256B数据负载

14. 响应事务包格式

通用的响应事务包格式如下:

SAckIDrsrvPrioTTFtypeDest AddrSrc AddrTransactionStatusTarget TID(Payload)CRC
1b3b4b2b2b4b8/16b8/16b4b4b8b(8-256B)16b

物理层与传输层不再赘述,逻辑层各位域值的描述如下:

位域描述
Ftype0b11010xD 类事务,表示响应
Tansaction0b0000不携带数据的响应
0b1000携带数据的响应
其他reserve
Status0b0000DONE 状态,表示请求事务正确处理
0b0111ERROR状态,表示请求事务出现粗偶
Target TID事务 ID,逻辑层软件维护的响应事务 ID, 与请求包的 Src TID 一致
payload有效负载,对于携带数据的响应,必须存在。

15.流写请求事务包

流写请求事务包不存在 Transaction(Ttype)WrSize/RdSizeSrc TID 这三个位域。

流写操作无响应事务包。

16.维护操作及事务包结构

维护操作用于访问 RapidIO 能力寄存器命令和状态寄存器本地定义的寄存器以及数据结构

维护操作的请求与响应事务包都是用第 8 (Ftype = 0x8)类事务包。

维护操作请求事务包的逻辑层帧结构如下(物理层与传输层不再赘述):

FtypeTtypeWrSize/RdSizeSrc TIDHopcountConfig OffsetWdptrreservepayload
4b4b4b8b8b21b1b2b8-256B

维护操作响应事务包的逻辑层帧结构如下(物理层与传输层不再赘述):

FtypeTtypeStatusTarget TIDHopcountreservepayload
4b4b4b8b8b24b8-256B

各位域的值描述如下:

位域描述
Ftype0b10000x8, 表示这个一个维护操作事务包(请求或响应)
Ttype0b0000表示这是一个维护操作读请求
0b0001表示这是一个维护操作写请求
0b0010表示这是一个维护操作读响应
0b0011表示这是一个维护操作写响应
0b0100表示这是一个维护写端口请求
WrSize/RdSize表示负载最大数据量
Hopcount跳数其实是传输层位域,用于确定交换器件,供寻址路由机制使用,当事务包每一次被交换机转发,那么 HopCount 减 1,如果为0, 那么维护操作的目标器件就是当前交换机
Config Offset用于读写 CAR/CSR 寄存器的双字节偏移量
Src TID请求事务包 ID
Target TID响应事务包 ID
Status0b0000DONE 状态,表明请求包事务成功完成
0b0111ERROR 状态,表明检查到不可恢复的错误
0b1100-0b1111用户自定义

17.消息操作及事务包格式

RapidIO 消息传递逻辑规范定义了两种不同的包格式用于消息事务:

  1. 第10(Ftype = 0xA)类事务包格式用于发送非常短的16位数据负载,第10(0xA)类事务包也称为门铃(DOORBELL)事务;
  2. 第11(Ftype = 0xB)类事务包用于传递多事务消息,一次消息最多可发送 4096 字节有效负载。

18.门铃事务(DOORBELL)

门铃事务是第10 (Ftype = 0xA)类事务包,没有数据负载,逻辑层帧格式如下(物理层与传输层不在赘述):

FtypeReserverSrc TIDinfo(MSB)info(LSB)
4b8b8b8b8b

各位域描述如下:

位域描述
Ftype0b1010第10(0xA)类事务包,表示这是一个门铃事务
Reserver0b0000 0000包含通用请求包的 Ttype 与 Size 位域,reserve
Src TID门铃事务ID
info(MSB)发送信息的高8位(高字节)
info(LSB)发送信息的低8位(低字节)

门铃事务存在响应事务包(Ftype = 0xD),通常是 DONE.

19. 消息事务及包格式

第11(Ftype = 0xB)类事务包为消息事务包,这一类包总有数据负载,并且数据负载是双字对齐。

消息事务包的逻辑层帧格式如下(物理层与传输层不在赘述):

FtypeMsgLenSsizeLetterMboxMsgSeg/Xmboxpayload
4b4b4b2b2b4b8-256B

各位域描述如下:

位域描述
Ftype0b1011第11类事务包,表示这是一个 Message 事务
MsgLen消息长度,表示组成当前消息的事务包总数,0表示单包消息,0b1111 表示消息由16个消息事务包组成
Ssize标准消息包数大小,用于告诉接收者,除了消息的最后一个事务包之外,其他消息事务包的负载大小。
0b1001除了消息的最后一个消息事务包,其他消息事务包负载长度8字节
0b1010除了消息的最后一个消息事务包,其他消息事务包负载长度16字节
0b1011除了消息的最后一个消息事务包,其他消息事务包负载长度32字节
0b1100除了消息的最后一个消息事务包,其他消息事务包负载长度64字节
0b1101除了消息的最后一个消息事务包,其他消息事务包负载长度128字节
0b1110除了消息的最后一个消息事务包,其他消息事务包负载长度256字节
Letter该位域用于识别信箱(MailBox)中的一个槽(SLOT,窗口),(接收器件的每一个信箱有 4 个BANK?)
Mbox该位域指示消息的目的信箱,接收器件最多4个信箱(每个信箱最多可接收 16 个消息事务包)
MsgSeg消息分段(message segment), 该字段表明当前消息事务包属于消息的第几个包,0表示第1包消息,0b1111 表示第16个消息事务包
Xmbox该位域与 MsgSeg 使用相同的字段,只用于单包消息,用于指示目标信箱的高4位(即把多包信箱拆分为单包消息信箱,最多 64 个信箱)

可以注意到: 消息事务包没有 Src TID.

尽管消息事务包存在 LetterMboxMsgSeg、与 Xmbox 这几个位域,但是这些位域在逻辑上只占用 8 位空间,即可以用来标识 256 个不同的消息事务包。

每一个消息事务包在接收器件上都有唯一的存储空间:

消息存储地址 = 信箱 Mbox 地址 + 消息分段 * 标准长度;

20.消息事务包的响应

消息的响应事务包也是由第13(Ftype = 0xD)类包产生,不过响应包不在包含 Target TID 位域,而是解释为 Target Info 位域,响应包格式如下(逻辑层格式):

FtypeTtypeStatusTarget InfoPayload
4b4b4b8b8-256B

Target Info 位域由 LetterMboxMsgSeg 组成(每一个消息事务包都需要一个响应)。

RapidIO 系统寻址

1.RapidIO 系统使用器件 ID 唯一地识别组成一个 RapidIO 系统器件的所有器件

器件 ID 分为 8位 ID 与16 位 ID。

器件 ID 分别对应传输层的三个位域:

位域长度描述
TT2bit表示传输地址的机制类型(器件地址长度: 8bit/16bit)
Dest Addr8/16bit目的器件地址
Src Addr8/16bit源器件地址

器件 ID 并不固定,由枚举主机分配,交换结构 switch 通过器件 ID 实现路由。

2.交换结构 switch 有一张路由表,保存器件 ID 与端口信息

RapidIO 系统中的 switch 不需要器件 ID,但是 RapidIO 的端点器件必须分配器件 ID,

3. 使用维护事务包访问交换机

由于交换机没有器件 ID,那么当系统枚举时,我们通过维护事务包中的 hop_count 位域来访问目标交换机(配置路由表),其他类型的事务包无法访问交换机。

RapidIO 启动与初始化

可以将某一片地址空间映射为与某一 rapidIO 器件相关,类似 pci 设备映射。

我们必须编写驱动软件来处理 rapidIO 的消息事务,这与 pci 不同?

rapidIO 驱动需要分配端点器件 ID,配置交换机路由表,建立存储器空间与 RapidIO 端点之间的映射。

1. RapidIO 系统初始化过程概述

初始化过程概述如下:

  • host cpu 中的 RapidIO 驱动进行枚举;
  • host 配置路由表,建立最佳路径路由;
  • host 映射存储空间给每一个 RapidIO 端点;

RapidIO 系统中存在三类器件:

  1. 主机器件:host cpu 端点器件,初始化时器件ID配置为 0x00;
  2. 引导代码器件(可以不考虑):保存 cpu 系统镜像的 rapidIO 端点器件, 初始化时器件 ID 配置为 0xFE;
  3. 既非主机器件也非引导代码器件:初始化时器件 ID 配置为 0xFF;

RapidIO 驱动初始化执行完成之后,每一个器件都会拥有唯一的器件 ID 值。

RapidIO 总线硬件的初始化,软件不需要关心,由硬件完成(类似 PCI 总线)。

2. 枚举

枚举过程中,RapidIO 驱动会为所有 RapidIO 端点器件分配唯一的器件 ID。

对于每一个 RapidIO 网络系统,存在一个限制:仅有两个主机可以枚举一个网络。(实际上只有一个主机执行枚举,由系统设计之初确定)

枚举的主机在执行枚举之前,需要将自身的器件 ID 设置为唯一值,通过写**主机基本器件 ID 锁定 CSR** 实现,可设置为 0x00/0x01, 0x01 的 优先级更高。

枚举的主机在执行枚举之前,需要置 1 主机使能位,通过写**端口通用控制 CSR** 实现,交换机没有主机使能位。

枚举完成后,已建立系统路由互连信息,可能需要继续执行地址空间映射操作。

3. 地址空间映射

RapidIO 端点器件(host 主机)可以把自身的可寻址空间,映射为某一个目标 RapidIO 器件的存储区。

通过查询目标器件(需要映射的 RapidIO 端点器件)的**处理部件特征 CAR, 可以获得目标器件支持的地址长度,随后通过写处理部件逻辑层控制 CSR** 来选择实际的长度。

目标 RapidIO 器件的存储区与 host 自身可寻址空间地址映射完成之后,即可通过地址转换逻辑将可寻址空间与端点器件 ID联系在一起。即对某一地址的访问,会转换为对某一器件 ID 端点的存储区的访问。

4. RapidIO HAL 库?(官网上有吧?)

RapidIO 官网提供的 HAL 库用于支持统一的 RapidIO 应用编程接口,并消除应用软件与底层硬件寄存器的直接交互

专有器件函数需要根据硬件差异进行适配。为 HAL 库的底层接口

5. RapidIO HAL 库提供的 API

API 几乎都至少包括了三个参数:

  1. localport : 本地 rapidIO 端口,表示从当前端口发出或接收事务;
  2. destID : 目标器件 ID,目标 RapidIO 端点的 8/16 位器件 ID,32位宽;
  3. hopcount : 当维护事务的目标器件是交换机时,使用 hopcount 来确定目标交换机,事务每由交换机转发一次,该位域减1,减至0时,表示到达寻址的目标交换机。

6. HAL 函数

HAL 库的目标是提供统一的软件接口来配置本地和远程端点器件的寄存器。

HAL 库使用统一的寻址逻辑来配置本地与远程端点寄存器:

  • 当配置本地端点寄存器时:destID = 0xFFFFFFFF, hopcount = 0x0(hopcount = 0xffff?); 不同的本地端口使用 localport 来区分。
  • 配置远程端点器件时:destID 设置为目标器件 ID,hopcount = 0xFF。
  • 配置交换机时:hopcount 设置为目标跳数,destID 设置为 0xFFFFFFFF?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

# Python IDE的介绍和选择 --- 《跟着小王学Python》

Python IDE的介绍和选择 — 《跟着小王学Python》 《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的核心概念…

柯桥生活英语口语学习“面坨了”英语怎么表达?

“面坨了”英语怎么表达? 要想搞清楚这个表达,首先,我们要搞明白“坨”是啥意思? 所谓“坨”就是指,面条在汤里泡太久,从而变涨,黏糊凝固在一起的状态。 有一个词汇,很适合用来表达这…

ZeroSSL HTTPS SSL证书ACMESSL申请3个月证书

目录 一、引言 二、准备工作 三、申请 SSL 证书 四、证书选型 五、ssl重要性 一、引言 目前免费 Lets Encrypt、ZeroSSL、BuyPass、Google Public CA SSL 证书,一般免费3-6个月。从申请难易程度分析,zerossl申请相对快速和简单,亲测速度非…

Java连接MySQL(测试build path功能)

Java连接MySQL(测试build path功能) 实验说明下载MySQL的驱动jar包连接测试的Java代码 实验说明 要测试该情况,需要先安装好MySQL的环境,其实也可以通过测试最后提示的输出来判断build path是否成功,因为如果不成功会直…

第四节-OSI-网络层

数据链路层:二层--MAC地址精确定位 Ethernet 2: 报头长度:18B 携带的参数:D MAC /S MAC/TYPE(标识上层协议)/FCS 802.3 报头长度:26B 携带的参数:D MAC/S MAC/LLC(标识上层协议)/SNAP(标识…

labview实现功能性全局变量

在日常的项目中,笔者最长使用的就是全局变量,这样用起来不仅省心省力,而且传值也很方便,没有什么阻碍,想要传什么数据一根线拉过去就可以了。后面才知道如果一直使用全局变量会导致读写卡死的状态,而且还有…

网络安全之SQLMAP _DNS注入配置方法

网上针对sqlmap进行dns注入的相关文章太少,只是简单介绍了下–dns-domain参数,相关的实战文章要么就模糊或者一笔带过,。然后参考网上的方法重新整理了一遍,简单理解。 需要准备的东西,sqlmap、windows盲注一个、两个…

pycharm快速更换虚拟环境

目录 1. 选择Conda 虚拟环境2. 创建环境3. 直接选择现有虚拟环境 1. 选择Conda 虚拟环境 2. 创建环境 3. 直接选择现有虚拟环境

联想“喜新厌旧”

科技新知 原创作者丨萧维 编辑丨蕨影 十月份,联想很忙。 先是2024联想科技创新大会15日在美国华盛顿州西雅图举行,联想大秀了一下自己在人工智能领域的创新产品、技术和解决方案,英特尔、AMD、英伟达三巨头更同时为其站台;后是与…

[白月黑羽]关于仿写类postman功能软件题目的解答

原题: 答: python文件如下 from PySide6.QtWidgets import QApplication, QMessageBox,QTableWidgetItem,QHeaderView,QWidget,QTableWidget from PySide6.QtCore import QEvent,QObject from PySide6.QtUiTools import QUiLoader import time import …

零基础Java第十八期:图书管理系统

目录 一、package book 1.1. Book 1.2. BookList 二、package user 2.1. User 2.2. NormalUser与AdminiUser 三、Main 四、NormalUser与AdminiUser的菜单界面 五、package operation 5.1. 设计管理员菜单 六、业务逻辑 七、完整代码 今天博主来带大家实现一个…

系统架构师考试极限18天备考复盘(2024年11月)

前言 写下这篇复盘笔记的时候还没有出成绩。目前泽崽还是在读研究生,在经过 大概2周多个全日 的极限备考之后,于11月10日参加了软考的系统架构师考试(高级)。目前对于“基础知识-案例分析-论文”的估分预期大概是:55-…

Unity肢体控制(关节控制)

前面的基础搭建网上自己搜,我这个任务模型网上也有,可以去官网看看更多模型,这里只讲述有模型如何驱动肢体的操作方式 第一步:创建脚本 第二步:创建Rig Builder 建空容器 加部件(Rig),加了之后…

二叉树遍历的非递归实现和复杂度分析

一,用栈实现二叉树先序遍历 1,原理 我用自己的口水话解释一下:准备一个栈,从根节点开始,先判断栈是否为空,如果否,就弹出一个元素,对弹出元素进行自定义处理,再将它的左…

redis序列化数据查询

可以看到是HashMap,那么是序列化的数据 那么我们来获得反序列化数据 import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import redis.clients.jedis.Jedis;public class RedisDeserializeDemo {public static…

球差控制操作数【ZEMAX操作数】

在光学设计中,对于球差的控制是必要的,那么在zemax中如何控制球差的大小,理解球差,以及使用相应操作数控制球差; 在这篇中主要写如何使用zemax操作数去控制或者消除球差,对球差进行简单的描述,之…

学习threejs,使用TWEEN插件实现动画

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.PLYLoader PLY模型加…

前端 JS 实用操作总结

目录 1、重构解构 1、数组解构 2、对象解构 3、...展开 2、箭头函数 1、简写 2、this指向 3、没有arguments 4、普通函数this的指向 3、数组实用方法 1、map和filter 2、find 3、reduce 1、重构解构 1、数组解构 const arr ["唐僧", "孙悟空&quo…

从0开始学习--Day26--聚类算法

无监督学习(Unsupervised learning and introduction) 监督学习问题的样本 无监督学习样本 如图,可以看到两者的区别在于无监督学习的样本是没有标签的,换言之就是无监督学习不会赋予主观上的判断,需要算法自己去探寻区别,第二张…

矩阵数组转置

#include<stdio.h> int main() {int arr1[3][4];//三行四列变成四行三列int arr2[4][3];for(int i0;i<3;i)//三行{for(int j0;j<4;j)//四列{scanf("%d",&arr1[i][j]);//录入}}for(int i0;i<3;i)//转置{for(int j0;j<4;j){arr2[j][i]arr1[i][j]…