PCIe 学习笔记(一)
系列文章目录
【PCIe】链路测试,数字工程师也要会看高速信号眼图!
【PCIe】链路训练状态机(LTSSM) - PCIe链路建立过程概述
【PCIe】PCIe设备的BDF与系统枚举过程
文章目录
- 系列文章目录
- PCIe LTSSM
- **1. 链路训练状态(Training States)**
- **2. 链路重训练状态(Recovery State)**
- **3. 低功耗状态(Power Management States)**
- **4. 其他状态**
- 5. **状态转换示例(以速率提升为例)**
- 6. **关键设计要点**
- PCIe TS1/TS2
- **1. 定义与作用**
- **2. TS1/TS2的Symbol结构**
- **3. TS1与TS2的差异**
- **4. 在LTSSM中的使用场景**
- **5. 编码与速率适配**
- **6. 实际应用示例**
- **7. 常见问题与处理**
- **总结**
- PCIe 位锁定
- **1. 定义与作用**
- **2. 实现机制**
- **3. 在LTSSM中的位置**
- **4. 与其他锁定的关系**
- **5. 设计挑战与优化**
- **6. 实际应用示例**
- **总结**
- PCIe 去偏斜(Deskew)
- **1. 产生原因**
- **2. 功能与作用**
- **3. 实现机制**
- **(1) 硬件级补偿**
- **(2) 协议级协商**
- **4. 在PCIe协议中的位置**
- **5. 典型应用场景**
- **6. 设计挑战**
- **7. 实际案例**
- **总结**
PCIe LTSSM
PCIe中的LTSSM(Link Training and Status State Machine)是物理层核心的状态机,用于管理链路训练、配置和电源管理。其11个状态可分为四类,具体如下:
1. 链路训练状态(Training States)
-
Detect(检测状态)
- 功能:检测对端设备是否存在,通过接收端阻抗判断链路是否连接。
- 子状态:
- Detect.Quiet:发送端进入电气空闲(Electrical Idle),等待接收端信号。
- Detect.Active:提升差分信号电压,检测接收端阻抗是否在40-60Ω范围内。
- 转换条件:检测到有效接收端后进入Polling状态,否则返回Quiet或检测失败。
-
Polling(轮询状态)
- 功能:通过发送TS1/TS2训练序列完成位锁定(Bit Lock)、符号锁定(Symbol Lock)和极性翻转协商。
- 子状态:
- Polling.Active:完成基础同步。
- Polling.Compliance:合规性测试(如信号质量验证)。
- Polling.Configuration:协商链路极性翻转。
- Polling.Speed:确定初始速率(通常为2.5GT/s)。
- 转换条件:同步完成后进入Configuration状态。
-
Configuration(配置状态)
- 功能:协商链路宽度(如x1/x4/x8/x16)、通道号分配及去偏斜(Deskew)。
- 关键步骤:
- Link Number Negotiation:确定链路组编号。
- Lane Number Negotiation:分配通道号。
- Confirm Lane/Link Number:通过TS2序列确认配置。
- 转换条件:配置完成后进入L0状态。
2. 链路重训练状态(Recovery State)
- Recovery(恢复状态)
- 功能:链路异常时重新训练,支持速率/宽度调整或均衡优化。
- 子状态:
- RcvrLock:重新获取位/符号锁定。
- RcvrCfg:协商新速率或宽度。
- Equalization:Gen3及以上需进行均衡(如预加重、后均衡)。
- 触发条件:链路错误、速率切换(如Gen1→Gen3)、低功耗状态退出等。
- 转换条件:均衡完成后返回L0或进入L0s/L1。
3. 低功耗状态(Power Management States)
-
L0s(低功耗活动状态)
- 特点:快速唤醒,仅关闭部分时钟,功耗略高于L0。
- 应用场景:短时空闲时的节能。
-
L1(深度低功耗状态)
- 特点:完全停止时钟,功耗最低,唤醒时间较长。
- 子状态:L1.0(无时钟)、L1.1(部分时钟恢复)、L1.2(完全关闭)。
-
L2(系统级低功耗状态)
- 特点:链路完全关闭,依赖系统电源管理,功耗最低。
- 转换条件:系统进入S3/S4睡眠状态时触发。
4. 其他状态
-
L0(正常工作状态)
- 功能:链路稳定,支持TLP/DLLP数据传输。
- 速率调整:首次进入L0时为2.5GT/s,后续通过Recovery状态提升至5/8GT/s。
-
Hot Reset(热复位状态)
- 功能:软件触发的链路复位,通过TS1序列发送Hot Reset位实现。
- 转换路径:Recovery → Hot Reset → Detect。
-
Loopback(环回状态)
- 功能:用于测试,发送端将接收的数据环回,验证信号完整性。
- 触发条件:诊断测试或错误恢复。
-
Disable(禁用状态)
- 功能:链路完全关闭,需手动配置寄存器恢复。
- 触发条件:设备移除或驱动异常。
5. 状态转换示例(以速率提升为例)
- 上电初始化:Detect → Polling → Configuration → L0(2.5GT/s)。
- 速率协商:L0 → Recovery(协商8GT/s) → Equalization → L0(新速率)。
- 错误恢复:L0 → Recovery → L0(重训练完成)。
6. 关键设计要点
- 兼容性:LTSSM需支持PCIe各版本(Gen1-Gen6),不同速率对均衡要求不同。
- 功耗优化:L0s/L1/L2状态通过关闭时钟或降低信号活动实现节能。
- 错误处理:Loopback和Recovery状态用于链路自愈,确保稳定性。
通过LTSSM的精细状态管理,PCIe实现了从物理层初始化到高速数据传输的全流程自动化控制。
PCIe TS1/TS2
PCIe中的TS1(Training Sequence 1)和TS2(Training Sequence 2)是物理层链路训练的核心有序集(Ordered Set),主要用于链路初始化、参数协商和状态转换控制。以下是其详细解析:
1. 定义与作用
- TS1:由16个Symbol(字符)组成,用于检测链路配置信息(如速率、宽度、均衡参数等),并触发接收端进行位/符号锁定。
- TS2:同样由16个Symbol组成,用于确认TS1的检测结果,并完成链路参数的最终协商。
- 核心功能:
- 链路参数交换:协商速率(2.5GT/s/5GT/s/8GT/s等)、链路宽度(x1/x4/x8/x16)、均衡模式等。
- 状态机控制:驱动LTSSM状态转换(如Polling→Configuration)。
- 错误恢复:通过发送特定命令(如Hot Reset、Loopback)处理链路异常。
2. TS1/TS2的Symbol结构
每个TS序列包含16个Symbol,其关键字段如下(以8b/10b编码为例):
Symbol序号 | 功能描述 | 典型内容示例 |
---|---|---|
Symbol 0 | 序列起始标识 | COM(Control)字符,复位接收端LFSR寄存器。 |
Symbol 1 | 链路号(Link Number)占位符 | 初始阶段为空(PAD字符),配置阶段填充实际链路号。 |
Symbol 2 | 通道号(Lane Number)占位符 | 初始阶段为空,配置阶段填充实际通道号。 |
Symbol 3 | N_FTS(Fast Training Symbol数量),决定接收端PLL锁定所需的FTS序列个数 | 例如:0b011 表示需要发送8个FTS序列。 |
Symbol 4 | 速率与控制位: | - 低3位:支持速率(如011 =支持8GT/s)- 第6位:De-emphasis使能 - 第7位:速率切换请求。 |
Symbol 5 | 命令字段: | - 第0位:Hot Reset - 第1位:Disable Link - 第2位:Loopback - 第4位:Disable Scrambling。 |
Symbol 6~15 | 均衡参数与状态标识: | - Gen1/Gen2:D10.2编码(TS1)或D5.2编码(TS2) - Gen3+:均衡模式(如EQ Bypass)。 |
3. TS1与TS2的差异
特性 | TS1 | TS2 |
---|---|---|
主要用途 | 发送链路配置请求 | 确认TS1的配置并完成协商 |
Symbol 6~15编码 | D10.2(8b/10b编码) | D5.2(8b/10b编码) |
状态机转换 | 触发Polling状态下的参数检测 | 确认参数后进入Configuration状态 |
4. 在LTSSM中的使用场景
-
Polling.Active状态:
- 发送端交替发送TS1和TS2序列,检测对端链路参数。
- 若连续收到8个TS1(Gen1/Gen2)或8个TS1-TS2对(Gen3+),则判定链路连续。
-
Configuration状态:
- 通过TS2确认链路宽度、速率等参数,完成协商后进入L0状态。
-
Recovery状态:
- 链路异常时重新发送TS1/TS2,调整均衡参数或速率。
5. 编码与速率适配
- 8b/10b编码(Gen1/Gen2):
- TS1/TS2始终不加扰,通过D10.2/D5.2编码标识序列类型。
- 128b/130b编码(Gen3+):
- TS1/TS2需加扰,Symbol 6~9用于标识序列类型。
- Modified TS1/TS2:
- 在Gen3及以上版本中,修改Symbol 6~15的均衡字段,支持更灵活的均衡协商。
6. 实际应用示例
- 速率协商:若发送端支持8GT/s,TS1的Symbol 4第7位置1,接收端通过TS2确认后切换速率。
- 均衡调整:TS1的Symbol 6~15携带均衡模式(如Pre-Emphasis Level),接收端根据信号质量反馈调整。
7. 常见问题与处理
- TS序列不连续:若未收到足够连续的TS序列,LTSSM退回Detect状态重新初始化。
- 命令冲突:如同时收到Hot Reset和Disable Scrambling命令,优先处理Hot Reset。
总结
TS1和TS2是PCIe物理层链路训练的核心机制,通过有序集的交互实现参数协商与状态控制。其设计兼顾了灵活性与兼容性,支持从Gen1到Gen6的速率演进,并通过Modified TS优化了高速链路的均衡能力。
PCIe 位锁定
位锁定(Bit Lock)是PCIe物理层链路训练的核心步骤之一,其核心目标是确保接收端能够正确识别发送端传输的每一位数据的起始和结束位置,从而为后续的字符/块锁定及数据解析奠定基础。以下是其详细解析:
1. 定义与作用
- 定义:位锁定指接收端通过时钟恢复电路(Clock and Data Recovery, CDR)从接收到的差分信号中提取与发送端同步的时钟信号,确保数据采样点准确对齐到信号边沿(如上升沿或下降沿)的过程。
- 作用:
- 消除时钟偏差:解决发送端与接收端时钟频率或相位差异,避免数据采样错误。
- 基础同步:为后续字符锁定(Symbol Lock)和块锁定(Block Lock)提供稳定的时钟基准。
- 链路稳定性保障:确保数据流的连续性和正确性,避免因时钟不同步导致的数据包丢失或误码。
2. 实现机制
- 嵌入式时钟(Embedded Clock):PCIe采用串行传输,发送端仅发送数据信号,时钟信息隐含在数据流的过渡边沿(如0→1或1→0)中。接收端需通过CDR从数据流中恢复时钟。
- CDR电路工作原理:
- 相位调整:通过锁相环(PLL)动态调整采样时钟相位,使其与数据信号边沿对齐。
- 训练序列辅助:发送端在Polling状态发送特定模式(如连续的
1010...
或Jitter Tolerance Pattern),帮助接收端快速锁定时钟。
- 收敛条件:当接收端连续正确采样数据位(如连续检测到预期的逻辑电平变化),即判定位锁定完成。
3. 在LTSSM中的位置
- 触发阶段:位锁定主要在Polling状态完成,具体通过发送TS1(Training Sequence 1)和TS2(Training Sequence 2)有序集实现。
- 状态转换:
- 成功:位锁定完成后,进入字符锁定(Gen1/Gen2)或块锁定(Gen3)阶段。
- 失败:若超时未锁定,可能触发Recovery状态重新训练。
4. 与其他锁定的关系
- 字符锁定(Symbol Lock):位锁定完成后,接收端通过识别8b/10b编码的控制字符(如K28.5)确定字符边界。
- 块锁定(Block Lock):Gen3及以上版本采用128b/130b编码,需通过块锁定同步更长的数据块。
- 依赖关系:位锁定是字符/块锁定的前提,三者共同构成物理层同步的完整流程。
5. 设计挑战与优化
- 抖动容忍:需支持Jitter Tolerance Pattern(如JTP)以应对信号抖动,确保锁定鲁棒性。
- 高速场景优化:在Gen4/Gen5(16GT/s及以上)中,需采用更复杂的CDR算法(如多相位插值)应对高频信号失真。
- 功耗平衡:CDR电路需在高速运行时保持低功耗,避免影响整体能效。
6. 实际应用示例
- 场景:当x1 PCIe设备插入x16插槽时,接收端通过位锁定同步发送端的时钟,随后协商链路宽度为x1。
- 故障排查:若位锁定失败,可能因信号完整性差(如过冲、反射)或CDR参数配置错误导致,需通过示波器分析眼图或调整均衡参数。
总结
位锁定是PCIe链路初始化的关键步骤,通过CDR电路和训练序列实现时钟同步,直接影响链路的稳定性和数据传输可靠性。其完成标志着物理层从电气空闲状态过渡到有效数据传输阶段,为后续高层协议(如数据链路层)的运行提供基础支持。
PCIe 去偏斜(Deskew)
去偏斜(Deskew)是PCIe多通道链路中用于补偿不同通道间信号传输时延差异的关键机制,其核心目标是确保同一链路内所有通道的数据在接收端能够同步对齐,避免因物理路径差异导致的数据错位或错误。以下是其详细解析:
1. 产生原因
在PCIe多通道(Lane)传输中,即使发送端采用同一时钟源,各通道的信号仍可能因以下原因产生时延差异(Skew):
- 物理路径差异:不同通道的走线长度、阻抗不匹配或电路板布局差异。
- 串化/解串延迟:发送端和接收端的串行器(Serializer)与解串器(Deserializer)引入的固有延迟差异。
- 温度/电压波动:环境因素导致信号传播速度变化。
- 均衡参数差异:不同通道的预加重(Pre-emphasis)或后均衡(Post-emphasis)设置不一致。
2. 功能与作用
- 时序对齐:调整各通道数据的采样点,确保同一链路内所有通道的比特流在接收端同步。
- 误码率降低:减少因时延差异导致的采样错误,提升链路可靠性。
- 支持多通道聚合:在x4/x8/x16等高宽度链路中,Deskew是保证通道间协同工作的必要条件。
3. 实现机制
(1) 硬件级补偿
- 延迟线(Delay Line):在接收端为每个通道插入可调延迟电路,补偿通道间时延差异。
- 同步FIFO:通过缓冲和时钟调整实现多通道数据对齐(如搜索结果中提到的同步FIFO方案)。
- 均衡器(Equalizer):在Gen3及以上版本中,通过预加重/后均衡调整信号幅度和相位,间接优化时延一致性。
(2) 协议级协商
- LTSSM配置阶段:在Polling和Configuration状态中,链路两端交换通道特性信息(如延迟范围),协商Deskew参数。
- 动态调整:在Recovery状态中,根据链路质量动态调整均衡参数或重新训练Deskew。
4. 在PCIe协议中的位置
- 配置阶段(Configuration State):完成通道号分配后,启动Deskew流程,通过发送端和接收端的交互完成时延补偿。
- 恢复阶段(Recovery State):链路异常时重新执行Deskew,适应环境变化或速率切换。
5. 典型应用场景
- 长距离传输:如背板互连中,不同通道的PCB走线长度差异显著。
- 高密度连接器:多通道连接器(如PCIe插槽)因插针位置不同引入时延差异。
- 多芯片级联:级联系统中,各芯片间的信号路径差异需通过Deskew补偿。
6. 设计挑战
- 动态范围要求:需覆盖从几纳秒到几十纳秒的时延补偿范围。
- 功耗与面积:硬件补偿电路(如延迟线)需兼顾低功耗和小型化。
- 高速适应性:在Gen4/Gen5(16GT/s及以上)中,需应对更严格的时序容差。
7. 实际案例
- 同步FIFO方案:在接收端为每个通道配置FIFO,通过时钟相位调整对齐数据(参考)。
- 自适应均衡:Gen3及以上版本通过动态调整均衡参数间接优化Deskew效果。
总结
去偏斜是PCIe多通道链路稳定性的核心保障机制,通过硬件补偿与协议协商的结合,解决了物理层信号传输中的时延差异问题。其设计需综合考虑链路长度、速率、环境因素及功耗限制,是PCIe高速互连技术中不可或缺的一环。
☆
相关文章:
PCIe 学习笔记(一)
系列文章目录 【PCIe】链路测试,数字工程师也要会看高速信号眼图! 【PCIe】链路训练状态机(LTSSM) - PCIe链路建立过程概述 【PCIe】PCIe设备的BDF与系统枚举过程 文章目录 系列文章目录PCIe LTSSM**1. 链路训练状态(Training States&#…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——LED、按键测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试4.1 LED…...
深度为16,位宽8bit的单端口SRAM——学习记录
链接: 【Verilog HDL 训练】第 13 天(存储器、SRAM)-云社区-华为云 module sram #(parameter ADDR_BITS4)(input clk,input [ 7:0] addr,input [ 7:0] din,input ce,input we,output reg [ 7:0] dout);localparam MEM_DEPTH 1<<ADDR_…...
面向对象编程
在面向对象编程中,除了通过创建类的实例来访问其属性和方法外,还可以通过在一个类里创建另一个类的属性(本质上也是持有另一个类的实例引用)的方式来访问该类的属性和方法。下面为你详细解释这两种方式: 1. 通过创建实…...
远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态?
远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态? 查看Linux发行版信息 查看发行版名称和版本: cat /etc/*-release或 lsb_release -a查看内核版本&#…...
简单socket通信,回显 服务器程序与客户端程序之间的通信。
Socket 通信编程是一种基于网络的通信方式,允许不同主机上的程序通过网络进行数据交换。 实现结构try catch: 前情了解: 1.如何创建服务器端 定义ServerSocket套接字,需要等待客户端连接,阻塞,直到接入连接…...
C# 基类型和派生类型之间的转型
1.什么是基类型和派生类 基类型:父类,所有子类都继承自它。 派生类型:子类,继承了父类的属性和方法,还可以添加自己的新功能。 例子: class Animal { }//基类型 class Dog : Animal { }//派生类型 这…...
深度学习--激活函数
激活函数通过计算加权和并加上偏置来确定神经元是否应该倍激活,它们将输入信号转换为输出的可微运算。大多数激活函数都是非线性的,由于激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。 1 RelU函数 最受欢迎的激活函数是修正线性…...
MySQL 缓存机制全解析:从磁盘 I/O 到性能优化
MySQL 缓存机制全解析:从磁盘 I/O 到性能优化 MySQL 的缓存机制是提升数据库性能的关键部分,它通过多级缓存减少磁盘 I/O 和计算开销,从而提高查询和写入的效率。 1. 为什么需要缓存? 数据库的性能瓶颈通常集中在磁盘 I/O 上。…...
【项目管理】第17章 项目干系人管理-- 知识点整理
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 第6章 项目管理概论 4分第13章 项目资源管理 3-4分第7章 项目…...
编程语言到mysql ‘\‘到数量关系
在 MySQL 的模糊查询中,反斜杠 \ 的转义规则需要根据 转义层级 和 SQL 模式 来确定。以下是详细说明及示例: 一、默认模式下(未启用 NO_BACKSLASH_ESCAPES) 1. 规则说明 反斜杠转义:\ 是 MySQL 的默认转义字符。 转义…...
本地生活服务平台搭建方案详解:同城跑腿外卖系统源码一体化开发
在数字化浪潮不断推进的今天,本地生活服务平台正逐渐成为人们日常生活中不可或缺的一部分。从点餐外卖到同城帮买、帮送、帮取,用户对即时服务的需求愈发强烈。与此同时,创业者和本地商家也纷纷看好“同城服务 外卖配送”的一体化平台模式&a…...
索引语法SQL性能分析索引的使用
目录 准备: 一.索引语法 1). 创建索引 2). 查看索引 3). 删除索引 4).使用索引查询和普通查询的区别 二.SQL性能分析 1.SQL执行频率 2.慢查询日志 3.profile详情 4.explain 三.索引的使用 1.最左前缀法则 2.范围查询 3.索引失效情况 索引列运算 字符串不加引号…...
Docker技术基础新手入门教程
Docker技术深度解析:从架构到实战的运维指南 一、Docker核心架构与组件详解1. 什么是Docker?1. Docker引擎(Docker Engine)2. Docker对象模型二、关键技术深度剖析1. 容器隔离机制2. 容器网络模型网络驱动类型自定义网络实战3. 存储卷与数据持久化三种挂载方式对比示例:My…...
NO.93十六届蓝桥杯备战|图论基础-拓扑排序|有向无环图|AOV网|摄像头|最大食物链计数|杂物(C++)
有向⽆环图 若⼀个有向图中不存在回路,则称为有向⽆环图(directed acycline graph),简称 DAG 图 AOV⽹ 举⼀个现实中的例⼦:课程的学习是有优先次序的,如果规划不当会严重影响学习效果。课程间的先后次序可以⽤有向图表⽰ 在…...
Rust泛型与特性
文章目录 泛型函数中的泛型结构体与枚举中的泛型特性(trait)默认特性Trait作为参数特性做返回值 给结构体实现方法 泛型 泛型编程是现代编程语言中重要的机制 C是通过模板来实现泛型的,而C语言中是没有泛型的 泛型是用来表达抽象类型的机制…...
Day08【基于预训练模型分词器实现交互型文本匹配】
基于预训练模型分词器实现交互型文本匹配 目标数据准备参数配置数据处理模型构建主程序测试与评估总结 目标 本文基于预训练模型bert分词器BertTokenizer,将输入的文本以文本对的形式,送入到分词器中得到文本对的词嵌入向量,之后经过若干网络…...
基于uniapp 实现画板签字
直接上效果图 代码 <template><view class"container"><!-- 签名画布 --><view class"canvas-container"><canvas canvas-id"signCanvas" class"sign-canvas"touchstart"handleTouchStart"touc…...
5.跳表(skiplist)
1. 什么是跳表 -skiplist skiplist 本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key 或者 key/value 的查找模型。 skiplist ,顾名思义,首先它是一个 list 。实际上…...
GitHub 封禁中国 IP:影响、原因及应对
在技术全球化的当下,代码托管平台如同开发者的 “数字仓库”,而 GitHub 无疑是其中最广为人知的一座。但在 2025 年 4 月 13 日,一则令人震惊的消息在国内开发者社群中炸开了锅 ——GitHub 疑似封禁中国 IP。一时间,这一事件迅速成…...
基于工业操作系统构建企业数字化生态的实践指南
一、工业操作系统选型策略 工业操作系统(IIoT OS)的选型需从功能适配性、技术成熟度、生态兼容性三个维度综合评估。以玉麟科技DIOS平台为例,其 "云端 终端" 架构支持全球设备管理,通过工业知识模型实现设备健康度预测…...
金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应”
金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应” 在2025年第一季度京东工业平台“电料辅件-安全工器具”热销品牌的激烈竞争中,金能电力以一组极具说服力的数据,向行业展示了何为“绝对头部”。从成交金额、销量到流量、客群覆…...
基于大模型的反流食管炎手术全流程风险预测与治疗方案研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究方法与创新点 二、反流食管炎概述 2.1 定义与发病机制 2.2 临床症状与诊断标准 2.3 流行病学现状 三、大模型技术原理与应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用案例 3.3 用于反流食管炎预测的优势 四…...
探索 C 与 Java/Kotlin 的语言差异:从指针到高阶函数
作为一名熟悉 Java 和 Kotlin 的开发者,初次接触 C/C 时常会遇到一系列概念上的“文化冲击”。本文将从几个关键点出发,帮助你更好地理解 C/C 与 Java/Kotlin 在语言设计上的核心区别。 1. 指向未知类型的指针 void*、结构体指针访问 ->、空指针常量 …...
Redis之缓存过期淘汰策略
面试切入点 Redis内存满了怎么办? redis的默认内存多少?在哪里查看?如何设置修改? 查看redis最大占用内存 打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。 redi…...
Rust-引用借用规则
目录 一、概述 二、借用规则 三、详细解释 3.1 第一条规则 3.2 第二条规则 3.3 第三条规则 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rust-引用借用规则] ❤博主广交技术好友,喜欢文章的可以关注一下❤ 一、概述 Rust为确保程序在运行时不…...
【报错】解决pytorch出现RuntimeError: An attempt has been made to start a new process...
此错误是由于在 Windows 系统中使用多进程时,没有正确使用 if __name__ __main__: 语句块造成的。在 Windows 里,多进程的启动方式是 spawn,并非 fork,所以必须在主模块中使用 if __name__ __main__: 语句块来避免子进程重复执行…...
游戏引擎学习第228天
对上次的内容进行回顾,并为今天的开发环节做铺垫。 目前大部分功能我们已经完成了,唯一剩下的是一个我们知道存在但目前不会实际触发的 bug。这个 bug 的本质是在某些线程仍然访问一个已经被销毁的游戏模式(mode)之后的状态&…...
Pytorch Hook 技巧
通过 functools.partial 扩展 Pytorch Hook 机制 阅读 atom 文章源码时学习到的技巧,mark一下 通过 functools.partial,开发者无需修改原始函数或 PyTorch 的 Hook 机制,即可实现参数扩展与接口适配,这是 Python 函数式编…...
Python multiprocessing模块介绍
multiprocessing 是 Python 标准库中的一个模块,用于实现多进程并行计算,可以在多核 CPU 上显著提升程序性能,尤其适用于 CPU 密集型任务。Python 的多线程由于 GIL(全局解释器锁)限制,在进行 CPU 密集型任…...
[特殊字符] LoRA微调大模型实践:从MAC到Web的全流程指南
🚀 实践步骤概览 今天我们要在MAC上完成一个完整的AI项目闭环: 微调一个大模型 → 2. 导出模型并部署 → 3. 暴露API给web后端 → 4. 前端展示 🛠️ 微调模型准备 核心配置 框架:LLama-Factory 🏭 算法:…...
第二天 通过脚本控制物体移动和旋转
一、Unity脚本编程基础认知 1.1 为什么说脚本是Unity的灵魂? Unity引擎的核心架构采用ECS(Entity-Component-System)模式,脚本作为组件的具体实现,控制着游戏对象的所有行为。统计显示,一个中等规模的Uni…...
在SpringBoot中访问 static 与 templates 目录下的内容
目录 步骤一:添加 Thymeleaf 依赖 (处理 Templates 目录)步骤二:配置静态资源路径 (可选但建议了解)步骤三:访问不同目录下的 HTML 文件访问 static 目录下的 HTML 文件访问 templates 目录下的 HTML 文件 总结 在使用 Spring Boot 开发 Web …...
常见的 API 设计风格
在软件开发中,常见的 API 设计风格主要有以下几种,每种风格适用于不同的场景和需求: 1. RESTful API (主流) 特点: 基于 HTTP 协议,使用标准方法(GET/POST/PUT/DELETE)资源导向(UR…...
Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行
Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行 Grass如何在DePIN项目丛林中脱颖而出? 答案在于其"零门槛"策略——用户是基石,其他一切皆为杠杆。 Grass通过"技术+模式"双轮驱动打破行业内卷:零知识证明技术与Solana Layer2架构确保数据真实…...
ERR_PNPM_DLX_NO_BIN No binaries found in tailwindcss
场景复现: 最近在vue3项目中安装了tailwindcss,但是它默认帮我安装的版本是4XX的,导致我执行 npx tailwindcss init -p报错了。 解决方案: 更改tailwindcss的版本为3 pnpm add -D tailwindcss3再次执行生成tailwindcss的初始…...
2025“钉耙编程”中国大学生算法设计春季联赛(6)(1001,1003,1008):1007
不知道为啥,感觉后面的联赛题目有挺多出的是模拟题目(这三道题目难度依次递增) 1001 #include<bits/stdc.h> using namespace std; #define int long long const int op1e97; const int o1e34;inline void solve(){int n,a,b,c;cin>…...
Leetcode 2814. 避免淹死并到达目的地的最短时间
1.题目基本信息 1.1.题目描述 现给定一个 n * m 的索引从 0 开始的二维字符串网格 land,目前你站在为 “S” 的单元格上,你需要到达为 “D” 的单元格。在这片区域上还有另外三种类型的单元格: “.”:这些单元格是空的。 “X”…...
4.15【A】pc homework3~
5 假设read_document函数可以实现读取第m个文件,并返回该文本文档的每行数据 那么考虑双层并行结构,外层为文档级并行,内层为每个文档内的行级并行 动态分配文档任务,避免线程闲置 #include <omp.h> int total_words …...
aslist和list的区别
Arrays.asList和List的主要区别在于它们的固定长度和不可变性、与原始数组的关系、性能以及使用场景。 一、固定长度和不可变性 Arrays.asList:通过Arrays.asList方法创建的List是一个固定长度的List,其长度与原始数组相同。这意味着你不能通过添…...
Notepad++中将文档格式从Windows(CR LF)转换为Unix(LF)
在Windows中用记事本写了一个.sh的Linux运行脚本,是无法直接在Linux中执行,需要首先把文本编码格式转换为Unix的,特别是换行符这些,转换步骤如下: 1、打开文档 在Notepad中打开需要转换的文件。 2、进入文档格式转换…...
控制理论与应用Latex模版/中文Latex
报错1 ! Package CJK Error: Invalid character code. 解决方法: 用记事本打开tex文件 另存为,选择utf-8格式 ! paragraph ended before \mulearg was complete. 备注,控制理论与应用有个自己的模版内容,是通过导入方式调用…...
Linux指令和权限(10-3)
部分指令和权限 一丶指令 1.echo echo的基础作用向显示器输出。作用类似于C语言的printf,C的cout。 1.1 echo 输入内容 – 会显示输出到屏幕的下一行 echo "hello Linux"1.2 echo 输入内容>目标文件 – 向目标文件输出内容(输出重定向&…...
算法堆排序记录
【算法】排序算法之堆排序 - 知乎 应用场景:获取第n个大或者小的数 操作步骤: 1、将数组构造成堆 2、调整根节点为最大堆 ->倒序对每个根节点执行最大化 ->根节点最大化过程中如果发生交换,需要保证子节点也为最大堆(执行…...
2025年第十六届蓝桥杯省赛JavaB组真题回顾
第16届蓝桥杯省赛已经结束了,第一次参加也是坐牢了4个小时,现在还是来总结一下吧(先声明以下的解法,大家可以当作一种思路来看,解法不一定是正解,只是给大家提供一种能够正常想到的思路吧) 试题…...
qt 事件及事件过滤
在 Qt 中,事件是对象与用户或系统交互的基本方式。Qt 通过事件机制使得控件和其他对象可以响应用户的操作(如鼠标点击、键盘输入等),以及其他系统级事件(如窗口大小变化、定时器事件等)。 Qt 事件处理机制…...
RPCRT4!OsfCreateRpcAddress函数分析之AssociationBucketMutexMemory数组的填充
第一部分: 1: kd> p RPCRT4!OsfCreateRpcAddress0x28: 001b:77c0f4f5 e888e5ffff call RPCRT4!OSF_ADDRESS::OSF_ADDRESS (77c0da82) 1: kd> t RPCRT4!OSF_ADDRESS::OSF_ADDRESS: 001b:77c0da82 ?? ??? 1: kd> kc # 00 RPCRT4!…...
lvs + keepalived + dns 高可用
项目题目 实验步骤: 1.规划各自IP地址: 以lb-backup为例,修改ip地址即可 [rootlb-backup ~]# nmcli connection modify ens160 ipv4.addresses 192.168.72.106/24 ipv4.dns 223.5.5.5 ipv4.gateway 192.168.72.2 ipv4.method manual connection.autoc…...
多模态医学AI框架Pathomic Fusion,整合了组织病理学与基因组的特征
小罗碎碎念 在医学AI领域,癌症的精准诊断与预后预测一直是关键研究方向。 这篇文章提出了Pathomic Fusion这一创新框架,致力于解决现有方法的局限。 传统上,癌症诊断依赖组织学与基因组数据,但组织学分析主观易变,基因…...
安卓基础(SQLite)
基础 import sqlite3# 连接到数据库 conn sqlite3.connect(mydatabase.db) cursor conn.cursor()# 执行查询 cursor.execute("SELECT * FROM users") rows cursor.fetchall()for row in rows:print(row)# 关闭连接 conn.close() 创建一个继承自 SQLiteOpenHelpe…...