当前位置: 首页 > news >正文

【驱动设计的硬件基础】PCI和PCI-E

打开电脑主机,你会看到主板上一排长短不一的插糟:矮胖的 PCI 插糟还插着古老的声卡,旁边细长的 PCI-E 插糟则牢牢卡住显卡、高速网卡等核心设备。这些看似普通的插糟,其实是计算机硬件沟通的 "高速公路",承载着 CPU 与外设之间的海量数据传输。 


目录

一、技术演进:从PCI到PCI-E的跨越

1.1 PCI总线的历史使命

1.2 PCI-E的革命性突破

二、PCI:让外设 "自己报家门" 的第一代通用总线

2.1 为什么 ISA 被淘汰?老电脑的 "手动模式"

2.2 PCI 的三大 "革命性" 设计

2.3 PCI 的 "硬伤":并行传输的天花板

三、PCI-E:串行技术如何 "逆袭"?

3.1 从 "多车道堵车" 到 "单车道高铁"

3.2 PCI-E 的 "可扩展" 魔法

3.3 PCI-E 如何兼容老设备?

四、PCI 配置空间:驱动工程师的 "说明书"

4.1 256 字节里的 "核心情报"

4.2 BARs:设备的 "内存申请单"

4.3 怎么访问配置空间?

五、驱动开发实战:从识别设备到控制硬件

5.1 第一步:让系统 "认识" 你的设备

5.2 第二步:给设备 "分地盘"

5.3 第三步:处理中断 —— 让设备 "会敲门"

5.4 第四步:电源管理 —— 让设备 "该睡就睡"

六、常见问题与避坑指南

6.1 兼容性问题:老设备的 "水土不服"

6.2 性能优化:让硬件 "跑满"

6.3 调试工具:查问题的 "神器"

七、未来:PCI-E 的下一站


一、技术演进:从PCI到PCI-E的跨越

1.1 PCI总线的历史使命

PCI总线采用32/64位并行传输架构,工作频率33MHz,通过树形拓扑结构连接设备。其核心设计包含:

  • HOST主桥:作为CPU存储域与PCI总线域的隔离桥梁,完成地址转换与DMA操作
  • PCI桥:支持总线扩展,形成多层级总线树状结构
  • 配置空间:256字节标准化区域,存储厂商ID、设备ID、BAR寄存器等关键信息

典型应用场景包括:

  • 传统网卡/声卡连接
  • 早期显卡数据传输
  • 工业控制设备的低速扩展

1.2 PCI-E的革命性突破

为突破并行总线的物理极限,PCI-SIG组织推出PCI-E标准,核心改进体现在:

  • 串行差分信号:采用8b/10b编码(后升级为128b/130b),抗干扰能力提升
  • 点对点拓扑:每个设备独享带宽,通过Switch实现多设备互联
  • 动态链路调整:支持x1/x4/x8/x16多种通道配置,带宽线性扩展

传输速率演进表:

版本发布年份单通道速率x16带宽
1.020032.5GT/s4GB/s
3.020108GT/s15.7GB/s
5.0201932GT/s63GB/s
7.02023(草案)128GT/s256GB/s

二、PCI:让外设 "自己报家门" 的第一代通用总线

2.1 为什么 ISA 被淘汰?老电脑的 "手动模式"

20 世纪 80 年代的电脑用 ISA 总线,插个声卡像玩拼图:

  • 得手动设置 IRQ 中断号(比如选 3 或 5),稍不注意就和其他设备冲突;
  • 数据传输靠 16 位并行线,最快只能跑 16MB/s,传个大文件能急死人;
  • 不同设备(显卡、声卡、Modem)插槽形状各异,主板设计像 "打补丁"。

1992 年,PCI(Peripheral Component Interconnect)总线横空出世,第一次实现了即插即用—— 设备自己带着 "简历"(配置空间),系统能自动识别并分配资源。

2.2 PCI 的三大 "革命性" 设计

1. 256 字节的 "电子身份证":配置空间

每个 PCI 设备内部都有一块 256 字节的存储区域,叫配置空间。里面存着:

  • 厂商 ID(比如 Intel 是 0x8086,NVIDIA 是 0x10DE);
  • 设备 ID(具体型号,比如 RTX4090 是 0x2684);
  • 基地址寄存器(BARs,告诉系统 "我需要多少内存 / IO 空间");
  • 中断信息、电源管理能力等关键参数。

