通信接口——时钟和信号

前言

所有接口只要抓住三个核心点就能分清:时钟同步和异步,时钟的来源,信号的传输方向。

一、时钟同步和异步

接口之间的交互方式存在多种形式,如果按照是否有公共时钟CLK的参与,可以分为同步传输和异步传输。

同步:两个或两个以上随时间变化的量在变化过程中保持着一定的相对关系。异步:双方不需要共同的时钟,接收方不知道发送方什么时候发送。以特定的信号来提示对方开始接收信息。

同步和异步都是针对时钟来说的,同步意味着信号需要参考时钟信号,而异步信号不需要参考CLK信号。

(1) 异步传输

异步传输是指将比特串划分为一个个小组发送,这些小组可以在任何时间发送。异步传输也叫做起止式通信。

    异步传输最大的特点就是在传输每帧数据时,每个字符代码前后的都有起始位和停止位标识字符的开始和结束。以常见的UART异步通信数据格式为例。

    在数据开始发送时,有严格起始信号,停止信号。在某些场合还会增加标志位,奇偶校验位。因此,异步通讯的特点:通信方式简单,效率低,速率低;常见的应用场合:UART CAN总线,误码率高及对数据速率要求低的线路。

(2) 同步传输

    同步传输是指每一个数据位都是用相同的时间间隔发送,而接收时也必须以发送时的相同时间间隔接收每一位信息。

    不论是否传输数据,接收单元与发送单元都必须在每一个二进制位上保持同步。发送方和接收方的时钟是相同的,一般在同步字符后,传送大量数据。

    同步信号在发送和接收数据时,需要严格参考时钟信号。因此,在同步信号传输中,如果时钟信号存在错乱,传输的数据也将受到干扰。但是这种传输方式因为省去了固定的字节消耗,效率高,速度快,速度取决于时钟频率。在工程中应用较多的是I2C,SPI都属于同步传输的方式。

(3) 同步和异步的差异

差异点异步传输同步传输
公共时钟不需要需要
传输方式字符比特
传输单位字符
传输速度
传输效率
时序要求
应用场合低速接口高速接口
典型接口UART/RS232I2C/SPI

二、信号传输方向

    前面根据数据传输是否需要时钟将接口的传输分为同步和异步。如果按照在传输的时候,是单方向的传输还是双向的传输,又可以分为单工,全双工,半双工。

(1)单工

    单工通信说明接口之间的信息只能单向的传递,比如,电视,广播,功放。在UART通信中,单独针对RXD来说,信号只能通过RXD信号从发送设备向接收设备发送数据。接收设备不能通过RXD管脚做其他功能使用。

(2)半双工

    半双工说明接口之间的信息通道支持双向的传输,但是在某一个固定的时刻,信号只能从一方传递到另一方,不能同时传递信号。比如对讲机,智能音响。在单板中经常使用的RS485两线式的接口就是半双工的通信方式。

 

(3)全双工

    全双工说明信息能在某个时刻双向传输,不需要像半双工那样存在切换,全双工的通道一直支持信息双向的传递。比如有线电话,手机,都是双向通讯。在单板上,使用较广泛的UART(RXD/TXD),SPI(SDI/SDO)都是全双工接口。

三、时钟的来源

 有三种用于两个IC间通信的时序模型——系统同步、源同步和自同步(SerDes)。

【理论篇】IC间通信的时序模型——系统同步、源同步和自同步-CSDN博客

 在SerDes流行之前,芯片之间的互联通过系统同步源同步并行接口传输数据。

图、演示了系统和源同步并行接口。 

1、系统同步并行接口

   

     通过芯片的IO传输数据的最简单方法是将数据接口从一个芯片直接连接到下一个芯片(见图1)。由于数据通常由一个以上的信息组成,因此数据接口的宽度超过了一个比特。

    在图中,1号芯片内的n位数据接口通过芯片输出,穿过n位互连,通过2号芯片的输入,连接到接收芯片内的n位数据通路。由于两个芯片的时钟都是由同一个时钟源发出的,所以两个芯片之间的数据传输是同步的。

图片

