04:2440---内存控制器
目录
一:介绍
1:引入
2:概念
3:通信
A:片选信号
B:片选信号的地址空间范围
4:地址线
A:不同位数的接法
B:访问原理
C:访问地址
5:时序
1:NOR FLASH
A:2440NOR FLASH时序
B:原理/时序图
C:寄存器
6:SDARM
A:访问方式
B:原理图
C:BWSCON
D:BANKCON6
E:REFRESH
F:ANKSIZE
G:MRSR
二:代码
1:NOR FLASH
2:SDARM
一:介绍
1:引入

操作GPIO: 我们可以编写程序,让CPU去访问里面的寄存器
eg:GPFCON配置寄存器 . 可以设置这个寄存器,把某个引脚设置为输出或者输入; GPFDATA数据寄存器, 可以设置某个引脚发出高低电平.
UART一样我们可以写程序让CPU访问某些特定的寄存器.
对于CPU来说,我不关心你这些具体的接口,我只是去操作某个寄存器。我CPU把某些值写给某些寄存器,由这些对应的控制器发出特定的波形。所以这个时候我们的内存控制器就来了
2:概念
CPU发出的地址信号并不会传到外面来(eg:GPIO口)。CPU只是用地址来选择里面的不同寄存器。然后CPU把数据发给里面的寄存器,至于这些数据,这些地址会起什么作用,完全由里面的控制器决定。CPU发出来这些信号呢,并不会直接的输出到外部电路去。凡事都有例外(内存接口).
内存接口:对于这种接口的设备CPU发出来的地址,可以直接传给这些设备。
在原理图种也可以看到 数据信号CPU发出的地址和数据直接传给这个芯片

内存控制器作用:

3:通信

A:片选信号
内存控制器根据CPU发出的地址,设置不同的片选引脚,只有被选中的芯片才会工作,没有选中的芯片不会影的他
只有使得某个片选引脚输出低电平的时候,对应的芯片才会开始工作,
SDRAM:
在SDRAM中只有LnWE, 所以LnWE负责写入数据和读取数据
NOR FLASH
LnOE:拉低负责读取数据, LnWE负责写入数据
DM900:
LnOE:拉低负责读取数据, LnWE负责写入数据
CPU根据指令发出地址信号,内存控制器来根据这些地址来决定选中哪一些芯片。
B:片选信号的地址空间范围
每个片选引脚相隔134217758位, 当地址处于某一个范围的时候, 对于的片选信号才会有效----见4地址线C:访问地址