操作系统开机时会逐个读取这些信息,就像查户口一样:"你是哪家厂的?要占多少内存?需要什么中断?" 确认无误后,才会加载对应的驱动。

2. 并行传输的 "8 车道高速"

PCI 用 32 位(后期 64 位)并行数据线,搭配 33MHz 时钟,带宽达到 133MB/s(64 位时 533MB/s)。打个比方:

  • ISA 总线像双向单车道,每次只能传 2 字节;
  • PCI 像 8 车道高速,能同时传 4 字节(32 位),速度直接翻 10 倍。

3. 统一插槽:"万能接口" 时代开启

PCI 插槽统一了显卡、声卡、网卡的接口标准。主板上只要留一排 PCI 插槽,就能兼容各种外设 —— 这对当时的 DIY 玩家来说,简直是 "装机福音"。

2.3 PCI 的 "硬伤":并行传输的天花板

到了 2000 年,显卡开始支持 3D 游戏,每秒要传几 GB 的纹理数据。PCI 的并行总线却遇到了物理瓶颈

  • 并行线像一排并排的电线,高速传输时信号会互相干扰(串扰),频率难超过 33MHz;
  • 所有设备共享总线,就像多辆车抢同一根车道,显卡传数据时,声卡得排队等;
  • 32 位地址空间不够用,大内存设备(比如 8GB 显存的显卡)无法直接寻址。

三、PCI-E:串行技术如何 "逆袭"?

3.1 从 "多车道堵车" 到 "单车道高铁"

2003 年,PCI-E(PCI Express)登场,彻底颠覆了并行传输的思路:

  • 差分信号:用一对反向的信号线(+ 和 -)传数据,抗干扰能力是单端信号的 10 倍;
  • 串行传输:每个通道(Lane)只传 1 位数据,像高铁轨道一样 "单线高速";
  • 点对点连接:每个设备独占通道,显卡用 x16 通道,网卡用 x1 通道,互不干扰。

举个生活例子:PCI 像早高峰的 8 车道公路,车多了容易堵;PCI-E 像多条独立的高铁轨道,每根轨道跑一列高速列车,速度和稳定性都翻倍。

3.2 PCI-E 的 "可扩展" 魔法

PCI-E 的灵活性体现在两个维度:

1. 速率代际:从 2.5GT/s 到 32GT/s

每一代 PCI-E 的单 Lane 速率翻倍(GT/s = 十亿传输 / 秒):

  • Gen1:2.5GT/s → 单向带宽 250MB/s(8b/10b 编码后);
  • Gen2:5GT/s → 500MB/s;
  • Gen3:8GT/s → 985MB/s(改用 128b/130b 编码,效率更高);
  • Gen5:32GT/s → 3.94GB/s(x16 时双向带宽 64GB/s)。

2. 通道数(Lane):按需分配

PCI-E 插槽支持 x1、x4、x8、x16 等多种通道数:

  • x1:给无线网卡、USB 扩展卡用,带宽足够;
  • x4:给 NVMe 固态盘用,满足 GB 级读写;
  • x16:给显卡用,跑满 Gen5 的 64GB/s 带宽。

3.3 PCI-E 如何兼容老设备?

主板上的 PCI-E 插槽能插 PCI 设备吗?答案是,靠的是 "翻译官"——PCI 桥接芯片:

  • 把 PCI 的并行信号转成 PCI-E 的串行数据包(TLP);
  • 保留 PCI 的 32 位地址空间,同时支持 PCI-E 的 64 位扩展;
  • 把 PCI 的电平中断转成 PCI-E 的消息中断(MSI),避免中断冲突。

四、PCI 配置空间:驱动工程师的 "说明书"

4.1 256 字节里的 "核心情报"

PCI(包括 PCI-E)设备的配置空间是驱动开发的关键,前 64 字节是核心区域:

