DDR3详解

1.DDR3简介

DDR3 SDRAM,全称第三代双倍速率同步动态随机存取存储器,简称 DDR3,双倍速率(double-data-rate),是指时钟的上升沿和下降沿都发生数据传输;同步,是指DDR3数据的读取写入是按时钟同步的;动态,是指DDR3中的数据掉电无法保存,且需要周期性的刷新,才能保持数据;随机,是指可以随机操作任一地址的数据。DDR3是当今较为常见的一种储存器,在计算机及嵌入式产品中得到广泛应用,特别是应用在涉及到大量数据交互的场合,比如电脑的内存条。其具有以下特点:1.掉电无法保存数据,需要周期性的刷新。2.时钟上升沿和下降沿都会传输数据。3.突发传输,突发长度Burst Length一般为8。当数据存入DDR3时先指定一个bank地址,再指定行地址,最后指定列地址。因此DDR3的存储容量计算公式为bank数×行数×列数×存储单元容量。举个例子,bank address位宽为3,Row address位宽为14,Column address为10,所以它的地址大小等于即 2^3* 2^14* 2^10=2^27=128M,数据位宽为16bit,所以容量大小为 128M*16bit,也就是 256MByte。

  • 2.DDR3结构与原理

  • 2.1DDR3结构解析

以我板子上的MT41K256M16TW-107 IT为例进行介绍,该芯片容量为512Mb,数据接口是 16bit,内存数据主频高达 1600MHZ,数据带宽可达 1600MHz*64bit。其模块组成如下图所示。

各端口的功能如下:

A[14:13], A12/BC#, A11, A10/AP, A[9:0]:地址输入——为ACTIVATE命令提供行地址,为READ/WRITE命令提供列地址和自动预充电位(A10),以便从某个bank的内存阵列中选择一个位置。在PRECHARGE命令期间采样的A10决定PRECHARGE是否适用于一个bank(A10 LOW,由BA[2:0]选择bank)或所有bank(A10 HIGH)。地址输入还提供LOAD MODE命令期间的操作码。地址输入被引用到VREFCA。A12/ BC#:当在模式寄存器(MR)中启用时,在READ和WRITE命令期间对A12进行采样,以确定是否执行突发切碎(动态)(HIGH = BL8或无突发切碎,LOW = BC4)。

BA[2:0]:bank地址输入——BA[2:0]定义了激活、读、写或预充值命令被应用到的bank。BA[2:0]定义在LOAD mode命令期间加载哪个模式寄存器(MR0, MR1, MR2或MR3)。BA[2:0]的参考是VREFCA。

CK, CK#:时钟——CK和CK#是差分时钟输入。所有的控制和地址输入信号都在CK的正沿和CK#的负沿的交叉处采样。输出数据频闪(DQS, DQS#)参考CK和CK#的交叉点。

