SRIO系列-基本概念及IP核使用

news2024/11/27 22:36:48

参考:串行RapidIO: 高性能嵌入式互连技术 | 德州仪器

           SRIO协议技术分析 - 知乎

           PG007

目录

一、SRIO介绍

1.1 概要

1.2 SRIO与传统互联方式的比较

1.3 串行SRIO标准

1.4 SRIO层次结构:

1.4.1 逻辑层

1.4.2 传输层协议

1.4.3 物理层

二、Xilinx SRIO系统架构

1、速度等级支持

2、架构

2.2.1 逻辑层接口

2.2.1.1 I/O Port

2.2.1.2 Message Port:

2.2.1.3 Maintenance port:

2.2.1.4 User-Defined Port:

3、BUFFER

4、Physical Layer Interface

5、 Clocking

 三、SRIO传输包格式

3.1 HELLO 包格式

3.2 HELLO传输报文的大小要求

四、SRIO事务类型


一、SRIO介绍

1.1 概要

在嵌入式系统应用领域,DSP,FPGA,PowerPC等嵌入式处理器的出现后,工程师将多种处理器组合,形成模块。模块通过背板相连,形成整机,实现更大的系统应用。新的嵌入式系统互联结构必须具备以下特点:

  1. 架构独立,不依赖具体的硬件和软件。
  2. 灵活的拓扑结构,不局限于PC架构的星状结构。
  3. 传输速率高,并向下兼容。
  4. 具有流控功能,错误校验及广播功能。
  5. 具有分层结构,后续功能扩展不影响其他层次

针对以上需求,2000年,存储领域的OEM和FPGA/DSP/交换结构芯片制造商成立了RapidIO Trade Association 组织。提供了一种针对嵌入式运用的低延时的、基于包交换与分发结构的新型总线结构,被命名为RapidIO,又被成为SRIO。

SRIO支持3C连接:Chip-to-Chip、Card-to-Card、Chassis-to-Chassis。

(1)从灵活性的角度来说,SRIO协议可支持嵌入式系统的星状、网状、环状、树状及菊花链等多种拓扑结构。
(2)从架构独立性的角度来讲,SRIO协议是由硬件实现,所以对现存的操作系统和运用软件是透明的。它支持读、写、流、原子操作等及消息传递机制,应用层软件简单。
(3)从速率、带宽性能及可裁剪上讲,SRIO1.3版支持1.25、2.5、3.125Gbps。采用8B/10B编码,带宽利用率高。

1.2 SRIO与传统互联方式的比较

随着高性能嵌入式系统的不断发展,芯片间及板间互连对带宽、成本、灵活性及可靠性的要求越来越高,传统的互连方式,如处理器总线、PCI总线和以太网,都难以满足新的需求 。

1.3 串行SRIO标准

RapidIO行业协会成立于2000年,其宗旨是为嵌入式系统开发可靠的,高性能,基于包交换的互连技术。RapidIO协议的简要发展历史是:

  1. 2001年初,最初的标准被发布
  2. 2002年6月,1.2版标准发布
  3. 2005年6月,1.3版标注发布

串行RapidIO是物理层采用串行差分模拟信号传输的RapidIO标准。SRIO 1.x 标准支持的信号速度为1.25GHz、2.5GHz、3.125GHz;正在制定的RapidIO 2.0标准将支持5GHz、6.25GHz.

目前,几乎所有的嵌入式系统芯片及设备供应商都加入了RapidIO行业协会。

1.4 SRIO层次结构:

RapidIO标准被定义为三个层:逻辑层、传输层和物理层。

逻辑层定义了总体协议和数据包格式。这是端点启动和完成事务所必需的信息。

传输层提供了数据包从端点移动到端点所需的路由信息。

物理层描述了设备级的接口细节,如数据包传输机制、流量控制、电气特性和低级错误管理。此分区提供了向逻辑规范中添加新的事务类型的灵活性,而不需要对传输或物理层规范进行修改。

