DDR3详解

news2024/11/23 6:26:29

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.coloradmin.cn/o/2091717.html

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

相关文章

Linux教程六:文件目录类命令ls、cd(图文详解)

默认登录出现一个[用户localhost ~] 代表时登陆用户的家目录 1、 Linux ls命令 基本用法 ls:列出当前目录下的文件和目录(不包括以.开头的隐藏文件)。ls 目录名:列出指定目录下的文件和目录。 常用选项 -l:以长格式列出…

利用开源 AI 智能名片 O2O 商城系统提升饭店私域流量

摘要:本文旨在探讨如何通过设计门店裂变方式,结合开源 AI 智能名片 O2O 商城系统,将私域流量转化为自然流量,以促进饭店业务增长。通过在餐桌上放置个人微信二维码台卡、提供福利套餐和折扣、创建饭圈社群等方式,吸引用…

Vue.js入门系列(十九):深入理解和应用组件自定义事件

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

python-奥运奖牌计数

题目描述 2008 年北京奥运会,A 国的运动员参与了 n 天的决赛项目 (1≤n≤100)。现在要统计一下 A 国所获得的金、银、铜牌数目及总奖牌数。输入第 1 行是 A 国参与决赛项目的天数 n,其后 n 行,每一行是该国某一天获得的金、银、铜牌数目&…

小程序连接MQTT服务器,以及配置,避坑

1、MQTT服务器域名配置 由于小程序必须使用域名方式连接socket,所以必须为MQTT服务器配置域名,并配置SSL证书。 1.1相关文档: EMQX 企业版安装 | EMQX 企业版 4.4 文档 EMQX MQTT 微信小程序接入 | EMQX 4.2 文档 MQTT 下载引入和配置连…

【图像去噪】论文精读:Multi-level Wavelet-CNN for Image Restoration(MWCNN)

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中…

Spring入门之IOC(包含实例代码)

目录 什么是Spring?什么是Spring IOC?如何创建一个Spring IOC项目?1. 导入Maven项目依赖2. 准备一个实体类(先定义接口再实现)3. 准备配置文件4. 在Test类中测试 IOC中的Bean管理实例化Bean的三种方式 什么是Spring&am…

微信中如何搜索附近的人

我们 微信 下面选择 发现 然后 点卷 附件 进入后 头上的页签 切换成 附件的人 在列表中点击后即可添加附件的人啦

鸿蒙启动框架配置文件(StartUpTask)

{"startupTasks": [//有哪些任务{"name": "StartupTask_001",//任务名字"srcEntry": "./ets/startup/StartupTask_001.ets",//任务的文件路径"runOnThread": "taskpool",//运行在哪个现成,有…

泰克TDP1000差分探头Tektronix TDP0500参数资料

泰克Tektronix TDP0500 TDP1000 高压差分探头 ​Tektronix TDP1000 高压差分探头是一款多功能且易于使用的探头,可提供开关电源、CAN/LIN 总线和高速数字系统设计所需的高速电气和机械性能。Tektronix TDP1000 探头专为与 TekVPI 探头接口或 TekProbe BNC 接口配…

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

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

能力驱动的企业战略转型:基于能力规划的战略转型与数字化实践全指南

在当今数字化和全球化加速发展的时代,企业面临着复杂的市场环境和迅速变化的客户需求。为了在竞争中脱颖而出,企业必须不仅制定卓越的战略,还需确保这些战略能够有效地转化为实际行动。基于能力规划(Capability-Based Planning, C…

Lua 代码编码规范

lua代码格式 vscode stylua 插件 配置文件stylua.toml column_width 240 line_endings “Unix” indent_type “Spaces” --使用空格 很重要,保证不同编辑器打开是一样的 indent_width 4 quote_style “AutoPreferDouble” --字符串引号样式双引号 call_paren…

海康二次开发学习笔记9-通讯触发及模块列表获取

通讯触发及模块列表获取 模块列表获取 获取流程中所有模块的模块名,添加下拉框用于显示模块名 1. 处理Combox2的DropDown事件 /// <summary>/// 模块列表获取/// </summary>/// <param name"sender"></param>/// <param name"e&q…

MCU官方IDE软件安装及学习教程集合 — STM32CubeIDE(STM32)

简介 各MCU厂商为保证产品的市场地位以及用户体验&#xff0c;不断的完善自己的产品配套&#xff0c;搭建自己的开发生态&#xff0c;像国外ST公司&#xff0c;国内的GD&#xff08;兆易创新&#xff09;&#xff0c;AT&#xff08;雅特力&#xff09;等等。目前就开发生态而言…

测试.net core服务项目调用dotNetify-Pulse监控性能的基本用法

微信公众号“DotNet讲堂”的文章《开源 .NET API 实时监控项目》介绍了开源实时日志及性能监控项目dotNetify-Pulse&#xff0c;在项目中引用简单&#xff0c;既能用其自带的监控页面&#xff0c;也支持按需配置监控页面。本文在之前创建的环境检测项目中添加并测试dotNetify-P…

逆向工程核心原理 Chapter20 | “内嵌补丁”练习

前言 自己学《逆向工程核心原理》一书的记录&#xff0c;只记录自己觉得重要/有用的一些点。 知识点学习 很实用的一个逆向技术。 原理&#xff1a; “壳”的逻辑也是这样的。EP处先解密OEP代码&#xff0c;再跳转到洞穴代码&#xff0c;恢复IAT之类的&#xff0c;然后跳回…

免费分享-MATLAB代码融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型

融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型 通过融合正余弦和柯西变异改进麻雀搜索算法&#xff0c;对CNN-BiLSTM的学习率、正则化参数以及BiLSTM隐含层神经元个数等进行优化 预测效果图如下 代码如下&#xff1a; %% 清空环境变量 wa…

Vue(七) TodoList案例1.0

文章目录 组件化编码流程(通用)1. 拆分静态组件2. 初始化列表展示动态数据如何让一个标签动态的拥有某一个属性 3. 按回车添加todo子组件给父组件传值之props 4. 勾选与取消勾选一个Todo5. 删除6. footer底部统计7. footer底部交互7.1 全选框自动打勾7.2 全选框取消勾选 8. 清除…

【java】vscode配置javaweb开发环境

下载jdk https://www.oracle.com/java/technologies/downloads/?er221886下载完毕直接安装&#xff0c;安装完毕自动添加以下环境变量 在cmd中运行 java -version出现以下代表成功 再添加系统变量 下载Maven https://maven.apache.org/download.cgi下载完解压放到自己方…