偏移(十六进制)名称作用
0x00-0x01Vendor ID厂商 ID(如 0x10DE 是 NVIDIA)
0x02-0x03Device ID设备 ID(如 0x2684 是 RTX4090)
0x08-0x0BRevision ID硬件版本号(区分同一型号的不同批次)
0x0C-0x0FClass Code设备类别(如 0x030000 是显卡,0x0C0300 是 USB3.0 控制器)
0x10-0x1FBAR0~BAR5基地址寄存器(声明设备需要的内存 / IO 空间)
0x30Capabilities ptr指向扩展功能链表(如 MSI、电源管理等高级特性)

小技巧:Windows 设备管理器里右键设备→属性→详细信息→选择 "硬件 ID",看到的 "PCI\VEN_10DE&DEV_2684" 就是从 Vendor ID 和 Device ID 来的。

4.2 BARs:设备的 "内存申请单"

驱动要和硬件通信,必须知道硬件寄存器的地址。BARs(基地址寄存器)就是设备的 "内存申请单":

  • 类型判断:往 BAR 寄存器写全 1(0xFFFFFFFF),读回来的结果最低位如果是 0,表示申请的是内存空间;如果是 1,表示 IO 空间。
  • 地址计算:假设读回的 BAR0 值是 0xFF000000(最低位为 0),说明设备需要从 0xFF000000 开始的一段内存空间,大小由 BAR 的 "地址掩码" 决定(比如掩码是 0x000FFFFF,说明需要 1MB 空间)。
// Linux驱动中读取BAR的示例代码
struct pci_dev *pdev; // 设备指针
unsigned long bar_addr = pci_resource_start(pdev, 0); // 第一个BAR的基地址
unsigned long bar_size = pci_resource_len(pdev, 0); // BAR的空间大小
void __iomem *regs = ioremap(bar_addr, bar_size); // 映射到内核虚拟地址

4.3 怎么访问配置空间?

1. 硬件层面:PCI 配置寄存器

PCI 设备通过两个特殊寄存器(CONFIG_ADDRESS 和 CONFIG_DATA)访问配置空间:

  • CONFIG_ADDRESS(端口 0xCF8):写入要访问的设备地址(总线号、设备号、功能号、寄存器偏移);
  • CONFIG_DATA(端口 0xCFC):读写具体的配置数据。

2. 软件层面:操作系统的 "快捷方式"

  • Linux:通过/proc/bus/pci目录直接查看,比如cat /proc/bus/pci/00/01.0能看到显卡的配置空间;
  • Windows:用GetPCIConfigData等 API,底层还是操作这两个端口。

五、驱动开发实战:从识别设备到控制硬件

5.1 第一步:让系统 "认识" 你的设备

驱动加载时,系统会扫描所有 PCI-E 设备,对比配置空间里的 Vendor ID 和 Device ID,匹配到对应的驱动: 

// Linux驱动的设备匹配表(部分)
static const struct pci_device_id my_pci_ids[] = {{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_RTX4090 }, // 精确匹配NVIDIA RTX4090{ PCI_VENDOR_ID_INTEL, PCI_CLASS_USB3_0 << 8 }, // 匹配所有Intel的USB3.0控制器{ 0, } // 结束标志
};
MODULE_DEVICE_TABLE(pci, my_pci_ids);

5.2 第二步:给设备 "分地盘"

设备需要内存或 IO 空间和 CPU 通信,驱动要帮它向系统申请:

  • pci_request_region申请地址空间(防止其他设备冲突);
  • ioremap把物理地址转成内核能访问的虚拟地址(操作硬件寄存器)。

5.3 第三步:处理中断 —— 让设备 "会敲门"

设备完成任务(比如网卡收到数据包)后,要通过中断通知 CPU。PCI-E 支持两种中断:

  • 传统中断(INTA~INTD):通过插针发信号,缺点是多设备可能共享同一个 IRQ(中断号);
  • MSI 中断(消息信号中断):直接发一个数据包给 CPU,支持 2048 个中断向量,适合高速设备(如万兆网卡)。

5.4 第四步:电源管理 —— 让设备 "该睡就睡"

笔记本电脑的 PCI-E 设备需要智能省电:

  • 驱动调用pci_set_power_state切换设备状态(D0 运行→D3 断电);
  • PCI-E 支持 L0s/L1 低功耗链路状态,空闲时降低传输速率,唤醒延迟小于 1 微秒;
  • 设备通过配置空间的电源管理寄存器(PMCSR)报告支持的节能模式。