CKE:时钟使能——CKE使能(高电平)和禁用(低电平) DRAM内部电路和时钟。启用/禁用的具体电路取决于DDR3 SDRAM配置和工作模式。取CKE LOW提供PRECHARGE下电和SELF REFRESH操作(所有bank空闲),或有效掉电(在任何bank中都是行有效)。CKE对于断电进入和退出以及自刷新进入都是同步的。对于自刷新退出,CKE是异步的。掉电期间,输入缓冲区(不包括CK、CK#、CKE、RESET#和ODT)被禁用。在SELF REFRESH期间禁用输入缓冲区(不包括CKE和RESET#)。CKE的参考是VREFCA。

CS#:片选信号——CS#使能(低)和禁止(高)命令解码器。当CS#为HIGH时,所有命令都被屏蔽。CS#为具有多个等级的系统提供了外部等级选择。CS#被认为是命令代码的一部分。CS#的参考是VREFCA。

LDM:输入数据掩码——LDM是一个低字节,用于写入数据的输入掩码信号。在写数据期间,当LDM与输入数据一起被HIGH采样时,低字节的输入数据被屏蔽。虽然LDM球只有输入,但LDM负载的设计与DQ和DQS球的负载相匹配。LDM的参考是VREFCA。

ODT:片上终止——ODT使能(高)和禁用(低) DDR3 SDRAM内部的终止电阻。当在正常操作中启用时,ODT仅应用于以下模块:DQ[15:0],LDQS, LDQS#,UDQS, UDQS#,LDM和x16的UDM;DQ0[7:0],DQS, DQS#,DM/TDQS, NF/TDQS#(当TDQS开启时);DQ[3:0],DQS, DQS#和DM用于x4。如果通过LOAD MODE命令禁用ODT输入,则忽略该输入。ODT的参考是VREFCA。

RAS#, CAS#, WE#:命令输入——RAS#、CAS#和WE#(以及CS#)定义要输入的命令,并引用到VREFCA。

RESET#:复位信号——Reset #是参考VSS的有源LOW CMOS输入。RESET#输入接收器是一个CMOS输入,定义为直流HIGH 0.8 × VDD和直流LOW 0.2 × VDDQ的轨对轨信号。断言是异步的。

UDM:输入数据掩码——UDM是一个上字节,写数据的输入掩码信号。当UDM与WRITE访问期间的输入数据一起被采样为HIGH时,上字节输入数据被屏蔽。虽然UDM球仅用于输入,但UDM加载的设计与DQ和DQS球的加载相匹配。UDM的参考是VREFCA。

DQ[7:0]:数据输入/输出——用于x16配置的双向数据总线的低字节。DQ[7:0] 的参考是VREFCA。

DQ[15:8]:数据输入/输出——用于x16配置的双向数据总线的上字节。DQ[15:8] 的参考是VREFCA。

LDQS, LDQS#:低字节数据频闪——带读数据的输出。与读数据边对齐。带写数据的输入。居中对齐以写入数据。

UDQS, UDQS#:高字节数据频闪——带读数据的输出。与读数据边对齐。带写数据的输入。DQS在写数据时居中对齐。

ZQ:输出驱动校准的外部参考,应连接240ohm到VSSQ。

2.2存储原理

存储原理示意图:行选与列选信号将使存储电容与外界间的传输电路导通,从而可进行放电(读取)与充电(写入)。另外,图中刷新放大器的设计并不固定,目前这一功能被并入读出放大器(Sense Amplifier ,简称S-AMP);

  1. 2.3SDRAM初始化

DDR3 SDRAM必须以预定义的方式通电和初始化。64Mb SDRAM在Vdd和Vddq(同时)通电后初始化,并且时钟在DQM高和CKE高时稳定。在发出命令禁止或NOP以外的任何命令之前,需要100µs延迟。禁止或NOP命令可在100µs期间应用,并应至少持续到该期间结束。至少应用了一个命令禁止或NOP命令,一旦满足100µs延迟,应用预充电命令。所有bank都必须预充电。这将使所有bank处于空闲状态,之后必须执行至少两个自动刷新周期。自动刷新周期完成后,SDRAM即可进行模式寄存器编程。模式寄存器应在应用任何操作命令之前加载,因为它将在未知状态下通电。在加载模式寄存器命令之后,必须在任何命令之前至少发送一个NOP命令。下图为初始化时序图:

  1. Prefetch

所谓prefetch,就是预加载,这是DDR时代提出的技术。在SDR中,并没有这一技术,所以其每一个cell的存储容量等于DQ的宽度(芯片数据IO位宽)。DDR是两位预取(2-bit Prefetch),有的公司则贴切的称之为2-n Prefetch(n代表芯片位宽)。DDR2是四位预取(4-bit Prefetch),DDR3和DDR4都是八位预取(8-bit Prefetch)而8-bit Prefetch可以使得内核时钟是DDR时钟的四分之一,这也是Prefetch的根本意义所在。预取的本质上是并串转换,通过并行方式提前取得数据再串行输出,这也符合预取的字面含义,即把数据提前取出

  1. 2.4自刷新模式

对于DRAM大家都知道是使用电容存储电荷的,优势是使用的元器件较少,有得必有失,结果就是电容会放电,过一段时间电容存储的电荷会丢失,为了防止电容存储的电荷丢失,就是在电容存储器还没有丢失的时候把他存储的数据读出来,在重新写进去,这样电容存储的电荷又可以保存这样一段时间了,这个操作就被称为自刷新;自刷新操作不需要指定行列地址,芯片内会对地址自动替换,每次刷新一行,目前认为64ms电容的数据就会丢失,所以需要保证在64ms内对bank内所有单元均完成一次自刷新;此SDRAM一个bank有4096行,所以需要64ms/4096发送一个自刷新指令

  1. 2.5模式寄存器配置

模式寄存器(MR0-MR3)用于定义DDR3 SDRAM的各种可编程操作模式。模式寄存器在初始化过程中通过模式寄存器设置(MRS)命令编程,它保留存储的信息(MR0[8]除外,它是自清除的),直到它被重新编程,RESET#变为LOW,设备断电。模式寄存器的内容可以通过重新执行MRS命令来改变。即使用户只想修改模式寄存器变量的一个子集,在发出MRS命令时也必须对所有变量进行编程。重新编程模式寄存器不会改变内存数组的内容,只要正确执行即可。MRS命令只能在所有银行空闲并处于预充值状态(满足RP且没有正在进行的数据突发)时发出(或重新发出)。MRS命令发出后,必须满足两个参数:t MRD和t MOD。控制器必须等待t MRD后才能发起后续的MRS命令。

突发长度由MR0定义[1:0]。对DDR3 SDRAM的读写访问是面向突发的,突发长度可编程为4(剁)模式,8(固定)模式,或在Read / write命令期间使用A12进行选择(动态)。突发长度决定了对于给定的READ或WRITE命令可以访问的列位置的最大数量。当READ/WRITE命令设置MR0[1:0]为01时,如果A12 = 0,则选择BC4模式。如果A12 = 1,则选择BL8模式。

  1. 2.6预充电

预充电预充电命令用于停用特定bank中的空行或所有bank中的空行。在发出预充电命令后的某个指定时间(trp),该bank将可用于后续行访问。输入A10确定是否对一个或所有bank进行预充电,如果只对一个bank进行预充电,输入BA0、BA1选择bank。当所有bank都要预充电时,输入BA0、BA1被视为“不在乎”。一旦bank已预充电,它将处于空闲状态,并且必须在向该bank出任何读或写命令之前激活。

2.7自刷新

SELF REFRESH命令用于保留DRAM中的数据,即使系统其余部分断电。当处于自刷新模式时,DRAM保留数据而不需要外部时钟。自刷新模式也是一种方便的方法,用于启用/禁用DLL以及在允许的同步操作范围内更改时钟频率。所有电源输入(包括VREFCA和VREFDQ)必须在进入/退出和自我刷新模式操作期间保持在有效水平。VREFDQ可能浮动或不驱动VDDQ/2,而在自我恢复。

2.8时钟频率与传输速率

关于DDR的时钟频率相关参数主要有如下三种:

  • 内部时钟频率: 核心频率,用于DDR内部cell(存储单元)的时钟
  • 外部时钟频率:时钟频率,用于DDR的IO buffer的时钟,同时也是IO接口时钟,是通过核心频率倍频4倍得到
  • 数据传输率:数据速率,单根数据线的数据传送次数

外部时钟频率=数据传输率/2。因为DDR是利用时钟的上升沿与下降沿均传输数据,所以DDR芯片的工作频率(时钟引脚的频率)为等效频率(传输频率)的一半

内部时钟频率=数据传输率/DDR的数据预取位数。对于DDR来说,预取数为2;对于DDR2来说,预取数为4;对于DDR3来说,预取数为8

从part number中的speed 选项可知,-125 所支持的最小时钟周期 tCK = 1.25ns,对应芯片支持的最大 IO 时钟频率为 800MHz。

不同速度等级对应的时间参数如下:

表中data rate为单数据线的数据速率,DDR为双边沿传输,因此 -125 对应 1600 MT/s(Mega Transfers/s),有时也对应称此内存为 DDR3-1600

那么这片16位数据线内存的带宽为:1600MT/s∗16bit=25600Mbit/s=3200MB/s

3.DDR3工作时序

在实际工作中,Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以/写命令来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS DelayRASCAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。tRCDDDR的一个重要时序参数,广义的tRCD以时钟周期(tCKClock Time)数为单位,比如tRCD=3,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,DDR3-800tRCD=3,代表30ns的延迟。

接下来,相关的列地址被选中之后,将会触发数据传输,但从存储单元中输出到真正出现在内存芯片的 I/O 接口之间还需要一定的时间(数据触发本身就有延迟,而且还需要进行信号放大),这段时间就是非常著名的 CLCAS Latency,列地址脉冲选通潜伏期)。CL 的数值与 tRCD 一样,以时钟周期数表示。如 DDR3-800,时钟频率为 100MHz,时钟周期为 10ns,如果 CL=2 就意味着 20ns 的潜伏期。不过CL只是针对读取操作。