像以太网一样,RapidIO也是基于包交换的互连技术。RapidIO包由包头、可选的载荷数据和16bits CRC校验组成。包头的长度因为包类型不同可能是十几到二十几个字节。每包的载荷数据长度不超过256字节,这有利于减少传输时延,简化硬件实现。下图包格式定义兼顾了包效率及组包/解包的简单性。RapidIO交换器件仅需解析前后16bits,以及源/目地器件ID,这简化了交换器件的实现。

1.4.1 逻辑层

逻辑层定义了操作协议和相应的包格式。RapidIO支持的逻辑层业务主要是:直接IO/DMA (Direct IO/Direct Memory Access)和消息传递(Message Passing)。

直接IO/DMA模式是最简单实用的传输方式,其前提是主设备知道被访问端的存储器映射。在这种模式下,主设备可以直接读写从设备的存储器。直接IO/DMA在被访问端的功能往往完全由硬件实现,所以被访问的器件不会有任何软件负担。

对上层应用来说,发起直接IO/DMA传输主要需提供以下参数:目地器件ID、数据长度、数据在目地器件存储器中的地址。

直接IO/DMA模式又可进一步分为以下几种传输格式:

  1. NWRITE: 写操作,不要求接收端响应。
  2. NWRITE_R: 带响应的NWRITE(NWRITE with Response),要求接收端响应。
  3. SWRITE:流写(Stream Write),数据长度必须是8字节的整数倍,不要求接收端响应。
  4. NREAD: 读操作。

SWRITE是最高效的传输格式;带响应的写操作或读操作效率则较低,一般只能达到不带响应的传输的效率的一半。
消息传递(Message Passing)模式则类似于以太网的传输方式,它不要求主设备知道被访问设备的存储器状况。数据在被访问设备中的位置则由邮箱号(类似于以太网协议中的端口号)确定。从设备根据接收到的包的邮箱号把数据保存到对应的缓冲区,这一过程往往无法完全由硬件实现,而需要软件协助,所以会带来一些软件负担。

下表比较了直接IO/DMA和消息传递模式。

1.4.2 传输层协议

RapidIO是基于包交换的互连技术,传输层定义了包交换的路由和寻址机制。

RapidIO网络主要由两种器件,终端器件(End Point)和交换器件(Switch)组成。终端器件是数据包的源或目的地,不同的终端器件以器件ID来区分。RapidIO支持8 bits 或 16 bits器件ID,因此一个RapidIO网络最多可容纳256或65536个终端器件。与以太网类似,RapidIO也支持广播或组播,每个终端器件除了独有的器件ID外,还可配置广播或组播ID。交换器件根据包的目地器件ID进行包的转发,交换器件本身没有器件ID。

RapidIO的互连拓扑结构非常灵活,除了通过交换器件外,两个终端器件也可直接互连

1.4.3 物理层

为了支持全双工传输,串行RapidIO收发信号是独立的,所以每一个串行RapidIO口由4根信号线组成。标准的1x/4x 串行RapidIO接口,支持四个口,共16根信号线。这四个口可被用作独立的接口传输不同的数据;也可合并在一起当作一个接口使用,以提高单一接口的吞吐量。

下图为德州仪器TMS320C6455 DSP 1x/4x 串行RapidIO接口框图