至少需要A0~A27条地址线:
内存的存储单元个数=2^地址线的条数,因此计算内存的总地址线数的公式为: 地址线的条数=log2(内存的存储单元个数.

CPU有32位地址线, 但是内存控制器他的能力只能控制27位地址线

只有使得某个片选引脚输出低电平的时候,对应的芯片才会开始工作,
4:地址线
A:不同位数的接法
8位

CPU的A0接到芯片的A0
16位

当使用两个8位的芯片拼接(DATA0-7接一个芯片,DATA8-15接一个芯片,也就是组成了一个16位的芯片)的时候,CPU的A1接芯片的A0(CPU的A0用来判断高8位有效还是低8位有效)

CPU的A1接的位芯片的A0
32位

CPU的A2接到芯片的A0
B:访问原理


CPU把地址发送给内存控制器, 内存控制器找到了相应地址的内存类设备(ROM), 内存类设备(ROM)返回数据给内存控制器, 内存控制器找到了储存单元种的数据发送给CPU.
内存控制器所发出的地址线, 有一部分接到了芯片上. 有一部分没有接接到芯片上。
接到了芯片上的这些引脚呢用来确定,读取这个芯片上哪一个单元,把这个单元返回给内存控制器。而内存控制器呢,会使用那些没有接的引脚来确定从这个单元中取出哪一个字节返回给CPU
eg:
C:访问地址


5:时序
1:NOR FLASH
我们这里面只研究读时序
A:2440NOR FLASH时序

Taa: 发出add后时间DATA才有效, 可以看到max时间为70ns, 如果在70ns之内访问数据,数据可能不太稳定, 导致我们读取数据错误.
Tce: 和上面的差不多, 片选信号的max为70
所以我们为了简单可以把地址,片选,读写,数据信号以70ns一起发出
B:原理/时序图

我们可以看到NOR FLASH有21根地址信号(但是CPU只连接芯片的20根), 16个数据信号, 以及片选限号NCS0, 和写信号LnWE读信号LnOE
我们可以计算一下我们这个2440NOR FLASH内存的大小
2^21/1024/1024=2MB

先发出地址信号,经过Tacs时间发出片选信号(nGCS),然后经过Tcos时间发出读信号,过一会数据才有效,把数据读走,然后把读信号释放掉,把片选信号释放掉,然后才开始新的地址周期
Tacs ,Tcos,Tacc,Tacp...这些需要根据不同的芯片来进行设置因为J2440可以接不同类型的内存类芯片,这些内存内芯片性能不同,所以所用的时间周期也不同。
C:寄存器
在上次种我们把HCLK该为了100MHZ

他默认为14clocks(14*10=140>70), 所以每次时序都可以正常的运行
6:SDARM
A:访问方式

不像NOR FLSAH一样直接发送地址, SDRAM拆分地址在发送
B:原理图

SDARM是由2个16为的芯片组合而成, 成为32位的芯片。 故内存大小
2^32=4294967296bit=4194304KB=4096MB=4GB
挂载在BANK6上,片选引脚为nGCS6
C:BWSCON

因为我们的SDRAM只挂载在BANK6上, 所以我们只关系BANK6。
DW6: 我们的bank是32位的所以选择---10
WS6: WAIT是由芯片发送给CPU的信号, 以前的芯片准备数据慢, 在CPU给内存控制器发送地址后。内存控制器给给芯片发送各种信号,准备采集数据,但是芯片如果还没有准备好数据可以给CPU发送WAIT信号。最大的宽限时间。 等待信号的使能,由于现在的内存速度足够快,在读数据时不需要内存控制器等待,选择0。
ST6:BANK6的带宽,选择32位
BWSCON=0x02000000
D:BANKCON6

MT: 我们使用的位SDRAM,使用选择11
Trcd:这个域的配置表示的是发送行有效命令到列有效命令之间的时间间隔。在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟),可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。
我们使用HCLK为10ns,所以选择00
SCAN:列地址的位数 选择01 --9位
BANKCON6=0x00018001
E:REFRESH
之所以称为DRAM,就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作

REFRE:肯定要使能刷新操作。---1
TREFMD:刷新操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(Self Refresh,简称SR)。对于AR, SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。SR则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是STR(Suspend to RAM,休眠挂起于内存)。这里不使用低功耗模式,故TREFMD=0B,使用自动刷新。-----0
Trp:预充电时间。其实就是读取不同行之间的时间间隔。L-Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的工作行,这个间隔被称为tRP(Precharge command Period,预充电有效周期)。-----00即20ns
Tsrc:--01
Trc我们取70ns, Trp我们设置的为20ns, 所以Tsrc=Trc-Trp=70-20=50ns
Refresh Conuter:我们根据SDARM芯片的Refresh period(刷新周期)的值确定刷新计数器的值。
64ms/8192bit=7.8ms
Refresh count = 2^11 + 1 100x7.8 = 1269=0x4f5---以为我们使用的HCLK为100MHZ
REFRESH=0x008404f5
F:ANKSIZE
BURST_EN:使能突发传输
突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL)。
BURST_EN :使能他,一次访问多个字节SCKE_EN :使用时钟使能休眠模式
ANKSIZE=0x000000b1
G:MRSR