由于芯片体积的原因,存储单元中的电容容量很小,所以信号要经过放大来保证其有效的识别性,这个放大/驱动工作由S-AMP负责,一个存储体对应一个S- AMP通道。但它要有一个准备时间才能保证信号的发送强度(事前还要进行电压比较以进行逻辑电平的判断),因此从数据I/O总线上有数据输出之前的一个时钟上升沿开始,数据即已传向S-AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据I/O总线进行输出,这段时间我们称之为 tACAccess Time from CLK,时钟触发后的访问时间)。

3.1读时序

目前内存的读写基本都是连续的,因为与CPU交换的数据量以一个Cache Line(即CPU内Cache的存储单位)的容量为准,一般为64字节。而现有的Rank位宽为8字节(64bit),那么就要一次连续传输8次,这就涉及到我们也经常能遇到的突发传输的概念。突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期数就是突发长度(Burst Lengths,简称BL)。

在进行突发传输时,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL)外,其后每个数据只需一个周期的即可获得。

非突发连续读模式

非突发连续读取模式:不采用突发传输而是依次单独寻址,此时可等效于BL=1,虽然可以让数据是连续的传输,但每次都要发送列地址与命令信息,控制资源占用极大。

突发连续读取模式:只要指定起始列地址与突发长度,后续的寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与BL相同)即可做到连续的突发传输。举个例子,当BL=8时,原本读取8次数据需要发送8次地址,但在突发连续读取模式下只需要发送一次数据地址即可。