发送时,逻辑层和传输层将组好的包经过CRC编码后被送到物理层的FIFO中,“8b/10b编码”模块将每8bit数据编码成10bits数据,“并/串转换”模块将10bits并行数据转换成串行bits,发送模块把数字bit转换成差分交流耦合信号在信号线上发送出去。这里的8b/10编码的主要作用是:

  1. 保证信号有足够的跳变,以便于接收方恢复时钟。串行RapidIO没有专门的时钟信号线,接收端靠数据信号的跳变恢复时钟。所以需要把信号跳变少的8bits数据(如全0或全1)编码成有一定跳变的10bits数据。另外,也使得总体数据中0和1的个数均衡,以消除直流分量,保证交流耦合特性;
  2. 8b/10编码可扩大符号空间,以承载带内控制符号。10bits能表示1024个符号,其中256个表示有效的8bits数据,剩下的符号中的几十个被用作控制符号。控制符号可被用作包分隔符,响应标志,或用于链路初始化,链路控制等功能;
  3. 8b/10编码能实现一定的检错功能。1024个符号中,除了256个有效数据符号和几十个控制符号外,其它符号都是非法的,接收方收到非法符号则表示链路传输出错。

接收的过程则正好相反,首先接收方需要根据数据信号的跳变恢复出时钟,用这个时钟采样串行信号,将串行信号转换为10bits的并行信号,再按8b/10b编码规则解码得到8bits数据,最后做CRC校验并送上层处理。

数据被正确的接收时,接收端会发送一个ACK响应包给发送端;如果数据不正确(CRC错或非法的10bits符号),则会送NACK包,要求发送方重传。这种重传纠错的功能由物理层完成,而物理层功能往往由硬件实现,所以不需要软件干预。

二、Xilinx SRIO系统架构

1、速度等级支持

SRIO IP核支持1x 2x 4x  Line Width,单个Lane的速度支持1.25Gbps、2.5Gbps、3.125Gbps、5.0Gbps、6.25Gbps。(所以用到的应该是CPLL)

2、架构

 主要包括:逻辑层(LOG)、共享BUFFER(BUF)、PHY层(PHY)

LOG:只要定义传输的事务,以及具体的帧结构。

BUF:共享BUFFER,主要用来进行跨时钟域,因为逻辑层和PHY层之间的时钟是不同的。

PHY:主要用来进行数据编码、流控、字节对齐等功能。

2.2.1 逻辑层接口

主要包括:

用户接口:用户接口主要包括I/O接口和三个可选的接口 (消息接口、维护接口、用户定义接口)。主要看一下I/O Port。

2.2.1.1 I/O Port

I/O接口所支持的基本操作如下:

操作使用的事务描述
NREAD、RESPONSE从目标器件中读数据
NWRITE向目标器件写数据
带响应的写NWRITE_R向目标器件写数据,目标器件执行完之后回复响应
流写SWIRTE大量数据写操作
门铃
DOORBELL

I/O Port支持的报文格式:HELLO 报文、SRIO Stream报文

I/O支持两种接口格式:

 Condensed I/O:Condensed I/O就是一种压缩的数据接口。一个AXI-Stream通道用来传输所有的与发送相关的所有包类型,一个AXI-Stream通道用来接收所有的与接收相关的所有包类型。

Initiator/Target Port:一种标准的接口,将不同的事务传输进行分离。主要分为4个接口,如下图

ireq:用来发送本地生成的请求。

iresp:用来接收对端发送过来的响应。

treq:用来接收对端的请求。

tresp:用来向对端发送响应。

2.2.1.2 Message Port:

Message Port主要用来传输消息事务,但消息事务也可以使用I/O端口。消息传递端口是一个可选的接口(消息也可以组合到I/O端口上,并使用Vivado集成设计环境(IDE)设置将其视为写入事务)。一个单独的消息传递端口遵循启动器/目标样式。启动器/目标端口样式允许将针对远程设备的事务与针对本地端点的事务分离。

2.2.1.3 Maintenance port:

用来传输维护数据包。如果启用了维护端口,则它将使用AXI4-Lite接口。AXI4-Lite界面允许用户应用程序定位本地或远程配置空间。

2.2.1.4 User-Defined Port:

如果是用户自定义的数据,则应该使用User-Defined Port,用户自定义的数据包传输到其它的接口会被丢弃。用户定义的端口是一个可选的端口,它有两个AXI4-流通道,其中一个通道用于传输方向,另一个通道用于接收方向。用户定义的端口仅使用SRIO流格式。