图1. 芯片间并行数据总线

    图1所示的并行数据总线有两个固有的问题:

    第一个问题是,每个芯片上需要n个输入/输出(I/O)引脚来传输数据

    在历史上的某个时刻,这是可以接受的(巨大的IO开销)。然而,与几十年前相比,摩尔定律推动了芯片上可制造的电路数量的大幅增加。芯片封装技术的引脚密度并没有以与硅电路密度相同的速度增长。因此,I/O引脚的价格大大高于硅电路,将n个I/O引脚专用于上述数据总线对于大多数芯片应用来说是不可接受的。

    第二个问题是,涉及到满足时序要求。

    数据由1号芯片同步启动,并使用相同的时钟在2号芯片中同步捕获。芯片2号输入端的数据必须满足相对于芯片的时钟输入的建立和保持时间。这些建立和保持时间的计算必须有足够的余量,以考虑到两个芯片的时钟分配路径延迟以及通过芯片到启动和捕获触发器的延迟差异。    延迟可能根据芯片的工艺、电压和温度(PVT)条件而变化,必须增加余量以考虑最坏情况的变化。对于更高的时钟频率,可能需要在芯片中使用锁相环(PLL)来调整时钟相位,以补偿芯片内的时钟分布延迟,并适应不断变化的工艺、电压和温度条件。如果时钟频率足够高,几乎不可能建立一个能在这个数据总线上可靠地传输数据的系统。

2、源同步并行接口

 

   源同步是指两个通讯的IC,发送端在发送数据的时候,会伴随着时钟一起发送,接收端依据此时钟进行数据的接收。

    这种架构包括任何用输入时钟来捕获数据的接口。这可能是发射和接收芯片都使用的参考时钟,或者是发射芯片驱动一个时钟给接收芯片。在这两种情况下,源同步接口都不需要时钟恢复电路。

 

2.1. 减少I/O引脚数量

    要解决的第一个问题是减少芯片之间传输数据所需的I/O引脚的数量。这是通过将芯片#1输出的n位数据复用到k位互连接口上(k<n),然后将芯片#2输入的k位互连接口解复用到n位内部数据通路上来实现的。这在图2中显示。由此产生的系统在每个芯片上只需要k个I/O引脚,而不是以前需要的n个引脚。

图片

图2. 串行化数据以减少引脚数量

    当然,虽然引脚数的要求按k:n的比例减少,但所需的参考时钟频率却按这个比例的倒数增加。由于噪声、电磁干扰(EMI)和功耗的考虑,系统设计者通常不喜欢在系统内分布高速参考时钟。通常,一个较低频率的时钟被使用,芯片中的PLL被用来将这个参考时钟乘以一个可用的频率。由此产生的时钟的相位变化,加上较高的数据传输频率,往往会加剧并行数据总线方法的时序问题。

2.2 时钟转发

    在图3中,在两个芯片之间的数据路径中加入了一个高速时钟。但假设时钟源提供一个比芯片内部数据触发器需要的时钟频率低一些的时钟频率。每个芯片都使用PLL来产生这个频率的倍数时钟。产生的时钟用于启动和捕获各自芯片中的数据。芯片#1中的PLL的输出时钟,用于启动该芯片的数据,也是该芯片的一个输出。这个时钟被2号芯片用来捕获数据。这种方法被称为时钟转发。

    这种方法的优点是,用于在芯片#1启动(传输)数据的高速时钟可供芯片#2作为捕获数据的参考。在时序分析中不需要考虑驱动两个芯片的时钟网络的延迟变化。只有时钟路径和数据位之间的延迟变化是相关的。这些路径之间由于工艺、电压和温度引起的变化在一定程度上是相互跟踪的。其结果是,接口的定时分析需要较少的余量,因此设置和保持时间更容易满足。

    到目前为止,我们还没有就高速时钟的频率相对于接口的比特率做出任何区分或建议。一般来说,图中所示的高速时钟可以是单数据速率(SDR)或双数据速率(DDR)(图4)。接收芯片在SDR时钟的每个上升沿(或每个下降沿)捕获数据;而有些接收芯片在DDR时钟的每个边缘(包括上升沿和下降沿)捕获数据。

图片

图3. 与数据一起转发的高速时钟

图片