突发连续读模式(BL8)

突发连续读模式(BC4)

3.2写时序

WRITE突发由WRITE命令发起。使用WRITE命令提供起始列和银行地址,并为该访问启用或禁用自动预充电。如果选择了自动预充,则在WRITE突发结束时预充正在访问的行。如果未选择自动预充,则该行将保持打开状态以供后续访问。在发出WRITE命令后,WRITE突发可能不会中断。

 在WRITE命令中,通过MR0[1:0] = 00或MR0[1:0] = 01和A12 = 1激活BL8设置T0和T4。

突发连续写模式(BL8)

在T0和T4的WRITE命令中,MR0[1:0] = 01和A12 = 0激活BC4设置

突发连续写模式(BC4)

  1. 3.3数据掩码

谈到了突发长度时。如果BL=4,那么也就是说一次就传送4×64bit的数据。但是,如果其中的第二笔数据是不需要的,怎么办?还都传输吗?为了屏蔽不需要的数据,人们采用了数据掩码(Data I/O Mask,简称DQM)技术。通过DQM,内存可以控制I/O端口取消哪些输出或输入的数据。这里需要强调的是,在读取时,被屏蔽的数据仍然会从存储体传出,只是在“掩码逻辑单元”处被屏蔽。DQM由北桥控制,为了精确屏蔽一个P-Bank位宽中的每个字节,每个DIMM有8个DQM 信号线,每个信号针对一个字节。这样,对于4bit位宽芯片,两个芯片共用一个DQM信号线,对于8bit位宽芯片,一个芯片占用一个DQM信号,而对于 16bit位宽芯片,则需要两个DQM引脚。

读取时数据掩码操作,DQM在两个周期后生效,突发周期的第二笔数据被取消。写入时数据掩码操作,DQM立即生效,突发周期的第二笔数据被取消。

在数据读取完之后,为了腾出读出放大器以供同一Bank内其他行的寻址并传输数据,内存芯片将进行预充电的操作来关闭当前工作行。举个例子,当前寻址的存储单元是B1R2C6。如果接下来的寻址命令是B1R2C4,则不用预充电,因为读出放大器正在为这一行服务。但如果地址命令是B1R4C4,由于是同一Bank的不同行,那么就必须要先把R2关闭,才能对R4寻址。从开始关闭现有的工作行,到可以打开新的工作行之间的间隔就是tRP(Row Precharge command Period,行预充电有效周期),单位也是时钟周期数。

3.4DQS

DQS 是DDR中的重要功能,它的功能主要用来在一个时钟周期内准确的区分出每个传输周期,并便于接收方准确接收数据。每一颗芯片都有一个DQS信号线,它是双向的,在写入时它用来传送由北桥发来的DQS信号,读取时,则由芯片生成DQS向北桥发送。完全可以说,它就是数据的同步信号。