六、常见问题与避坑指南

6.1 兼容性问题:老设备的 "水土不服"

  • BAR 对齐错误:有些老设备要求地址按 4KB 对齐,分配时要用roundup(bar_size, 4096)
  • 中断冲突:传统中断共享时,驱动要在读中断状态寄存器后,确认是否自己的设备触发;
  • 插槽降速:x16 设备插 x8 电气插槽会自动降为 x8 模式,可用pci_get_max_link_speed检查实际速率。

6.2 性能优化:让硬件 "跑满"

  • 启用 MSI-X:比普通 MSI 支持更多中断向量(最多 2048 个),适合多队列网卡;
  • 分散 - 聚集 DMA:允许数据存放在非连续内存(通过描述符表),避免大内存分配困难;
  • 预取设置:对频繁访问的寄存器区域,设置PCI_BASE_ADDRESS_MEM_PREFETCH,提升访问速度。

6.3 调试工具:查问题的 "神器"

  • lspci(Linux)lspci -v -s 01:00.0查看显卡的详细配置空间;
  • PCIeScope(硬件):抓包工具,能分析 PCI-E 的 TLP 数据包(事务层包),定位传输错误;
  • Windbg(Windows):用!pci扩展命令查看 PCI 设备信息,调试驱动崩溃问题。

七、未来:PCI-E 的下一站

PCI-E 发展到 Gen5(32GT/s),x16 插槽双向带宽已达 64GB/s,但技术还在进化:

  • Gen6(2025 年):64GT/s 速率,用 PAM-4 编码提升信号密度,搭配 FEC 纠错降低误码率;
  • CXL(计算 Express Link):融合内存与 IO 寻址空间,未来 SSD 可能直接当内存用;
  • 动态带宽分配:根据负载自动调整 Lane 数,比如显卡空闲时释放 x8 给其他设备。

从 PCI 到 PCI-E,20 多年的技术迭代,不变的是即插即用的核心设计 —— 设备通过配置空间主动 "报家门",驱动根据这些信息完成控制。对于开发者来说,理解配置空间的每一个寄存器,搞懂 PCI-E 的链路协议,就是打开硬件世界的 "钥匙"。


相关文章:

【驱动设计的硬件基础】PCI和PCI-E

打开电脑主机&#xff0c;你会看到主板上一排长短不一的插糟&#xff1a;矮胖的 PCI 插糟还插着古老的声卡&#xff0c;旁边细长的 PCI-E 插糟则牢牢卡住显卡、高速网卡等核心设备。这些看似普通的插糟&#xff0c;其实是计算机硬件沟通的 "高速公路"&#xff0c;承载…...

【学习记录】Git Base使用-免密连接代码仓库

github&#xff08;JL765&#xff09;和gitee&#xff08;JL765/git-test01&#xff09;都可以用于管理代码 在windows中&#xff0c;可以通过Git Base软件&#xff08;Git - Downloading Package&#xff09;和仓库进行连接 下载略过 github登录 ssh -T gitgithub.com # 成…...

android脱糖

前言 另外一篇相关文章&#xff1a;https://androidblog.blog.csdn.net/article/details/148574130 通过sourceCompatibility 和targetCompatibility可以实现低版本写代码高版本输出&#xff08;详情可查看我的另一篇文件中的&#xff1a;验证各种Java版本 > 一、纯Java项…...

DVWA Brute Force漏洞深度分析与利用指南

DVWA简介 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个基于PHP/MySQL的脆弱性Web应用平台&#xff0c;专为安全专业人员设计&#xff0c;用于测试技能和工具。它包含十大安全模块&#xff0c;其中Brute Force&#xff08;暴力破解&#xff09;是最基础…...

Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录

目录 &#x1f527;Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录 &#x1f4cc; 问题背景 &#x1f9ea; 排查过程 步骤 1&#xff1a;确认加速器地址是否可访问 步骤 2&#xff1a;检查 Docker 是否真的使用了镜像加速器 步骤 3&…...

采用ArcGIS10.8.2 进行插值图绘制