图4. 单倍数据速率和双倍数据速率时钟

    与SDR时钟相比,DDR时钟的优势在于对相应的I/O驱动器(输出)和接收器的带宽要求。一个以每秒bMbits的比特率使用的I/O单元需要足够的带宽来传输101010...数据模式。这相当于一个频谱,其基本频率上限为b/2MHz。一个SDR时钟的相应频率是bMHz,是数据频谱限制的两倍。然而,同一接口的DDR时钟的频率只有b/2MHz,与数据的频谱一致。因此,同一个I/O驱动器和接收器可以用来驱动和接收数据以及DDR时钟。

    无论高速时钟是SDR时钟还是DDR时钟,接收芯片都使用这个时钟来直接捕获数据。该芯片还使用参考时钟来生成相同频率的内部系统时钟。这些时钟是同步的。虽然频率是相同的(鉴于它们共享一个共同的频率参考),但时钟之间的相位关系是未知的,并且可能由于PVT变化而变化。因此,接收芯片通常将收到的数据从接口时钟域重新过渡到内部芯片时钟域。FIFO被用来执行这种跨时钟域功能。最好是尽量减少由接口时钟触发的触发器的数量,以尽量减少时钟分配网络的延迟;否则时序问题会加剧。

2.3. 差分信号

    非差分信号的上升和下降时间不等,导致闭眼。在芯片上切换的信号也会在芯片的配电网上产生电流变化,这反过来又会引起压降(噪声)的变化,从而导致周围电路的延迟变化。为减少这些现象对眼宽的影响,一个方法是在芯片之间驱动差分信号。

    差分信号用两个电信号(真信号和补信号)表示数据位。逻辑 "0"是指真信号被驱动到其下限电压,而补信号被驱动到其上限电压;逻辑"1"是指真信号被驱动到其上限电压,而补信号被驱动到其下限电压。差分接收设备根据两个信号之间的差异来解释逻辑位值,而不是根据任何一个信号的电平来单独解释。

图片

图6. 具有独立高速时钟的多组数据

    与同等的单端驱动相比,差分驱动电路往往具有线性电流驱动,并在电源上产生较少的噪声。大多数噪声源在真信号和补信号上引起的电压变化是相同的;这种共模噪声被接收器所忽略。另外,由于差分信号的一个边沿在上升,而另一个边沿在下降,或者相反,不平衡的上升和下降时间效应被抵消。

    差分信号的缺点是,每个数据位需要两个芯片引脚。然而,差分信号带来更高速度,这抵消了它更多引脚消耗的缺点,而单端信号则不可能带来更高的速度。

2.4. 多个接口时钟

    图3中的接口时钟与用于启动数据的时钟相同,一般来说,它是从时钟分配网络中的某一点驱动的,尽可能接近启动数据的实际触发器。任何不属于数据路径和时钟路径的电路都会引入相位变化。

    为了使眼宽最大化,通过时钟树到每个数据触发器和时钟输出的路径应尽可能多地共享,而且时钟的输出驱动器应与数据的输出驱动器相似。理想情况下,同一个时钟缓冲器应该驱动时钟到输出驱动器,并驱动所有数据触发器的时钟输入。数据总线上的位数越多,实现起来就越困难。I/O驱动器必须根据连接到封装引脚的接地规则进行物理分布。电路之间的距离越大,工艺、电压和温度的变化就越大,时钟分配网络中由于缺乏接近性而不能共享的电路路径就越多。

图片

图7. 调整接收器中的采样时钟相位

    用于改善眼宽的一种技术是限制与特定接口时钟线相关的数据位的数量。更宽的数据总线是通过使用多个接口时钟建立的,每个时钟与数据位的一个子集相关。图6是一个例子,其中k位互连被细分为两组,每组都有自己的高速接口时钟。请注意,接收芯片必须在不同的时钟域中捕获每组数据位,并需要将这些数据跨时钟域传输到芯片内部的公共时钟域。