DDR SDRAM芯片增加了DQS选通脉冲信号,该信号在SDRAM中是不存在的。每个字节的数据对应一个DQS信号,对于16位数据线的芯片来说,每次传输两个字节数据,所以就有LDQS和UDQS信号。主要用来在一个时钟周期内准确区分出每个传输周期,并便于接收方准确接收数据。

  DQS是双向信号,与DQ数据信号双向同步。在读取DDR数据时,DQS与数据信号同时生成(在CK与CK#的交叉点)。而DDR中的CL指从CAS发出到DQS生成的间隔,如下图所示,数据真正出现在数据I/O总线上相对于DQS触发的时间间隔被称为tAC。注意,DDR的tAC与SDRAM的tAC含义不同。

  实际上,DQS生成时,芯片内部的预取已经完毕了,tAC指数据输出时间,由于预取的原因,实际的数据传出可能会提前于DQS产生(数据提前于DQS传出)。

  如下图所示,向DDR写入数据时,DQS的边沿与DQ的中部对齐,此时数据线上的数据会比较稳定,DDR可以在DQS的边沿将DQ的数据存储。

  1. 3.5.ZQ校准与参考电压

ZQ也是一个新增的脚,该引脚需要连接240Ω的低公差参考电阻。这个引脚利用内置的片上校准引擎(On-Die Calibration Engine,ODCE)执行一系列指令,以自动检测并调整数据输出驱动器的导通电阻和ODT(On-Die Termination)的终结电阻值,确保数据传输的准确性。

  DDR3定义了ZQCL和ZQCS两个ZQ校准命令,ZQ校准时序如下所示。当系统发出这一指令后,将用相应的时钟周期(在加电与初始化之后用512个时钟周期,在退出自刷新操作后用256个时钟周期、在其他情况下用64个时钟周期)对导通电阻和ODT电阻进行重新校准。

在向DDR3发出ZQCL或ZQCS命令之前,必须对所有存储体进行预充电且必须满足tRP。在tZQinit或tZQoper持续时间内,控制器不能在DDR3通道上执行任何其他活动。

  DDR3中参考电压分为命令与地址信号的参考电压(VREFCA)和数据总线参考电压(VREFDQ),有效的提高系统数据总线的信噪等级,抗干扰能力更强。

DDR3的内容还是比较多且复杂的,如有不对的地方还请大家批评指正。

参考资料:

DDR扫盲——DDR的特性分析-Felix-电子技术应用-AET-中国科技核心期刊-最丰富的电子设计资源平台 (chinaaet.com)

DDR扫盲—-关于Prefetch(预取)与Burst(突发)的深入讨论_ddr 预取-CSDN博客

从内部结构分析SDRAM到DDR的变化_sdram只能在时钟的上升-CSDN博客

DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)

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

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

相关文章

使用 nuxi build-module 命令构建 Nuxt 模块

title: 使用 nuxi build-module 命令构建 Nuxt 模块 date: 2024/8/31 updated: 2024/8/31 author: cmdragon excerpt: nuxi build-module 命令是构建 Nuxt 模块的核心工具,它将你的模块打包成适合生产环境的格式。通过使用 --stub 选项,你可以在开发过程中加快模块构建速度…

linux Vim的安装和基本使用

Vim 什么是 Vim Vim是一个高度可定制的文本编辑器,源自Unix系统的vi编辑器。它被广泛用于类Unix系统中,包括Linux、Mac OS和Windows平台。Vim特别受到程序员的青睐,因为它提供了丰富的编程功能,如代码补全、编译及错误跳转等。这…

Kubernetes 上安装 Jenkins

安装 Helm curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash添加 Jenkins Helm 仓库 首先添加 Jenkins Helm 仓库 helm repo add jenkins https://charts.jenkins.io helm repo update安装 Jenkins 使用 Helm 安装 Jenkins 的最新版本&…

产品经理角度分析:朋友圈点赞与评论仅共同好友可见

你有没有在刷朋友圈时,看到某位朋友发了条状态,下面一堆点赞和评论,然后他自己来个“统一回复下,感谢大家”? 这种现象就像是在朋友圈里开了个小型新闻发布会,大家在台下疯狂举手,结果发言人最后…

ip地址变化是什么意思?手机地址ip一直变化怎么办

IP地址作为互联网设备的唯一标识,‌其稳定性对于网络连接至关重要。‌然而,‌手机IP地址频繁变动可能带来一系列问题。‌本文将深入探讨IP地址变化的含义、‌IP地址频繁变动的原因,‌以及提供手机地址IP一直变化的有效应对策略。‌ 一、IP地址…

使用pgdump、pgrestore迁移数据表到docker部署的postgis

将本地数据同步到内网服务器,使用的postgis,表含空间字段 备份 本地使用pgadmin 4进行备份,pgrestore的命令参数找起来麻烦,这个可以界面操作,比较方便 说明 说明的截图来自pgadmin,点击这个打开 …

GitLab私有代码仓库搭建与使用