一、最终成果图展示 二、软件下载 链接: 百度网盘 请输入提取码 密码:azay 三、软件安装 1、在安装之前需要关闭电脑的防火墙及杀毒软件 设置-隐私和安全性-Windows安全中心-防火墙和网络保护 2、软件解压 (1)【ArcGIS_Desktop_1082_180......】“以管理员身份运行”…...

国产安路FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供5套TD工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目国产安路FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->GC0308摄像头输入Sensor之-->OV7725摄像头输入Sensor之--…...

利用大型语言模型增强边缘云 AI 系统安全性

大家读完觉得有帮助及的关注和点赞&#xff01;&#xff01;&#xff01; 抽象 随着边缘计算和云系统在 AI 驱动应用中的广泛应用&#xff0c;如何在确保数据隐私的同时保持高效性能已成为一个紧迫的安全问题。本文提出了一种基于联邦学习的数据协作方法&#xff0c;以提高边缘…...

微信小程序中 rpx与px的区别

在微信小程序中的rpx比px方便的多 <!--pages/welcome/welcome.wxml--> <!--rpx替换px--> <image style"width:200rpx;height: 200rpx"src"/images/avatar/3.png"></image> <text>你好&#xff0c;冻梨</text> <but…...

解锁阿里云AnalyticDB:数据仓库的革新利器

AnalyticDB&#xff1a;云数据仓库新势力 在数字化浪潮中&#xff0c;数据已成为企业的核心资产&#xff0c;而云数据仓库作为数据管理与分析的关键基础设施&#xff0c;正扮演着愈发重要的角色。阿里云 AnalyticDB 作为云数据仓库领域的佼佼者&#xff0c;以其卓越的性能、创…...

告别水印烦恼,一键解锁高清无痕图片与视频!

在这个数字化飞速发展的时代&#xff0c;无论是设计小白还是创意达人&#xff0c;都可能遇到这样的困扰&#xff1a;心仪的图片或视频因水印而大打折扣&#xff0c;创意灵感因水印而受限。别急&#xff0c;今天就为大家带来几款神器&#xff0c;让你轻松告别水印烦恼&#xff0…...

前端面试记录

前言&#xff1a;面试题永远是刷不完的&#xff0c;即使刷了一大堆下次面试又忘记了&#xff0c;重要的是组织自己的语言&#xff0c;保持自信&#xff0c;不给自己制造面不过的心理负担&#xff0c;对刷过的题要有个大致印象&#xff0c;好在答题的时候能够多多少少说出点贴近…...

RAG实战基础篇/windows电脑快速部署qwen3:14B

现阶段&#xff0c;在本地部署ollama非常简单&#xff0c;准备好一个有GPU的电脑&#xff0c;十分钟轻松部署qwen3:14b。实现本地的大模型部署。 我这里为了方便起见&#xff0c;直接使用windows电脑下载一个ollama。 访问ollama GIthub地址&#xff1a;ollama开源地址 直接…...

Java SE - 图书管理系统模拟实现

目录 1.设计框架2. 实现用户类3.实现书和书架类4.登录界面的实现5.实现menu方法6.测试菜单选择7.实现一个IFun接口7.1 查找功能的实现7.2 展示功能的实现7.3 增加功能的实现7.4 删除功能的实现7.5 退出功能的实现7.6 借阅功能的实现7.7 归还功能的实现 8.实现IFuntion类型的数组…...

华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫

咸鱼只卖20多元一个&#xff0c;还是xgpon的万兆猫&#xff0c;性价比不错哦 除了没有2.5G网口&#xff0c;其他还行。 改成公版光猫后&#xff0c;运营商是无法纳管光猫&#xff0c;无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点&#xff1a; 性能方面 高速接…...

【ARM 嵌入式 编译系列 7.5 -- GCC 打印链接脚本各段使用信息】

文章目录 Overview1 在 linker script 中定义符号2 编译并生成 ELF 文件3 使用 nm awk 输出各段地址及大小&#xff08;含单位&#xff09;4 实际输出示例5 进阶建议 Overview 在 GCC 编译生成 elf 后 打印出出数据段的开始地址及结束地址&#xff0c;bss 段的开始地址和结束…...