2.5. 采样边沿调整

    另一种用于允许源同步接口更高速运行的技术是在接收器处处理数据信号,并在每个比特的基础上调整时钟的采样相位。这是通过将接收到的接口时钟信号连接到一个多隙延迟线的输入端,并在多个由不同时钟相位驱动的触发器中捕获数据信号来实现的。然后,可以用逻辑来确定数据转换发生的时钟相位,并选择用于捕获数据的最佳时钟相位。这个方案如图7所示。

    如图7所示的方案,可能需要在接口初始化时或定期进行训练模式。如果使用训练模式,相位选择在训练期之间保持静态。更复杂的实现方式是根据收到的数据或根据嵌入在数据流中的训练模式来动态调整。将数据应用于延迟线的替代架构也是可能的。然而,请注意,大多数这些方案的一个固有特点是,相位调整小于正负一个比特时间,必须有一个足够开的“眼”,这样才能存在一个最佳的采样相位。

    鉴于上面讨论的先进方案,源同步接口的数据速率可以扩展到每个互联位每秒几千兆比特(Gbps)。然而,PVT变化使接口速度的进一步提高变得异常复杂。在这些速度之外,从数据流的边缘转换中提取时钟的高速Serdes设备成为首选解决方案。

3、自同步串行接口

    自同步的意思就是不需要单独的时钟线,但是器件能在数据流中准确得到数据和时钟。 

 

    在系统同步接口方式中,随着接口频率的提高, 有几个因素限制了有效数据窗口宽度的继续增加。

a)、时钟到达两个芯片的传播延时不相等(clock skew)

b)、并行数据各个bit的传播延时不相等(data skew)

c)、时钟的传播延时和数据的传播延时不一致(skew between data and clock)

    虽然可以通过在目的芯片(chip #2)内用PLL补偿时钟延时差(clock skew),但是PVT变化时,时钟延时的变化量和数据延时的变化量是不一样的。这又进一步恶化了数据窗口。

    在源同步接口方式中,发送侧Tx 把时钟伴随数据一起发送出去, 限制了clock skew对有效数据窗口的危害。通常在发送侧芯片内部,源同步接口把时钟信号和数据信号作一样的处理,也就是让它和数据信号经过相同的路径,保持相同的延时。这样PVT 变化时,时钟和数据会朝着同一个方向增大或者减小相同的量,对skew最有利。

我们来做一些合理的典型假设,假设一个32bit 数据的并行总线,

a)、发送端的数据skew = 50 ps —很高的要求

b)、pcb走线引入的skew = 50ps —很高的要求

c)、时钟的周期抖动jitter = +/-50 ps —很高的要求

d)、接收端触发器采样窗口 = 250 ps —Xilinx V7高端器件的IO触发器

可以大致估计出并行接口的最高时钟 = 1/(50+50+100+250) = 2.2GHz (DDR)或者1.1GHz (SDR)。

    利用源同步接口,数据的有效窗口可以提高很多。通常频率都在1GHz 以下。在实际应用中可以见到如SPI4.2接口的时钟可以高达DDR 700MHz x 16bits位宽。DDR Memory接口也算一种源同步接口,如DDR3在FPGA中可以做到大约800MHz的时钟。

    要提高接口的传输带宽有两种方式,一种是提高时钟频率,一种是加大数据位宽。那么是不是可以无限制的增加数据的位宽呢?这就要牵涉到另外一个非常重要的问题—–同步开关噪声(SSN) 。

    这里不讨论SSN的原理,直接给出SSN的公式: SSN = L *N* di/dt。

    L 是芯片封装电感,N是数据宽度,di/dt是电流变化的斜率。

    随着频率的提高,数据位款的增加,SSN 成为提高传输带宽的主要瓶颈。下图是一个DDR3串扰的例子。图中低电平的理论值在0V,由于SSN的影响,低电平表现为震荡,震荡噪声的最大值达610mV,因此噪声余量只有1.5V/2-610mV=140mV。

图2 DDR3串扰演示

    因此也不可能靠无限的提高数据位宽来继续增加带宽。一种解决SSN的办法是使用差分信号替代单端信号,使用差分信号可以很好的解决SSN问题,代价是使用更多的芯片引脚。使用差分信号仍然解决不了数据skew的问题,很大位宽的差分信号再加上严格的时序限制,给并行接口带来了很大的挑战。

 

3.1 SerDes接口

    目前并口发展遇到的限制主要为,一方面芯片封装面临着IO数量紧张的问题,另一方面是,并口的数据速率提升过程中面临的串扰(Crosstalk)和噪声(SSN)问题,使得数据的同步变得很困难。

    源同步接口的时钟频率已经遇到瓶颈,由于信道的非理想(channel)特性,再继续提高频率,信号会被严重损伤,就需要采用均衡和数据时钟相位检测等技术。这也就是SerDes所采用的技术。