文章目录 一、安装GitLab1、下载安装2、修改配置3、启动gitlab4、登录 二、使用1、ssh-key 参考资料 一、安装GitLab 1、下载安装 gitlab-ce的rpm包清华源地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/?CN&OD 本次使用gitlab-ce-17.1.1-c…

论文精读:JACS —— Sb2Si2Te6与Sc2Si2Te6热电性能

摘要节选: 本文以层状Sb2Si2Te6和Sc2Si2Te6为模型体系,采用密度泛函理论结合半经典玻尔兹曼输运理论,全面研究和比较了它们的热电性能。 由于较低的散射率和更明显的带色散,Sb2Si2Te6与Sc2Si2Te6相比具有优越的导电性。 在将导带轨道特性从…

【微信小程序】SpringBoot集成微信小程序(多小程序集成)

SpringBoot集成微信小程序 前言一、前置工作1、获取appId和appSecret核心参数 二、SpringBoot集成微信小程序1、引入pom依赖2、yml配置3、java代码文件3.1、Properties 配置类3.2 Configuration 服务类 4、使用示例4.1、获取登录后的session信息:openId4.2、获取当前…

若依框架 MyBatis 改为 MyBatis-Plus 的实现步骤

本文只做了简单的实现,具体的细节需根据自己的需求进一步实现。如果实现中遇到问题欢迎留言讨论。 引入 MyBatis-Plus 引入相关依赖(pom.xml) 推荐先直接在顶级 pom.xml 中直接依赖,等调试通过之后,在去按需依赖&…

理解进程与线程

1.1理解分时技术 随着计算器处理能力的逐步提高,计算机处理多道程序成为了可能。 所谓分时技术,就是把处理器的运行时间分成很短的时间片,按时间片轮流把处理器给各程序使用。这样在时间线上表现为线性,但是在体感上感觉是一起执…

Java:时区的用法

文章目录 ZoneId常见用法 ZonedDateTime常见方法 代码 黑马学习笔记 ZoneId 常见用法 ZonedDateTime 常见方法 代码 package NewTime;import java.time.Clock; import java.time.ZoneId; import java.time.ZonedDateTime;/*** Author: ggdpzhk* CreateTime: 2024-08-31*/ pu…

后台框架-统一数据格式2

在上一篇中,当在Controller类中需要返回统一格式的数据时,需要实例化一个R,有时候觉得还是不够简洁,那有没有一种方法Controller中直接返回对象,但是返回的对象统一保存到如下格式的data中? ResponseBody…

YASKAWA机器人维修操作命令攻略-移动命令运用案例

移动命令 1. MOVJ 命令运用案例: MOVJ VJ50.00 PL2 NWAIT UNTIL IN(1)ON 含义:在这个点以关节坐标,按 50.00%的再现速度,定位精度为 2,同时执行下一条非移动 指令,判断输入信号 1 为 on 后,执行…

【Python机器学习】NLP词频背后的含义——距离和相似度

我们可以使用相似度评分(和距离),根据两篇文档的表示向量间的相似度(或距离)来判断文档间有多相似。 我们可以使用相似度评分(和举例)来查看LSA主题模型与高维TF-IDF模型之间的一致性。在去掉了…

Windows中pip换源

step1:检查是否安装 输入如下,出现版本号,就是安装好了 pip -V或pip --version pip3 -V pip3 --version step2:找到(创建)配置文件 对于 Windows 用户,配置文件在【%APPDATA%\pip\pip.ini】文…

C语言典型例题56

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.8 将范围为100~200的不能被3整除的数输出。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题4.8 将范围为100~200的不能被3整除的数输出。//#include <stdio.h>…

【B端产品知识总结】系统消息提醒及消息推送设计思想

目录 前言 一、简述消息通知 1、第一步盘点消息推送渠道 2、第二步消息推送项盘点 3、第三步确定消息通知内容和操作反馈 二、系统消息项通知梳理 1、明确消息推送渠道 2、盘点产品业务消息项 3、撰写通知内容与操作反馈 三、如何设计消息中心 ⒈、设计消息中心入口&…

Java:路径计算与障碍物处理

Java 实现寻找字符串数组中的最长公共前缀及不同路径数量计算&#xff08;含障碍物&#xff09; 在计算机科学和软件开发中&#xff0c;经常需要解决一些基本但实用的问题。本文将介绍两种常见问题的解决方案&#xff1a;一是从一组字符串中找出最长公共前缀&#xff1b;二是计…

Unity SceneView 相机聚焦到指定位置

SceneView 相机聚焦到指定位置 SceneView.lastActiveSceneView.LookAt(pos);