在大数据求职面试中如何回答分布式协调与数据挖掘问题

在大数据求职面试中如何回答分布式协调与数据挖掘问题 场景&#xff1a;小白的大数据求职面试 小白是一名初出茅庐的程序员&#xff0c;今天他来到一家知名互联网公司的面试现场&#xff0c;面试官是经验丰富的老黑。以下是他们之间的对话&#xff1a; 第一轮提问&#xff1…...

小白成长之路--nginx基础配置(一)

文章目录 一、概述1.1 Nginx 特点1.2 Nginx 作用1.3Nginx工作原理 二、Nginx服务搭建2.1安装2.2 目录结构2.3 配置文件作用2.4 nginx,conf配置文件详解2.5 核心命令2.6 Nginx信号三.Nginx3.1启动 总结 一、概述 Nginx 是开源、高性能、高可靠的 Web服务器 和反向代理服务器&am…...

基于 SpringBoot+JSP 的医疗预约与诊断系统设计与实现

摘要 本研究针对传统医疗预约与诊断流程中存在的效率低下、信息不透明、患者等待时间长等问题&#xff0c;设计并实现了一个基于 SpringBootJSP 的医疗预约与诊断系统。系统采用 B/S 架构&#xff0c;整合了用户管理、科室管理、医生排班、预约挂号、在线问诊、检查检验、诊断…...

C++语言发展历程-2025

C语言发展历程-2025 前言 C是一种高级编程语言&#xff0c;由Bjarne Stroustrup于1979年在贝尔实验室创建&#xff0c;是C语言的扩展和改进版。 C从最初的C with class&#xff0c;经历了C98、C03、C11、C 14、C17、C20、C23多次标准化改造&#xff0c;成为一门多范式、高性…...

Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南

Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系统架构设计 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…...

Python基础之函数

代码仓库地址&#xff1a;gitgithub.com:Liucc-123/python_learn.git 函数介绍 函数是组织好的、可重复使用的&#xff0c;用来实现单一、或相关功能的代码段。 函数可以提高应用的模块性和代码的可重复性。python 有许多内置的函数比如 print 打印函数&#xff0c;python 也…...

Python异步爬虫编程技巧:从入门到高级实战指南

Python异步爬虫编程技巧&#xff1a;从入门到高级实战指南 &#x1f680; &#x1f4da; 目录 前言&#xff1a;为什么要学异步爬虫异步编程基础概念异步爬虫核心技术栈入门实战&#xff1a;第一个异步爬虫进阶技巧&#xff1a;并发控制与资源管理高级实战&#xff1a;分布式…...

Redis哨兵模式深度解析与实战部署

Redis哨兵模式深度解析与实战部署 文章目录 Redis哨兵模式深度解析与实战部署一、Redis哨兵模式理论架构详解1.1 哨兵模式的核心架构组成基础架构拓扑图 1.2 哨兵节点的核心功能模块1.2.1 监控模块&#xff08;Monitoring&#xff09;1.2.2 决策模块&#xff08;Decision Makin…...

【软考高级系统架构论文】论边缘计算及其应用

论文真题 边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的分布式开放平台(架构),就近提供边缘智能服务。边缘计算与云计算各有所长,云计算擅长全局性、非实时、长周期的大数据处理与分析,能够在长周期维护、业务决策支撑等领域发挥优势;…...

触摸屏(典型 I2C + Input 子系统设备)从设备树解析到触摸事件上报

触摸屏&#xff08;典型 I2C Input 子系统设备&#xff09;从设备树解析到触摸事件上报 以下是架构图&#xff0c;对触摸屏&#xff08;典型I2C Input子系统设备&#xff09;从设备树解析到触摸事件上报的全流程详细拆解&#xff0c;包含文字讲解和配套流程图&#xff1a; 注…...

Java中==与equals()方法的深度解析

作为Java后端开发者&#xff0c;我们经常会遇到需要比较两个对象是否相等的情况。在Java中&#xff0c;运算符和equals()方法都可以用于比较&#xff0c;但它们之间存在着本质的区别。 1. 运算符 是一个比较运算符&#xff0c;它的行为取决于比较的类型&#xff1a; 1.1 比较…...

qt常用控件--02