图3一个N对SerDes收发通道的互连演示,一般N小于4

    可以看到,SerDes不传送时钟信号,这也是SerDes最特别的地方,SerDes在接收端集成了CDR(Clock Data Recovery)电路,利用CDR从数据的边沿信息中抽取时钟,并找到最优的采样位置。

    SerDes采用差分方式传送数据。一般会有多个通道的数据放在一个group中以共享PLL资源,每个通道仍然是相互独立工作的。

    SerDes需要参考时钟(Reference Clock),一般也是差分的形式以降低噪声。接收端Rx和发送端Tx的参考时钟可以允许几百个ppm的频差(plesio-synchronous system),也可以是同频的时钟,但是对相位差没有要求。

    作个简单的比较,一个SerDes通道(channel)使用4个引脚(Tx+/-,Rx+/-), 目前的FPGA可以做到高达28Gbps。而一个16bits的DDR3-1600的线速率为1.6Gbps*16 = 25Gbps,却需要50个引脚。此对比可以看出SerDes在传输带宽上的优势。

相比源同步接口,SerDes的主要特点包括:

a) SerDes在数据线中时钟内嵌,不需要传送时钟信号。

b) SerDes通过加重/均衡技术可以实现高速长距离传输,如背板。

c) SerDes 使用了较少的芯片引脚。

具体SerDes原理见如下地址:

SerDes 基础详解_serdes clkpma 和pcs-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Gateway】网关集成Knife4j—swagger接口文档

文章目录 前言一、相关配置1.网关gateway配置①.网关增加配置 pom文件②.网关增加配置 SwaggerHandler③.网关增加配置 SwaggerResourceConfig④.网关增加配置 SwaggerConfig 2.网关过滤器 二、接口文档使用1.访问文档2.查看文档 总结 前言 在日常开发中是需要前后端联调的&am…

Liunx磁盘管理(上)

Liunx磁盘管理&#xff08;中&#xff09;-CSDN博客 目录 一.硬盘类型 机械硬盘&#xff08;HDD&#xff09; 固态硬盘&#xff08;SSD&#xff09; 二.插拔方式 1. 热插拔&#xff08;Hot Swapping&#xff09; 2. 冷插拔&#xff08;Cold Swapping&#xff09; 3. 模块…

C++仿函数周边及包装器

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

FileCodeBox-Lite:轻量级文件分享解决方案

在数字时代&#xff0c;文件分享是一个常见的需求&#xff0c;无论是个人用户还是企业团队。FileCodeBox-Lite提供了一个简单、高效且安全的文件分享解决方案。以下是对FileCodeBox-Lite项目的详细介绍。 项目简介 FileCodeBox-Lite是一个轻量级的文件分享系统&#xff0c;…

机器学习-06-聚类算法总结

聚类总结 1.聚类 机器学习 任务 聚类 无label的 分类 label是离散的 回归 label是连续的 2.聚类算法-kmeans 划分聚类 思想&#xff1a; D中选取k个作为初始质心 repeat 计算所有点与质心的距离&#xff0c;分到近的质心簇 更新簇之间的质心 until 质心不改 不足&#xff…

AI新篇章:全面解读ChatGPT3.5与GPT4.0的革命性融合

MidTool&#xff08;kk.zlrxjh.top&#xff09;&#xff0c;一个集成了多种先进人工智能技术的助手&#xff0c;融合了ChatGPT3.5、GPT4.0、DALLE 3和Midjourney等多个智能服务&#xff0c;提供多功能体验。下面是对这些技术的简要概述&#xff1a; **ChatGPT3.5**&#xff1a;…

dockerfile 搭建lamp 实验模拟

一 实验目的 二 实验 环境 1, 实验环境 192.168.217.88一台机器安装docker 并做mysql nginx php 三台容器 2&#xff0c; 大致框架 3&#xff0c; php php:Nginx服务器不能处理动态页面&#xff0c;需要由 Nginx 把动态请求交给 php-fpm 进程进行解析 php有三…