3、BUFFER

Buffer支持8、16、32个数据包的深度,可以tx缓冲区和rx缓冲区。

TX缓冲区是一个存储和转发缓冲区,旨在为低的包到包的延迟来最大限度地提高流吞吐量。传输缓冲区必须保存每个包,直到它被链路伙伴设备成功接收为止,此时包被释放,为额外的包腾出空间。在缓冲区中积累多个未发送包的情况下,通常发生在流控制时,BUF根据类型和优先级对包进行重新排序,首先发出响应包,然后发出请求。BUF还可以在必要时处理跨时钟与处理。在生成IP核时,可以添加或删除跨时钟域逻辑。(在多lane时,跨时钟域逻辑是非常推荐的)

接收缓冲区作为FIFO,用于将数据存储和转发到LOG接收路径中。接收缓冲区还具有跨时钟域逻辑,它允许逻辑层/用户设计和PHY以不同的时钟速率运行。与传输缓冲区设计一样,这种逻辑被推荐用于多lane。

4、Physical Layer Interface

 物理层(PHY)处理链路训练(链路建立)、初始化和协议。在这个工作中包括插入CRC和确认标识符到输出的数据包。PHY还可以与串行收发器进行接口。

5、 Clocking

 PHY可以在两个时钟域上运行: phy_clk,这是主核心时钟,和gt_pcs_clk,这是用于串行收发器接口。gt_clk不由PHY使用,但由串行收发器接口使用。gt_pcs_clk是gt_clk速率的一半。作为一般规则,phy_clk等于(gt_clk *操作链路宽度)/4。所以对于一个2x的核,phy_clk的频率是gt_clk的一半。如果核心列车下降到1x模式,phy_clk必须切换到gt_clk速率的四分之一。串行收发器还需要一个使用收发器的的参考时钟(refclk)。当生成核心时,参考时钟频率被选择(可用选项取决于体系结构和线路速率。

时钟频率关系
phy_clkphy_clk = (gt_clk * link width)/4主要的核时钟
gt_pcs_clkgt_pcs_clk = 1/2 * gt_clk主要终于Serial Transceiver interface
refclk见下表用于Serial Transceiver interface
log_clklog_clk >=phy_clk
cfg_clkcfg_clk = log_clk配置寄存器接口时钟

 不同lane下的时钟关系:

 对于7系列FPGAs,使用MMCM从串行收发器(GT)参考时钟生成时钟。时钟方案的方框图如下:

 三、SRIO传输包格式

3.1 HELLO 包格式

为了简化数据包的构造,可以将用户接口端口配置为使用Header Encoded Logical Layer Optimized (HELLO) 格式。这种格式允许数据包类型的报头字段放置位置的标准化。它还将报头和数据分割成接口上单独的传输。这导致了更简单的控制逻辑,并允许数据对齐以传输边界,以简化数据管理。

字段位置
TID[63:56]包的事务ID。SRIO规范只允许在给定的时间有一个给定TID和Source/Destination ID的未完成的数据包
FTYPE[55:52]对于数据包的事务分类。HELLO报文所支持的FTYPE主要有2,5,6,A,B,D。根据生成IP核的选择,IP核可能只支持一个子集。
TTYPE[51:48]数据包的事务类型。仅对FTYPE为2、5、13的数据包定义一些其它的功能。
priority[46:45]数据包的优先级。请求数据包必须仅使用优先级0-2。响应包优先级应该是请求优先级+1
CRF[44]数据包的关键请求流标志。
size[43:36]数据有效负载大小,以字节为单位,减去1
Error(E)[35]除了响应数据包之外,其他都是保留的。当此位被设置表示数据包错误。
address[33:0]事务的字节地址。
info[31:16]只用于DDRBELL数据包
msglen-1[63:60]构成消息序列的数据包数;仅适用于消息消息。
msgseg-1[59:56]此数据包所表示的消息段;仅适用于MESSAGEs。保留用于单段消息。

mailbox

[9:4]事务处理目标的邮箱;仅适用于消息包。除了单段消息外,还保留了上面的四个位。
letter[1:0]仅为消息包使用的字母字段。指示邮箱中的一个插槽
S、E、R、xh、O、P[63:56]

S-开始。如果设置,则该包是正在传输的新PDU的第一段。

E-结束。如果设置了,表示这一包是PDU的最后一段。如果S和E都设置了,则代表这一次PUD传输只有这一个数据包

R-保留

xh-不支持

O-奇数。如果设置了,负载的数量有奇数了半字。

P-Pad。如果设置了,那么Pad用于填充到半字节的边界。

cos[43:36]服务分类
streamID[31:16]端到端流量流标识符。
length[15:0]PDU的长度

3.2 HELLO传输报文的大小要求

HELLO数据包中的size字段是传输中的字节数减去一(有效范围为0到255,对应真实大小为1到256字节)。size和address字段必须与相应的RapidIO数据包类型的有效size、address和wdptr字段相对应。RapidIO核不能把Size域中的非法值修正为实际RapidIO包中Size域的有效值,所以需要对HELLO格式包的Size域提供一个正确的值。由于AXI4-Stream协议中tdata信号为8个字节,也就是一个双字(Double Word),所以Size域的值需要分两种情况讨论:传输的数据量小于8字节和传输的数据量大于8字节。

传输的数据量小于8字节(Sub-DWORD Accesses):

       对于传输的数据量小于8字节的情况,address字段和size字段用来决定有效的字节位置(tkeep信号必须为0xff),但是仅仅能导致RapidIO包中rdsize/wrsize和wdptr为有效值的address和size值组合才是被允许的,下图是HELLO格式中address和size两个字段与有效字节位置的对应关系示意图(图中灰色部分为有效字节位置)

例如,对size=2,address=34’h1_1234_5675这两个组合来说,由于size=2,所以往address中写入的数据个数为3(size+1)个字节,而address的最低3位为5(3’b101),通过上图可知,有效字节的位置是第7、6、5三个字节。对于size和address[2:0]值的组合不在上图中的情况都是非法的,这是应该避免的,比如,size=2, address=34’h1_1234_5673这种组合就属于非法的组合。

传输的数据量大于8字节(Large Accesses):

       对于传输的数据量大于8字节,并且地址的起始字节偏移不为0的情况必须把数据分成多次进行传输,其中未对齐的小于8字节的段就可以通过上图中size和address的有效组合来确定有效字节的位置。另一种解决办法是,读操作的数据量大小可以被增加到下一个支持的大小,然后从对应的响应中剥离出必要的数据。

       因此,对于数据量为1个双字(8个字节)或更大的情况,address的最低3位必须为0,RapidIO手册给读写事务定义了范围从1到256个字节的可支持的数据量。请求事务的数据量如果大于一个双字(8个字节),那么数据量应该通过四舍五入到最接近的支持的值。读写事务有效的HELLO格式的数据量为:7,15,31,63,95(仅支持读事务),127,159(仅支持读事务),191(仅支持读事务),223(仅支持读事务)和255。

       对于写事务的数据量介于以上这些支持的数据量中间的情况,在通道的tlast信号为1之前应该给RapidIO核提供必要的数据量,仅仅提供的数据才能被发送。同理,用户的设计提供的数据可能少于期望的数据量,那么实际的数据量应该被写入,传输应该假设完成。

       RapidIO协议不支持传输的数据量大于256字节的情况,并且逻辑层(Logical)也不能把大于256字节的数据量分割为小的数据量进行发送。如果不满足这个要求可能会导致致命的链路错误,在这种错误情况下,链路可能会不断重传数据量大于256字节的包。

       HELLO格式数据的包头(Header)在用户接口的第一个有效时钟上,如果发送的事务携带数据负载,那么数据负载紧接着包头(Header)后面进行连续发送。包的Source ID和Destination ID放在tuser信号中并与包头(Header)一样,在第一个有效时钟下进行发送,发送完毕以后,tuser信号的数据被忽略。

       下图是携带有数据负载HELLO格式包在用户接口上传输的时序图,这个传输有4个双字(32个字节)的数据负载,加上包头,整个传输一共花费了5个时钟周期。用户只需要把想要发送的数据按照下图的时序图送入RapidIO核的AXI4-Stream接口,RapidIO核就能把它转化为标准的RapidiO串行物理层的包发出去从而完成一次事务的交互。

       下图是一种更复杂的传输示意图。首先,有两个背靠背(back-to-back)单周期包(包不带数据负载,仅包含一个包头)。包的边界通过拉高tlast信号进行指示。在单周期包传输完毕以后,主机等待了一个时钟周期才开始发送下一个包。在发送第三个包的过程中,主机(Master)和从机(Slave)分别通过拉低tvalid和tready信号一个时钟周期来暂停数据的发送,由于第三个包的数据负载为2个双字,所以传输第三个包一共消耗了3个有效时钟,加上2个无效的时钟周期,一共消耗了5个时钟周期。

四、SRIO事务类型

SRIO(Serial Rapid IO)事务(transaction)类型有SRIO包(packet)中的Ftype和Ttype决定,其中比较重要的是:

Nread(Ftype = 2,Ttype = 4),功能是读制定的地址;

NWRITE(Ftype = 5,Ttype = 4)表示往指定的地址写数据;

NWRITE_R(Ftype = 5,Ttype = 5),表示往指定的地址写数据,写完之后接收目标期间的响应,即所谓的带响应的写;

SWRITE(Ftype = 6,Ttype 保留),表示以流写方式写指定的地址,与NWRITE以及NWRITE_R相比,这种方式效率最高;

DOOREBELL(Ftype = 10,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

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

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

相关文章

Go: 理解 Sync.Pool 的设计

sync 包提供了一个强大且可复用的实例池,以减少 GC 压力。在使用该包之前,我们需要在使用池之前和之后对应用程序进行基准测试。这非常重要,因为如果不了解它内部的工作原理,可能会影响性能。 池的限制 我们来看一个例子以了解它…

ELK及ELFK排错

目录 一、ELK及ELFK排错思路 1.1filebeat侧排查 1.2logstash侧排查 1.3ES、kibana侧问题 一、ELK及ELFK排错思路 1.1filebeat侧排查 第一步:排查filebeat上的配置文件有没有写错,filebeat的配置文件是yml文件,一定要注意格式。 第二步…

【实测】记一次用windows11家庭中文版部署django+vue项目的踩坑之旅

整个过程下来,给我的感觉就和吃了翔一样难受,窒息的感觉,全程没少骂win11的设计者... 因为要调试一些只有在windows才会出现的测试平台bug,于是我耗重金购入了一台顶配windows笔记本。以下是配置: 配置还蛮高的对吧&am…

基于Springboot+Vue+Spring-Security+高德地图API的校园出行管理系统

1介绍 1.1编写目的 明确系统功能与操作流程,说明书提供了详细的系统功能描述和操作指南,使得用户能够了解如何通过系统申请请假、审批流程以及如何管理和监控请假记录等。 1.2文档范围 该文档的目的是解决整个项目系统中“做什么”的问题。对于开发技…

Vue结合ECharts与SpringBoot,实现高效数据库图表绘制

目录 Echart图表的优点 功能丰富 美观性 跨平台兼容性 易于使用 交互性强 扩展性强 社区支持 效果展示 使用Echart的步骤 假数据 1、安装 2、在vue中引入(全局引入) 3、在vue中的使用 4、模板代码放在哪个位置 5、完整的一个vue页面实例…

如何为Postgres数据库设置安全的访问控制和权限管理

文章目录 解决方案1. 使用角色和权限管理2. 配置认证方法3. 使用网络访问控制4. 定期审查和更新权限 示例代码1. 创建角色并分配权限2. 配置密码认证3. 配置网络访问控制 总结 PostgreSQL是一个功能强大的开源关系型数据库系统,提供了丰富的权限和访问控制机制&…

移动端双验证码登录实现

说明:本文介绍如何用图形验证码短信验证码实现移动端登录思路; 分析 通过手机号图形验证码手机验证码实现登录的时序图如下: 说明: (1)用户进入登录界面,出现图形验证码,可点击图形…

Jsp 中的getServletContext全局数据共享

servletContext作用于不同用户之上 1. 一个用户将数据保存到了servletContext中, // getcontext的servlet程序 Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context this.get…

upload-labs靶场详解

靶场环境 下载链接:https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 进入关卡后页面呈现: Pass-01(前端绕过) 我们先尝试上传一个web.…

如何通过Postgres的日志进行故障排查?

文章目录 一、配置日志记录二、查看和分析日志三、使用日志进行故障排查的示例四、总结 在进行数据库管理和维护时,日志分析是一项至关重要的技能。PostgreSQL的日志记录功能可以帮助我们追踪数据库的运行状态,定位问题,以及优化性能。下面&a…

7-6 铺满方格

有一个1n的长方形,由边长为1的n个方格构成,例如,当n=3时为13的方格长方形如下图所示。求用11、12、13的骨牌铺满方格的方案总数。 输入格式: 测试数据有多组,处理到文件尾。每组测试输入一个整数n(1≤n≤50)。 输出格式: 对于每组测试,输出一行,包含一个整数,表示用…

科学计算与人工智能

人工智能的“科技幻觉” “美丽、白雪皑皑的东京市熙熙攘攘。镜头追随着人们,一同欣赏美丽的雪景和热闹的摊位,感受雪花纷飞,樱花起舞。”(翻译自英文Prompt) 这如同现实场景的画面,并非出自摄影师的镜头&…

链表OJ - 6(链表分割)

题目描述(来源) 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 思路 创建两个链表&#xff0c…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《含状态耦合约束的分布式船舶储能系统两层能量管理方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

24年云南三支一扶报名时间线报名流程

一、报名阶段 1、阅读公告:4月17日起 2、提交报考申请:4月22日09:00至4月25日18:00 3、审核报名资格:4月22日09:00至4月26日18:00 4、公告有效招募岗位:4月28日 5、所报岗位被取消改报岗位:4月29日09:00至16:00 6、打印…

MySql 表中的id突然变很大,如何给id重新排序

目录 一、场景 二、解决方法 一、场景 我们在开发过程中,难免遇到id突然增大的情况。 由于id突然增大很多,我们重新增加数据时候id会默认加1 那么如何让id 重新从1按顺序排序呢 二、解决方法 点击编辑表,然后新建一个字段id2,将…

使用lambda表达式Collectors.toMap 遇到的报错,带有源码分析

概述 正常hashMap中的key和value都允许为null,但是在list转map中,使用lambda表达式要求key和value都不能为null。这很反常识 起因 本身上游返回contentId和traceId 内容id和跟踪id,但是项目人员变动修改了接口没有给traceId导致 代码 pu…

SpringBoot集成RockerMQ

1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </dependency>2.配置服务器地址 #Rocketmq配置 rocketmq.name-server192…

最新免费 ChatGPT、GPTs、AI换脸(Suno-AI音乐生成大模型)

&#x1f525;博客主页&#xff1a;只恨天高 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容…

【配电网故障定位】基于二进制混合灰狼粒子群算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#79】

文章目录 【获取资源请见文章第6节&#xff1a;资源获取】1. 配电网故障定位2. 二进制混合灰狼粒子群算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络…