文章目录 qt常用控件--02toolTip属性focusPolicy属性styleSheet属性补充知识点按钮类控件QPushButton 结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c11中常见的新增表达 作者&…...

AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一)

环境&#xff1a; AI-Sphere-Butler VBCABLE2.1.58 Win10专业版 豆包桌面版1.47.4 ubuntu22.04 英伟达4070ti 12G python3.10 问题描述&#xff1a; AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法&#xff08;一&#xff09; 聊天视频&#xff1a; AI真…...

为什么android要使用Binder机制

1.linux中大多数标准 IPC 场景&#xff08;如管道、消息队列、ioctl 等&#xff09;的进程间通信机制 ------------------ ------------------ ------------------ | 用户进程 A | | 内核空间 | | 用户进程 B | | (User Spa…...

Apache SeaTunnel Flink引擎执行流程源码分析

目录 1. 任务启动入口 2. 任务执行命令类:FlinkTaskExecuteCommand 3. FlinkExecution的创建与初始化 3.1 核心组件初始化 3.2 关键对象说明 4. 任务执行:FlinkExecution.execute() 5. Source处理流程 5.1 插件初始化 5.2 数据流生成 6. Transform处理流程 6.1 插…...

XML读取和设置例子

在Qt C中&#xff0c;可以使用Qt的 QDomDocument类来读取、更新和保存XML文件。这个类提供了对XML文档的强大操作能力&#xff0c;支持通过DOM&#xff08;文档对象模型&#xff09;对XML进行读取、修改、添加和删除节点等操作。 下面是一个详细的例子&#xff0c;演示如何在Qt…...

数据标注师学习内容

目录 文本标注词性标注实体标注 图像标注语音标注 文本标注 词性标注 第一篇 第二篇 实体标注 点击这里 关系标注 事件标注 意图标注 关键词标注 分类标注 问答标注 对话标注 图像标注 拉框标注 关键点标注 2D标注 3D标注 线标注 目标跟踪标注 OCR标注 图像分类标注 语音…...

如何实现财务自由

如果有人告诉你&#xff0c;普通人也可以在5到10年内&#xff0c;而不是40到50年后实现财务自由、彻底退休&#xff0c;你会不会觉得对方在开玩笑&#xff1f;但这并非天方夜谭&#xff0c;《百万富翁快车道》的作者MJ德马科就是成功案例。他曾和多数人一样做底层工作&#xff…...

一些想法。。。

1.for里面的局部变量这种还是在for里面定义比较好 比如 for(int i 0;i<n;i){ int num; cin>>num; } 实不相瞒&#xff0c;有一次直接cin了i怎么都没看出来哪里错了。。。 2.关于long long 如果发现中间结果大约是10^9&#xff0c;就要考虑int 溢出 即用 long …...

基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架

基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架 摘要: 低空经济作为新兴战略产业,其核心场景(如无人机物流、城市空中交通、低空监测)普遍面临环境动态性强、个体观测受限、数据隐私敏感及多智能体协同复杂等挑战。本文创新性地提出一种深…...

github常用插件

一&#xff0c;文档辅助阅读系列&#xff1a;自动化wiki处理 1&#xff0c;deepwiki https://deepwiki.com/ 将我们看不懂的官方code文档转换为wiki&#xff0c;更加便于理解。 其实能够翻阅的仓库很有限&#xff0c;比如说&#xff1a; 但是有很多仓库并没有index&#xff…...

python3字典

1 字典简介 字典是一种可变容器模型&#xff0c;且可存储任意类型对象。字典每个基本元素都包括两个部分&#xff1a; 键&#xff08;key&#xff09;和键对应的值&#xff08;value&#xff09; 每个键值 key>value 对用冒号: 分割&#xff0c;每个对之间用逗号(,)分割&am…...

华为云 Flexus+DeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践

华为云 FlexusDeepSeek 征文&#xff5c;增值税发票智能提取小工具&#xff1a;基于大模型的自动化信息解析实践 前言背景 企业财务处理中&#xff0c;增值税发票信息手动提取存在效率低、易出错等痛点&#xff0c;华为云 Flexus 弹性算力联合 DeepSeek 大模型&#xff0c;通过…...

[特殊字符] OpenCV opencv_world 模块作用及编译实践完整指南