LeetCode 131 —— 分割回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先&#xff0c;按照 LeetCode 5——最长回文子串 中的思路&#xff0c;我们先求出 d p dp dp&#xff0c;这样我们就知道了所有的子串是否是回文子串。 然后&#xff0c;我们进行一个 dfs 搜索&#xff0c;起…

Linux用户权限管理与文件权限设定

一、相关概念 1、用户与角色分类 超级用户&#xff1a;拥有对系统的最高管理权限&#xff0c;默认是root用户。 普通用户&#xff1a;只能对自己目录下的文件进行访问和修改&#xff0c;具有登录系统的权限&#xff0c;例如www用户、ftp用户等。 虚拟用户&#xff1a;也叫“…

JavaScript+B/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能?医院云LIS检验系统源码

JavaScriptB/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能&#xff1f;医院云LIS检验系统源码 实验室信息管理系统&#xff08;Trasen Laboratory Information Management System&#xff09;是一套专业的医疗实验室信息管理软件&#xff0c;包含…

【C++】深入理解string类

一、熟悉string类 1.1 string类的由来&#xff1a; C语音中的字符串需要我们自己管理底层空间&#xff0c;容易内存泄露。而C是面向对象语音&#xff0c;所以它把字符串封装成一个string类。 C中对于string的定义为&#xff1a;typedef basic_string string; 也就是说C中的str…

Linux 进程间通信之匿名管道

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 一. 进程间通信介绍 1.进程间通…

富唯智能案例|双3D相机引导衔架抓取铝型材

随着制造业的快速发展和自动化水平的不断提升&#xff0c;铝型材的自动化抓取和加工成为行业内的一大技术难题。铝型材因其轻便、耐腐蚀、易加工等特点&#xff0c;广泛应用于建筑、汽车、电子等领域。然而&#xff0c;铝型材的形状多样、尺寸不一&#xff0c;以及生产线上的高…

4G小车的公网直播推流

一直想做一个小车, 可以通过4G推流, 没想到现在很多云服务提供商, SRS云服务器已经可以一键搭建了. 硬件方面, 就是一个1126驮着一个3516, 1126负责4G连接, 转流到Intenet, 3516负责vi_venc_rtsp 思路如下, 我的1126的摄像头一直没能横过来, 所以就不用1126的摄像头了, 先用35…

SpringBoot配置HTTPS及开发调试

前言 在实际开发过程中&#xff0c;如果后端需要启用https访问&#xff0c;通常项目启动后配置nginx代理再配置https&#xff0c;前端调用时高版本的chrome还会因为证书未信任导致调用失败&#xff0c;通过摸索整理一套开发调试下的https方案&#xff0c;特此分享 后端配置 …

项目管理-项目管理科学基础

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 1.项目管理科学基础--主要内容 项目管理科学基础&#xff0c;以下讲解两方面的内容&#xff1a;工程经济学、运筹学。 2.具体知识点 2…

使用Postman对@RequestPart和HttpServletRequest组合传参方式

使用Postman对RequestPart和HttpServletRequest组合传参方式 方法代码如下&#xff1a; /*** 发布*/ApiOperation("发布")ApiImplicitParams({ApiImplicitParam(name "req", value "json格式", dataType "Map", dataTypeClass Ma…

Docker-Compose概述与简单编排部署

目录 前言 一、Docker-Compose 概述 1、Docker-Compose 概念 2、Docker-Compose 优缺点 2.1 Docker-Compose 优点 2.2 Docker-Compose 缺点 3、Docker-Compose与Docker-Swarm的区别 二、两大文件格式 1、YAML 文件格式 2、JOSON 文件格式 3、YAML 与 JOSON 格式的区…

【C++】:const成员,取地址及const取地址操作符重载

目录 一&#xff0c;const成员二&#xff0c;取地址及const取地址操作符重载 一&#xff0c;const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的…

力扣刷题第0天:只出现一次的数字

目录 第一部分:题目描述 ​第二部分:题目分析 第三部分:解决方法 3.1思路1: 双指针暴力求解 3.2 思路2&#xff1a;异或运算 第四部分:总结收获 第一部分:题目描述 第二部分:题目分析 由图片分析可得&#xff0c;该题目对算法时间复杂度有一定的要求时间复杂度为O(N)&a…