CL:
WBL:突发长度选择固定,第二个值为reserved,也没得选
TM:只能选00B
CL:CL是SDRAM很重要的参数在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Latency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。
设置CL为2个时钟周期。CL=010B。
BT:只能选0
BL:只能选0
MRSR=0x00000020
二:代码
1:NOR FLASH
/* CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8 */ldr r0, =0x4C000018ldr r1, =(0<<9)str r1, [r0]ldr r0, =0x4C000014ldr r1, =0x5str r1, [r0]/* 设置CPU工作于异步模式 */mrc p15,0,r0,c1,c0,0orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iAmcr p15,0,r0,c1,c0,0/*设置MPLLCON*/ldr r0, =0x4C000004ldr r1, =(92<<12)|(1<<4)|(1<<0)str r1, [r0]/* 一旦设置PLL, 就会锁定lock time直到PLL输出稳定* 然后CPU工作于新的频率FCLK*//*设置内存: sp栈* 我们判断是nor启动还是nand启动/mov r1, #0ldr r0, [r1] /* 读出原来的值备份 */str r1, [r1] /* 0->[0] */ ldr r2, [r1] /* r2=[0] */cmp r1, r2 /* r1==r2? 如果相等表示是NAND启动 */ldr sp, =0x40000000+4096 /* 先假设是nor启动 */moveq sp, #4096 /* nand启动 */streq r0, [r1] /* 恢复原来的值 */bl mainhalt:b halt#define ULCON0 (*((volatile unsigned int*)0x50000000))
#define UCON0 (*((volatile unsigned int*)0x50000004))
#define UBRDIV0 (*((volatile unsigned int*)0x50000028))
#define GPHCON (*((volatile unsigned int*)0x56000070))
#define GPHUP (*((volatile unsigned int*)0x56000078))
#define UFCON0 (*((volatile unsigned int*)0x50000008))
#define UTRSTAT0 (*((volatile unsigned int*)0x50000010))
#define UTXH0 (*((volatile unsigned char*)0x50000020))
#define URXH0 (*((volatile unsigned char*)0x50000024))
#define BANKCON0 (*((volatile unsigned int*)0x48000004))
#define GPFCON (*((volatile unsigned int*)0x56000050))
#define GPFDAT (*((volatile unsigned int*)0x56000054))int LED_on()
{ /*设置寄存器 点亮LED2*//*设置输出模式*/GPFCON = 0x400;/*输出低电平*/GPFDAT = 0;return 0;
}void init_nc_tacc(int val)
{BANKCON0 = val << 8;}
void UART_init()
{/*引脚设置*/GPHCON &= ~((3 << 4) | (3 << 6));GPHCON |= ((2 << 4) | (2 << 6));GPHUP &= ~((1 << 2) | (1 << 3)); /* 使能内部上拉 *//*设置波特率---设置波特率位115200*//*UBRDIVn = (int)(selected clock / (baudrate x 16) ) –1我们使用我们的FCLK作为我们的时钟源--在汇编中是50MHZUBRDIVn=(5000 0000 /(115200*16))-1=26*/UCON0 = 0x00000005;UBRDIV0 = 26;/*数据格式*/ULCON0 = 0x00000003; //不能写为这个ULCON0 |= (3 << 1)因为还要关注其他位;/*数据位=8,停止位=1,无奇偶校验 8n1*/
}
int putchar(int c)
{/*发送数据*/while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));UTXH0 = (unsigned char)c;
}int getchar(void)
{/*接收数据*/while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));return URXH0;
}int puts(const char* s)
{while (*s){putchar(*s);s++;}}#include "uart.h"
#include "sc2440_so.h"
#include "NOR.h"
#include "led.h"
int main(void)
{unsigned char c;UART_init();puts("Please enter the numbesr:\n\r");while (1){c = getchar();putchar(c);if (c >= '0' && c <= '7'){init_nc_tacc(c-'0');LED_on();}else{puts("Error: The number you entered is not between 0 and 7\n\r");puts("Please rewrite input\n\r");}}return 0;
}
init_nc_tacc(c-'0');和init_nc_tacc(c);的区别
在编程中,
init_nc_tacc(c-'0');和init_nc_tacc(c);的区别取决于init_nc_tacc函数如何定义和c的数据类型。
如果
c是一个字符型变量(如char),并且代表一个数字字符(例如'1'、'2'、'3'等):
c-'0'通常用于将字符型数字转换为实际的整数。在ASCII编码中,数字字符'0'到'9'是连续的,因此通过减去'0'(其ASCII值为48)可以将字符型数字转换为整数。例如,如果c是'3',c-'0'将得到整数3。init_nc_tacc(c-'0');会将转换后的整数传递给函数。init_nc_tacc(c);则会将字符型变量传递给函数。如果
c不是代表数字的字符,那么c-'0'可能没有明确的意义,并且可能不会得到预期的结果。如果
init_nc_tacc函数对字符和整数有不同的处理逻辑,那么两个调用会有不同的效果。如果
c是其他数据类型,比如已经是一个整数,那么c-'0'就没有意义,并且可能导致编译错误或不可预测的行为。
2:SDARM
代码大致和NOR FLASH不变, 我们这里只展示改变的
#include "sc2440_so.h"
void SDARMA_init(void)
{BWSCON = 0x02000000;BANKCON6 = 0x00018001;BANKCON7 = 0x00018001;REFRESH = 0x008404f5;ANKSIZE = 0x000000b1;MRSRB6 = 0X00000020;MRSRB7 = 0X00000020;
}
int init_test(void)
{ //片选引脚为nGCS6volatile unsigned char* p = (volatile unsigned char*)0X30000000;int i;//write 操作for (i = 0; i < 1000; i++){p[i] = 0x55;}//读操作for (i = 0; i < 1000; i++){if (p[i] != 0x55) {return -1;}}return 0;}#include "uart.h"
#include "sc2440_so.h"
#include "NOR.h"
#include "led.h"
int main(void)
{unsigned char c;UART_init();puts("Please enter the numbesr:\n\r");while (1){c = getchar();putchar(c);if (c == '1') {SDARMA_init();if(init_test() == 0){LED_on();}}else{puts("Error: Please retype:\n\r");}}return 0;
}
相关文章:
04:2440---内存控制器
目录 一:介绍 1:引入 2:概念 3:通信 A:片选信号 B:片选信号的地址空间范围 4:地址线 A:不同位数的接法 B:访问原理 C:访问地址 5:时序 1:NOR FLASH A:2440NOR FLASH时序 B:原理/时序图 C:寄存器 6:SDARM A:访问方式 B:原理图 C:BWSCON D:BANKCON…...
【深度学习】CNN中pooling层的作用
1、pooling是在卷积网络(CNN)中一般在卷积层(conv)之后使用的特征提取层,使用pooling技术将卷积层后得到的小邻域内的特征点整合得到新的特征。一方面防止无用参数增加时间复杂度,一方面增加了特征的整合度…...
基于H1ve一分钟搭好CTF靶场
写在前面 ◉ ‿ ◉ 上一篇文章给大家详细介绍了基于H1ve搭建CTF靶场,以及过程中可能遇到的报错及解决方法,那么这篇文章,我总结了一下,将不会遇到报错的方法给到大家,但是前提是你的服务器最好是一个全新的哦~~~ 我…...
网络篇---第五篇
系列文章目录 文章目录 系列文章目录前言一、如何实现跨域?二、TCP 为什么要三次握手,两次不行吗?为什么?三、说一下 TCP 粘包是怎么产生的?怎么解决粘包问题的?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…...
Git——Git应用入门
将会介绍以下知识: 搭建Git环境和创建Git版本库(init、clone)。文件添加、状态检查、创建注释和查看历史记录。与其他Git版本库交互(pull、push)。解决合并冲突。创建分支列表、列表切换和合并。创建标签。 1、版本控…...
【SpringBoot】Redisson 分布式锁注解和 @Transactional 注解一起使用问题
一、前言 平时使用切面去加分布式锁,是先开启事务还是先尝试获得锁?这两者有啥区别? 业务中怎么控制切面的顺序?切面的顺序对事务的影响怎么避免? 下面程序分析: OverrideTransactionalpublic ReceiveH5…...
Druid数据库连接池框架
1.Druid概述 Druid 是一个开源的数据库连接池框架,用于管理和优化数据库连接的使用。它提供了高效的、可扩展的连接池管理,可以用于 Java 应用程序连接到关系型数据库。 之前有了解过 C3P0 数据库连接池,所谓数据库连接池就是重复利用连接数据…...
Python项目打包
Python项目如何打包? 本指南总结了Python项目打包的最佳实践,主要涉及代码的打包和分发,以及环境和依赖的管理。 0. 一般项目清单 源代码(可使用git托管)数据包(可使用DVC托管)Docker环境镜像…...
ASUS(华硕) B760M-AYW WIFI D4_解决wifi不能使用
1、最近新购买了一套 diy电脑主机,选用的是 ASUS B760M-AYW WIFI D4电脑主板 win10 系统,到货后 发现右下角电脑图标处及网络适配器中 没有wifi选项 首先 在官网和旗舰店客服处,确认了 该主板 有集成wifi模块,鲨鱼鳍天线未安装…...
Postgresql数据库运维统计信息
如果需要使用以下运维信息,需要如下几步 修改postgresql.conf文件 #shared_preload_libraries # (change requires restart)shared_preload_libraries pg_stat_statements重启数据库创建扩展 CREATE EXTENSION IF NOT EXISTS pg_stat_statements;1. 统计信息…...
Python3基础
导包 在 python 用 import 或者 from...import 来导入相应的模块。 将整个模块(somemodule)导入,格式为: import somemodule 从某个模块中导入某个函数,格式为: from somemodule import somefunction 从某个模块中导入多个函数,格式为&#…...
【性能测试】服务器常用的性能指标总结,一文概全...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 压测过程中&#…...
Vue学习笔记-Vuex基本使用
基本使用 初始化数据、配置actions、mutations,操作文件/store/index.js //index.js文件用于创建Vuex中最为核心的store对象 import Vue from vue import Vuex from vuex Vue.use(Vuex) //actions对象用于响应组件中的动作,专门负责业务逻辑 const actions {//函数…...
vue3中的customRef创建一个自定义的 ref对象
customRef 创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制 小案例: 自定义 ref 实现 debounce <template><div style"font-size: 14px;"><input v-model"text" placeholder"搜索关键字"/><…...
动态规划学习——子序列问题
目录 编辑 一,最长定差子序列 1.题目 2,题目接口 3,解题思路及其代码 一,最长定差子序列 1.题目 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列…...
使用 COPY 加速 PostgreSQL 批量插入
文章目录 1.copy命令介紹2.copy vs insert的优势3.测量性能4.结论 1.copy命令介紹 PostgreSQL 中的命令COPY是执行批量插入和数据迁移的强大工具。它允许快速有效地将大量数据插入表中。 COPY命令为批量插入和数据迁移提供了更简单且更具成本效益的解决方案。 可以避免使用诸…...
plotneuralnet和netron结合绘制模型架构图
plotneuralnet和netron结合绘制模型架构图 一、plotneuralnet 本身的操作 模型结构图的可视化,能直观展示模型的结构以及各个模块之间的关系。最近借助plotneuralnet python库(windows版)绘制了一个网络结构图,有一些经验和心得…...
MYSQL 中如何导出数据?
文章目录 前言MySQL 导出数据使用 SELECT ... INTO OUTFILE 语句导出数据SELECT ... INTO OUTFILE 语句有以下属性:导出表作为原始数据导出SQL格式的数据将数据表及数据库拷贝至其他主机 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:…...
GPT-4惨遭削弱,偷懒摸鱼绝不多写一行代码,OpenAI已介入调查
GPT-4再次遭网友“群攻”,原因是“懒”得离谱! 有网友想在Android系统开发一个能够与OpenAI API实时交互的应用。 于是把方法示例链接发给GPT-4,让它参考用Kotlin语言编写代码: 没成想,和GPT-4一来二去沟通半天,GPT-4死活给不出…...
CSS特效020:涌动的弹簧效果
CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...






我们使用HCLK为10ns,所以选择00

Trc我们取70ns, Trp我们设置的为20ns, 所以Tsrc=Trc-Trp=70-20=50ns
64ms/8192bit=7.8ms