&#x1f4cc; 什么是 opencv_world 模块&#xff1f; opencv_world 是 OpenCV 官方提供的一个 大型集成动态库。它将 OpenCV 所有启用的模块&#xff08;例如 core, imgproc, highgui, videoio, dnn, photo 等&#xff09;打包到一个单一的动态库文件&#xff08;如 Linux 的…...

目标检测之YOLOv5到YOLOv11——从架构设计和损失函数的变化分析

YOLO&#xff08;You Only Look Once&#xff09;系列作为实时目标检测领域的标杆性框架&#xff0c;自2016年YOLOv1问世以来&#xff0c;已历经十余年迭代。本文将聚焦YOLOv5&#xff08;2020年发布&#xff09;到YOLOv11&#xff08;2024年前后&#xff09;的核心技术演进&am…...

Java的SpringAI+Deepseek大模型实战【二】

文章目录 背景交互方式1、等待式问答2、流式问答 设置角色环绕增强1&#xff09;修改controller2&#xff09;修改配置日志级别 处理跨域 背景 上篇【Java的SpringAIDeepseek大模型实战【一】】搭建起浏览器交互的环境&#xff0c;如何进行流式问答&#xff0c;控制台打印日志…...

OpenCV——霍夫变换

霍夫变换 一、霍夫变换原理二、霍夫线检测2.1、标准霍夫变换2.2、概率霍夫变换 三、霍夫圆检测3.1、霍夫圆检测的原理3.2、霍夫梯度法 一、霍夫变换原理 霍夫变换&#xff08;Hough TRansform&#xff09;是从图像中识别几何图形的基本方法&#xff0c;由Paul Hough于1962年提…...

线程池 JMM 内存模型

线程池 & JMM 内存模型 文章目录 线程池 & JMM 内存模型线程池线程池的创建ThreadPoolExecutor 七大参数饱和策略ExecutorService 提交线程任务对象执行的方法&#xff1a;ExecutorService 关闭线程池的方法&#xff1a;线程池最大线程数如何确定&#xff1f; volatile…...

PillarNet: Real-Time and High-PerformancePillar-based 3D Object Detection

​ECCV 2022 paper&#xff1a;[2205.07403] PillarNet: Real-Time and High-Performance Pillar-based 3D Object Detection&#xfeff; code&#xff1a;https://github.com/VISION-SJTU/PillarNet-LTS&#xfeff; 纯点云基于pillar3D检测模型 网络比较 SECOND 基于vo…...

配电抢修场景案例

以配电抢修场景为例来展示关键业务活动。配电抢修愿景分成业务逻辑、业务活动、业务特征、技术支撑、KPI五个层次&#xff0c;分别从策略、执行、评价、资源、协同5个方面描述配电抢修愿景的关键业务活动。...

H5新增属性

✅ 一、表单相关新增属性&#xff08;Form Attributes&#xff09; 这些属性增强了表单功能&#xff0c;提升用户体验和前端验证能力。 1. placeholder 描述&#xff1a;在输入框为空时显示提示文本。示例&#xff1a; <input type"text" placeholder"请输…...

C# Task 模式实现 Demo(含运行、暂停、结束状态)

下面是一个完整的 C# Task 实现示例&#xff0c;包含运行(Running)、暂停(Paused)和结束(Completed)状态控制&#xff1a; 1. 基本实现&#xff08;使用 CancellationToken 控制&#xff09; using System; using System.Threading; using System.Threading.Tasks;public cla…...

Docker健康检查

目录 1.命令 2.验证 1.命令 docker run -itd --name nginx -v data:/etc/nginx/ -v log:/var/log/ -p 8080:80 \ --health-cmd"curl http://127.0.0.1:80" \ --health-interval30s \ --health-timeout5s \ --health-retries3 \ --health-start-period18s \ nginx:…...

Linux笔记---线程控制

1. 线程创建&#xff1a;pthread_create() pthread_create() 是 POSIX 线程库&#xff08;pthread&#xff09;中用于创建新线程的函数。调用该函数后系统就会启动一个与主线程并发的线程&#xff0c;并使其跳转到入口函数处执行。 #include <pthread.h>int pthread_cr…...