PCIe 从架构到 P2P 直通:一次把路由讲清楚

Qt-无标题窗口         今天学习了下无标题窗口,于是来记录下我的学习过程首先建立一个Qt Widgets Application继承QWidget类创建完后直接运行就得到了如下效果那么,既然是无标题窗口就要去掉窗口栏啊,于是加上setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);去掉标题栏,但是这样整个窗口就不能移动... 阅读详情

PCIe 从架构到 P2P 直通:一次把路由讲清楚

本文合并自两份工程文档:pcie/pcie_architecture.md(PCIe 物理架构与软件逻辑)与
pcie/多卡数据直通_P2P_配置与数据交互.md,并按"从结构 → 到路由 → 到多卡直通"的顺序重新组织。
配套图:pcie/pcie_arche.png(子系统框图)、pcie/multi_card_p2p.drawio(多卡直通架构)。


0. 一句话结论

PCIe 的一切"走不通",几乎都能归结成一句话:某个地址没落在该落的窗口里,或者某类事务用错了路由依据。

  • 配置事务按 Bus:Dev:Func 路由;
  • 内存/IO 事务按 地址窗口 路由;
  • 完成事务按 Requester ID 回程。

把这三条记住,后面的 ECAM、MMIO、P2P、跨卡直通都是它的推论。


1. 心智模型:RC、RP、EP 与三类事务

概念是什么关键属性
RC(Root Complex)CPU/内存与 PCIe 层次之间的"桥头堡"一个 RC 可以带多个 Root Port
RP(Root Port)RC 内部的 Type1 桥有 Primary/Secondary/Subordinate bus、Memory/Prefetch 窗口、自己的 LTSSM
EP(Endpoint)网卡/GPU/NVMe 等设备Type0 头,最多 6 个 BAR;配置空间 4KB(含扩展能力)
Switch多端口桥的集合上游口 + 多个下游口;P2P 是否允许由 ACS 决定

本工程的实现方式:一个 PCIe 子系统(PCIE0~7)= 一个 RC 控制器实例,通过 fuse 的分叉(Bifurcation)
把它切成 1~4 个 Root Port(X16 / X8+X8 / X8+X4+X4 / X4×4),每个 RP 独占一段窗口与 lane 组。

SoC
└─ PCIe 子系统(本图范围;fuse 决定整体 RC / EP)
   ├─ 子系统级共享:SUB CSR / IOMMU / APLIC / PLIC / IDE / PHY CSR
   │                pcie_data_fabric / pcie_control_fabric
   ├─ 控制器级:PCIe/CXL ctrl(TLP 组装、iATU、DBI)
   └─ 端口级(RC 模式):pcie_ctrl_top_x16 → RP0/RP1/RP2/RP3 → PHY

别把"子系统框图"当成"单个 RP 的框图":图上 PCIe/CXL ctrl 是 RC 的控制器,pcie_ctrl_top_x16 才是 RP,
而 SUB CSR/IOMMU/IDE/PHY CSR 是 RC 级共享资源。


2. 一个子系统内部长什么样:两张 fabric

在这里插入图片描述

图 2-1 pcie_arche.png:单个 PCIe 子系统的硬件框图。
上方左侧 NC-NOC(非一致数据面)、右侧 CC-NOC(一致性/管理面)是两个系统级入口;
中部紫色 PCIe/CXL ctrl 是控制器主体(AXI slave/master 端口、APB 旁路、sub_csr/ctr_csr/io_mux、PCIe CFG);
左侧浅蓝 pcie_data_fabric 是数据面分发网,下方浅橙 pcie_control_fabric 是控制面分发网;
右侧白色 pcie_ctrl_top_x16 (x4/x8/x16) 是端口级 wrapper,内含 PIPE Mapping、PHY、DEM、phy ctrl、apb2cr;
IDE 挂在数据路径上(加解密只改载荷、不改路由),RAS / *VRs kernel / P-REG 是旁路与寄存器镜像,
IOMMU / SUB CSR / PCIe CFG 属子系统级服务。箭头上的 M / S 表示该方向上的主/从角色。

打开 pcie_arche.png 能看到的关键结构,其实只有三层:

NC-NOC
非一致数据面

pcie_data_fabric

CFG-NOC
配置面

pcie_control_fabric

PCIe/CXL ctrl
(TLP 组装 / iATU / DBI)

pcie_ctrl_top_x16
RP0~RP3

pcie_phy_top
(PIPE / PHY)

IDE 加解密
(在数据路径上,只改载荷)

层模块作用
系统 NoCNC-NOC(非一致)、CFG-NOC(配置)、CC-NOC(一致性/管理)决定流量进入子系统的"域"
子系统 fabricpcie_data_fabric、pcie_control_fabric数据面 / 控制面物理分离
控制器PCIe/CXL ctrlTLP 组装解析、iATU 翻译、DBI 配置入口
端口/PHYpcie_ctrl_top_x16、pcie_phy_top分叉后的 RP;PIPE/PHY 物理层
旁路IDE、RAS、MEM、*VRs kernel、P-REG加密、错误记录、内部 RAM、寄存器镜像

为什么要把两张 fabric 分开?
高带宽的内存流量走 data_fabric,低频的配置/寄存器访问走 control_fabric —— 配置访问不会挤占数据带宽,
数据通路也不会被 CSR 访问打断。


3. CPU 到 RC 不是直连:数据走 NC-NOC,配置走 CFG-NOC

这是最容易画错、也最容易在排障时被忽略的一点:

面系统级网络子系统级 fabric事务路由依据
数据面NC-NOC(含 NC_NOC_PCIE_DOWN/UP 端口)PCIE<n>_DATA_FAB → pcie_data_fabricMWr / MRd地址窗口
配置面CFG-NOCPCIE<n>_CFG_FAB → pcie_control_fabricConfig T0 / T1Bus:Dev:Func
寄存器面控制 / APB 通路SUB CSR、MISC CSR/MSG/MHU、IOMMU/APLIC/PLIC/IDE/PHY寄存器读写(不发 TLP)寄存器基地址译码

三个直接结论:

  1. 同 RC 的 P2P,TLP 根本不出 pcie_data_fabric,与 NC-NOC 无关;
  2. 跨 RC(PCIE0 ↔ PCIE1)走的就是这条路:发起方 RC 上行 → NC-NOC → 按地址译码送回目标子系统
    → 目标 pcie_data_fabric → 目标 RP(见 9.1 的 sing_nc.png)。前提是系统地址译码允许该窗口回送;
    没配好就会落到 DDR 或直接报错,退化成"经主机内存";
  3. 配置与数据严格分离:枚举/DBI 访问走 CFG-NOC,绝不能用"数据窗口"去碰 DBI。

4. 配置空间与 ECAM:让配置访问变成 load/store

ECAM(Enhanced Configuration Access Mechanism) 把 PCI 配置空间映射进系统内存地址:

ECAM_base + (bus << 20) + (dev << 15) + (func << 12) + offset[11:0]
  • 每 bus 1MB、每 dev 32KB、每 func 4KB;
  • 0x000~0x0FF 是标准头,0x100~0xFFF 是 PCIe 扩展能力(AER、SR-IOV、ATS 都在这里);
  • 访问方式就是普通 load/store(但必须非缓存、强序,因为读配置可能有副作用)。
传统 CAM(CF8/CFC 端口)ECAM
每功能可访问256B4KB(含扩展能力)
并发有全局状态,必须串行普通内存访问,可并发
本工程—每端口 64MB = 64 bus,四端口偏移 0/4M/8M/12M

ECAM 只是"CPU 侧地址";RC 解出 bus 号后自行决定是发 Type0(目标就是本 RP 下游)还是 Type1(要过桥)。


5. 地址窗口:MMIO-L / MMIO-H 与 Type1 头

5.1 两个窗口是按"BAR 位宽"分的,不是按"寄存器 vs 缓冲"分的

窗口承载的 BAR位置对应 Type1 头
MMIO-L所有 32 位 BAR(可预取/非预取)4GB 以下0x20 Memory Base/Limit
MMIO-H所有 64 位 BAR(规范强制预取)4GB 以上0x24/0x28/0x2C Prefetchable Base/Limit(+Upper)

两个独立约束:地址位宽(32 位 BAR 出不了 4GB)与预取属性(非预取读有副作用,硬件不能缓存/合并读)。

5.2 同一段地址,要写三处,而且必须一致

写在哪属于哪个地址域作用
Type1 头窗口(RP 配置空间 0x20/0x24)PCIe 总线域告诉下游"这些地址归我",也是 RC 内部 P2P 路由依据
SUB CSR 译码窗口(SUBSYS_REG_MMIOL/MMIOH_ADDR_*)系统地址域告诉 fabric"哪些 CPU 地址是 PCIe 访问、送给哪个 RP"
EP 的 BAR设备侧目标设备认领地址
  • 只配 Type1、不配 SUB CSR → CPU 访问 EP 时 fabric 不认这个地址 → 访问失败;
  • 只配 SUB CSR、不配 Type1 → CPU 能进 PCIe,但 RC 不知道送哪个端口 → P2P 路由失败;
  • 三者对齐(枚举天然保证)→ 通。

一句话:SUB CSR 决定"CPU 能不能进来",Type1 头决定"进来了往哪个端口走",BAR 决定"谁认领"。


6. 路由三定理与一次完整访问

事务路由依据谁看
配置(CfgRd/CfgWr,Type0/Type1)Bus:Dev:FuncRC 按 bus 号判断是否跨桥
内存/IO(MWr/MRd/IOWr/IORd)地址(命中哪个端口的窗口)data_fabric + RP 的 Type1 窗口
完成(Cpl/CplD)Requester ID回到发起方所在端口

CPU load/store 命中 MMIO-L/H

SUB CSR 译码:地址属于哪个 RP

RP 的 Type1 窗口二次确认

iATU outbound 翻译 → 封装 MWr/MRd TLP

链路 → EP 按 BAR 认领

CplD/Cpl 按 Requester ID 回程

一个常被忽视的事实:源端 EP 发起 P2P 时不需要知道目标是谁,它只把"软件告诉它的地址"放进 TLP;
"地址 → 端口"的映射存在**软件(BAR 表)和硬件(窗口寄存器)**里。路由判断全交给 RC/Switch。


7. 软件视角:从复位到枚举

7.1 链路训练(LTSSM)

上电后 RP 的 LTSSM 从 Detect → Polling → Configuration → L0 走完才算链路可用;
异常时会在 Recovery(重均衡)、Disabled、Hot Reset 等状态间摆动。
本工程提供 LTSSM Tracker 记录历史状态跳变(MISC_CSR_LTSSM_TRACKER_0~4),是排查"链路起不来"的第一手材料。

7.2 初始化与枚举顺序

按 fuse 创建子系统
 → 分叉配置(bifurcation_mode / port_enable_mask / Link Number)
 → RP 复位释放 → LTSSM 训练 → 链路协商(宽度/速率)
 → 配 Type1 头(bus 范围 + MEM32/PREF64 窗口)
 → 配 SUB CSR 译码窗口
 → ECAM 扫描(bus 0..N,dev 0..31)→ 识别桥(header_type)与 EP
 → BAR 分配(32 位落 MMIO-L、64 位预取落 MMIO-H,按大小对齐)
 → iATU outbound/inbound 建立 CPU↔PCIe 地址映射
 → 中断初始化(PLIC 线中断 / APLIC MSI;MSI-X 表写入)

7.3 iATU:地址翻译的落点

方向做什么
OutboundCPU 地址 → PCIe 地址;按 Region 配 base/limit/target 与类型(MEM/IO/CFG0/CFG1/MSG)
InboundPCIe 地址 → CPU 地址(EP 侧按 BAR 匹配)

注意:iATU 不是"路由",是"翻译"。路由由窗口(data_fabric + Type1)决定,iATU 只在控制器内部搬地址。


8. P2P 直通:本质是"改目标地址"

8.1 DMA 与 P2P 是两个维度

回答的问题
DMA谁在搬?(设备 DMA 引擎,CPU 只配置+触发)
P2P从哪搬到哪?(设备 → 设备,绕开主机内存)

两者不是二选一:做 P2P 恰恰要依赖 DMA,区别只在"目标地址填 DDR 还是填对端 BAR"。

8.2 配置四步

步骤动作缺了会怎样
① RC 端口窗口配 Type1 头(MEM32/PREF64)下游 BAR 无处安放 / 窗口外 TLP 不受理
② 子系统译码配 SUB CSR MMIOL/MMIOHRC 不知道目标地址送哪个端口
③ 枚举写 BAR在目标 RP 窗口内给对端卡分配地址无人认领 → UR
④ DMA 目标发起方 DAR/BUS_ADDR = 对端 BAR填成 DDR → 退化成"经主机内存"

8.3 一个容易讲错的问题:SUB CSR 参与 P2P 数据路由吗?

不参与。 P2P 的 TLP 从发起方 RP 上行进入 RC 核心,RC 核心按 Type1 头窗口判断目标属于哪个 RP,
直接在 RC 内部转发 —— 不经过 CPU/fabric 入口,而 SUB CSR 恰是那个"CPU 入口"。

但"触发 P2P"几乎总需要 SUB CSR:软件要通过 CPU 去写发起方 EP 的 DMA 寄存器(EP 的 BAR0),
这一步是 CPU 访问,必须过 SUB CSR。只有"EP 自主发起 DMA(如 mailbox 命令触发)"的极端场景,
数据面才可能只用 Type1 头 + EP BAR 跑通。


9. 多卡直通:五种拓扑的能力矩阵

#拓扑路径是否直通关键配置对应图
①同 RC,不同 RP只在 pcie_data_fabric 内按窗口转发✅Type1 窗口 + 对端 BARsingle_rc.png
②跨 RC,同一 NC-NOC上行 NC-NOC → 地址译码送回另一子系统✅(需系统译码支持)SUB CSR 窗口 + 两侧 Type1 + 地址不重叠sing_nc.png
③跨 NC-NOCNOC 间链路(UCIe/CCIX/CXL 或 NOC-to-NOC)✅(需 NOC 互连)NOC 间路由 + 一致性/顺序multi_nc.png
④同 PCIe Switch,不同下游端口Switch 内部转发✅(需关 ACS Redirect)ACS RR/CR 关闭 + Switch P2P 使能—
⑤跨 Socket / 机箱CCIX over UCIe / CXL S2S / NTB / RDMA✅(链路层)建链 + 地址域规划 + 一致性/翻译multi_card_p2p.drawio

关键认知:P2P 的"范围"由它经过的组合决定,而不是由"是不是同一颗芯片"决定。
同一 RC 内的 P2P 只走 pcie_data_fabric;跨 RC 必须上到 NC-NOC;跨 NOC 还要再加一级 NOC 间链路。
每多一级,就多一次地址译码与转发开销。

9.1 三张图看懂 P2P 的三种范围(都是实拍架构图,不是示意)

① 子系统内部:single_rc.png

在这里插入图片描述

图 9-1 single_rc.png(标签"P2P子系统内部"):

  • 结构:NC-NOC0 的下方挂一个 Root Complex(PCIe1),其内部 pcie_data_fabric 汇聚出 4 个端口
    RP_x16 / RP_x8 / RP_x4_0 / RP_x4_1,每个端口下挂一个 EP(EP0~EP3)——这正是分叉模式下的物理连接。
  • 红色箭头就是 P2P 数据流:EP0 → RP_x16(上行)→ pcie_data_fabric → RP_x8(下行)→ EP1。
  • 黑色双向箭头只存在于 NC-NOC0 ↔ pcie_data_fabric 之间:P2P 流量不去 NC-NOC,它只负责子系统与系统侧的常规上下行。
  • 要点:四个 RP 共用一个 pcie_data_fabric,这就是"同 RC P2P 能一拐就到达对端"的硬件基础。
② 跨子系统、不跨 NOC:sing_nc.png

在这里插入图片描述

图 9-2 sing_nc.png(标签"P2P跨子系统不跨NOC"):

  • 结构:同一个 NC-NOC0 下挂两个独立的 RC —— Root Complex(PCIe1) 与 Root Complex(PCIe3);
    每个 RC 只有 RP_x16 为实线(其余 RP_x8/x4_0/x4_1 与对应的 EP1~EP3 是虚线=本配置未使能)。
  • 红色箭头路径:EP0(PCIe1) → RP_x16 → pcie_data_fabric → NC-NOC0 → pcie_data_fabric(PCIe3) → RP_x16 → EP0(PCIe3)。
  • 结论:跨 RC 的 P2P 是可以做的——但它要"上 NOC 再下 NOC",比同 RC 多两跳;
    能否成立取决于 NOC 的系统地址译码是否把这个目标地址重新分配回 PCIe3 子系统。
  • “不跨 NOC” 的含义:两个 RC 共用同一个 NC-NOC 实例,转发出现在这个 NOC 内部,没有走 NOC 间的长链路。
③ 跨子系统、且跨 NOC:multi_nc.png

在这里插入图片描述

图 9-3 multi_nc.png(标签"P2P跨子系统跨NOC"):

  • 结构:两个 NC-NOC 实例(NC-NOC0 与 NC-NOC1)之间有一条双向互连链路;
    NC-NOC0 下挂 PCIe1,NC-NOC1 下挂 PCIe4,两侧 pcie_data_fabric 与 RP/EP 结构与前两张一致。
  • 红色箭头路径:EP0(PCIe1) → RP_x16 → pcie_data_fabric → NC-NOC0 →(NOC 间链路)→ NC-NOC1 → pcie_data_fabric → RP_x16 → EP0(PCIe4)。
  • 结论:跨 NOC 的 P2P 依赖 NOC 之间的物理链路(UCIe/CCIX/CXL 或 NOC-to-NOC 通道);
    每一级 NOC 都要做一次地址译码与转发,因此带宽、时延、错误传播范围都会放大,需要额外的排序/一致性保障。

三张图的对比总结

图跨越了什么经过 NOC额外跳数
single_rc.png只跨 RP(同一 RC 内)❌0(只在 data_fabric 内部转一次)
sing_nc.png跨两个 RC(同 NOC)✅ 同一个 NC-NOC+2(上、下各一次)
multi_nc.png跨两个 RC + 跨两个 NOC✅✅ 两个 NC-NOC + NOC 间链路+3 及以上

9.2 Switch 场景:ACS 是开关

ACS 位想直通时想隔离时(虚拟化/IOMMU 强制)
RR Request Redirect关(开着会把 P2P 请求重定向回 RC)开
CR Completion Redirect关开
UF Upstream Forwarding Disable关视策略
SV Source Validation保持开开
TB Translation Blocking一般关开

一句话:ACS 开着 = 直通被安全策略挡住;ACS 关着 = Switch 才肯让两个下游口自己聊。

9.3 跨 NOC / 跨 Socket 的手段

手段做法代价
DDR 中转卡A → RC0 → DDR → RC1 → 卡B两次 DMA,吃两遍内存带宽
NTB(非透明桥)outbound/inbound window + scratchpad + doorbell需要两侧软件配合、地址翻译
CCIX / CXL链路训练后建立一致性域,加速器间对称 P2P需要链路与一致性层支持

NTB 的四个要素:outbound window(本侧→对侧)、inbound window(对侧→本侧)、scratchpad(状态交换)、doorbell(带数据触发中断)。
写数据 → clean → fence → 敲 doorbell,是固定顺序。


10. 数据交互逻辑:控制面与数据面分离

目标卡(BAR 认领)RC / Switch发起卡 DMA控制面(固件/驱动)目标卡(BAR 认领)RC / Switch发起卡 DMA控制面(固件/驱动)① 从枚举表取 B 的 BAR 地址 A② 写描述符(源/目的/长度/方向)③ 写 doorbell(必要时先 clean+fence)④ MWr/MRd(目标 = A)⑤ 命中 B 所在 RP/Switch 端口窗口⑥ CplD / Cpl⑦ 完成中断或状态置位⑧ 清中断、回收描述符、查错误计数

三条路径的差别:

路径经过带宽占用何时用
经主机 DDRA → RC → CC_NoC(DMI) → DDR → RC → B内存带宽 ×2默认/兜底
同 RC P2PA → RC → B(TLP 不出 RC)占链路带宽,不占 DDR同子系统/同 Switch
跨 SocketA → RC → CCIX/CXL/NTB → 对端占链路带宽分布式/池化

一致性要点:

  1. TLP 的 No-Snoop 位决定走 Pcie PCAIU(一致性代理,snoop CPU cache)还是 NCAIU(非一致);
  2. No-Snoop 路径必须软件维护:写数据 → cbo.clean → fence → doorbell;
  3. P2P 连这一步都没有 —— TLP 在 RC 内部掉头,压根不碰 DDR/CC_NoC;
  4. 完成同步永远要有超时与恢复路径,链路降速/掉链会变成"看起来像挂死"的长尾。

11. 排障清单:症状 → 根因

现象根因查哪里
UR(Unsupported Request)目标地址没有 BAR 认领 / 窗口没配目标 BAR 值、目标 RP 窗口、枚举日志
CA(Completer Abort)目标设备内部错误 / 对齐非法设备错误寄存器、AER 日志
Completion Timeout目标不在(链路未训练)/ 路由到错误端口LTSSM 状态、Link Status
P2P 请求被送回主机ACS RR/CR 开着Switch 的 ACS 能力寄存器
偶发旧数据No-Snoop 未做 cache 维护;缺 fenceTLP 属性位、cbo.* 调用点
吞吐上不去链路宽度/速率、x16 分叉成 x4、上游端口瓶颈Link Status 的 Width/Speed、分叉配置
CPU 访问 EP 直接失败SUB CSR 窗口没配 / 与 Type1 不一致SUBSYS_REG_MMIOL/MMIOH_ADDR_*

抓点分层:固件(枚举表、窗口回读、DMA 描述符) → RC/Switch(AER、ACS、Link Status) →
协议层(TLP 是否到达目标、Requester ID) → 系统(中断是否触发、dmesg 里的 AER/UR)。


12. 一页速查

配置访问: ECAM 地址 = base + bus<<20 + dev<<15 + func<<12 + off,
           走 CFG-NOC → control_fabric → DBI,事务按 Bus:Dev:Func
内存访问: MMIO-L(32 位 BAR)/MMIO-H(64 位预取),走 NC-NOC → data_fabric,
           事务按地址窗口,32 位 BAR 只能 <4GB
P2P 四步: Type1 窗口 → SUB CSR 译码 → 枚举写 BAR → DMA 目标=对端 BAR
P2P 路由: 只在 RC 内部按 Type1 头转发,不经 CPU、不用 SUB CSR
多卡拓扑: 同 RC(只走 data_fabric)✅ / 跨 RC 同 NOC(上·下 NC-NOC)✅ /
           跨 NOC(NOC 间链路)✅ / 同 Switch ✅(关 ACS RR·CR) / 跨 Socket 需 CCIX·CXL
一致性:   No-Snoop → 软件 clean+inval+fence;P2P 不涉及

C# 移动无标题栏无边框窗体的3种方法 目录 第一种:手工移动 第二种:调用系统API 1.引入下面代码 前提需要引入命名空间using System.Runtime.InteropServices 2.增加鼠标按下事件发送消息,让系统误以为按下是标题栏 第三种,重写 WndProc 第一种:手工移动 直接通过修改窗体位置从而达到移动窗体的效果 //定义一个位置信息Point用于存储鼠标位置 private Point mPoint; /// <summary> 阅读详情

相关推荐

保姆级教程:在通达信V7.611上配置欧奈尔RPS曲线(附完整公式与每日更新流程)

本文提供通达信V7.611配置欧奈尔RPS曲线的保姆级教程,涵盖从环境准备、基础设置到核心公式配置的全流程。详细讲解如何创建股票池、编写EXTRS基础公式及RPS显示公式,并附每日更新流程与实战应用技巧,帮助投资者精准捕捉强势股。

weixin_30000735的博客 464

Delphi无标题窗体增强功能实现:让无标题窗体更具交互性

Delphi无标题窗体增强功能实现:让无标题窗体更具交互性 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在软件开发领域,Delphi 语言因其高效的执行速度和清晰的语法结构,一直受到开发者的喜爱。然而,在使用无标题窗体(borderstyle=bsnone)时,开发者常常面临一个问题:用户无法通过常规方式来移动或调整窗体大小。本项目正是为了解决这一难题而诞生,它提供...

gitblog_06708的博客 1021

AI订单流异常检测:精准识别与闭环处置

本文系统阐述了订单流AI驱动的可视化与异常解释系统的构建策略。核心包括:1)多维度融合的异常检测技术,结合数据指纹、行为图谱和时序分析实现精准识别;2)分级分类与自动化处置机制,通过规则矩阵和风险熵值量化进行智能决策;3)基于SHAP/LIME的可解释性技术,提升决策透明度;4)千万级数据训练要求,确保模型达到87%以上的F1值。系统采用Flink+PAI实时计算架构,支持从异常检测到根因分析的完整闭环,为电商、金融等领域的订单风险管理提供智能化解决方案。

2401_83000568的博客 1360

无标题栏窗口拖动的实现

普通的Windows应用程序窗口都具有统一的窗口风格,它们一般都包括:用户区和非用户区两部分。非用户区包括标题条、窗口边框、最大化按钮、最小化按钮、关闭按钮和系统默认的快捷键及鼠标支持等。利用鼠标的左键通过拖动窗口的标题条可以在屏幕上任意移动整个窗口,当光标停止在窗口边框上时可以改变窗口的大小。在一些比较经典的软件中,有一类特殊的无标题条的窗口。这种窗口不需要改变窗口的大小,但必须具有窗口客户区域

ArduousBonze的专栏 4059

手把手教你用西门子博图V18配置阿特拉斯PF6000拧紧枪PN通讯(附完整GSD文件与ToolsTalk配置文件)

本文详细介绍了如何使用西门子博图V18配置阿特拉斯PF6000拧紧枪的PN通讯,包括硬件连接、网络参数规划、ToolsTalk软件配置及博图工程设置。通过完整的GSD文件和配置文件,帮助工程师快速实现高精度拧紧设备与PLC的高效通讯,适用于汽车装配和电子制造等工业自动化场景。

weixin_42662293的博客 602

图像配准方法之灰度信息法

这系列文章是5年前的,也是从自己的QQ(632846506)日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。      图像配准的方法主要有三种:基于灰度信息方法;基于空间变换域方法;基于图像特征的方法。 一、灰度信息法。     灰度信息法直接利用两幅图像之间灰度度量的相似性,以图像内部的信息为依据,采用搜索方法寻找相似度最大或

月秀明竹的专栏 1万+

无标题窗口的拖动

普通的Windows应用程序窗口都具有统一的窗口风格,它们一般都包括:用户区和非用户区两部分。非用户区包括标题条、窗口边框、最大化按钮、最小化按钮、关闭按钮和系统默认的快捷键及鼠标支持等。利用鼠标的左键通过拖动窗口的标题条可以在屏幕上任意移动整个窗口,当光标停止在窗口边框上时可以改变窗口的大小。在一些比较经典的软件中,有一类特殊的无标题条的窗口。这种窗口不需要改变窗口的大小,但必须具有窗口客户区域

lianxiao1314的专栏 1000

昇腾NPU实战:PaddleSpeech语音模型高效部署与性能优化指南

本文详细介绍了如何在华为昇腾NPU上高效部署PaddleSpeech语音识别模型。通过使用官方Docker镜像、解决依赖冲突、修改源码适配NPU算子,并应用混合精度与批处理等优化技巧,实现模型在昇腾平台上的稳定运行与性能提升,为AI语音应用提供高性价比的国产硬件部署方案。

weixin_29214691的博客 181

C#拖动无标题栏窗体

很长时间没有写博客了,今天又解决并测试通过了一个Delphi很简单的问题——无标题栏窗体的拖动 。其实是个很简单的问题,但是还是想写下来,一方面加深自己的记忆,一方面与朋友们分享!DeviceAnywhere在Ioicn发布了,反响似乎一般,我想是因为.net FrameWork环境的问题吧,希望Microsoft再出sp的时候把.net FrameWorkx.x集成到操作系统里吧,这样大家都方便

Windows Mobile 开发历险 1959

手把手教你学simulink(69.3)--毫米波5G/6G 系统场景实例设计并实现基于Simulink的毫米波多用户MIMO通信系统模型

毫米波频段(30 GHz到300 GHz)因其高带宽和高速率特性,成为5G和未来6G通信系统的理想选择。然而,毫米波信号的传播特性较差,容易受到大气吸收、雨衰、建筑物遮挡等因素的影响。为了克服这些挑战并提高通信容量,多用户MIMO(MU-MIMO, Multi-User Multiple-Input Multiple-Output)技术被广泛应用。多用户MIMO技术通过在基站和多个用户之间同时传输多个数据流,充分利用空间资源,从而显著提升系统容量和频谱效率。

MHD0815的博客 493

赛豆科技 AIVA 汽车智能体架构演进面试题与答案

摘要 赛豆科技AIVA汽车智能体架构从座舱AI演进到整车智能体,最终实现自进化的超级智能体。其核心是"先有AI再有车"的理念,将AI作为产品主轴而非附加功能。架构设计采用端-边-云协同,确保低延迟响应;整车智能体通过Planner、Tool Registry等关键组件实现自主决策;自进化机制结合车端个性化学习和云端群体学习,并设置多重安全验证。多域协作采用分层架构,关键安全功能仍由确定性逻辑控制。该架构实现了从被动响应到主动服务的范式转变,使车辆能够持续进化。

AI天才研究院 122

android设置activity全屏 | 无标题

1.设置activity无标题 方法一: 在Manifest.xml中为activity增加属性:  android:theme="@android:style/Theme.NoTitleBar" 方法二: 在activity的onCreate()中加入:requestWindowFeature(Window.FEATURE_NO_TITLE); 2.设置activity全屏

CNnumen 1万+

Cadence OrCAD Capture 软件自带元件原理图符号库目录与介绍图文视频教程

硬件工程师在开始原理图设计时,应该首先拥有自己的元件原理图符号库。基于Capture进行原理图设计的一个很大的优点就是,软件自带的元件库比较全。本文简单介绍Capture软件自带元件库。

fydar的博客 5579

Android应用设置无标题栏的实现方式

去掉标题栏   第一,在代码中实现; requestWindowFeature(Window.FEATURE_NO_TITLE); 代码要写在setContentView()前。 第二,在xml文件中进行配置; 调用系统自带的样式; 实现全屏效果: android:theme="@android:style/Theme.NoTitleBar.Fullscree

三颗猴面包树 1500

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C#中的无标题栏窗体

所以谓的无标题栏窗体,与标题无关,看边框设置将窗体的FormBorderStyle属性设置为None就可以了,其它的一些属性只是一些显示样式.关于无标题栏窗体的拖动就用傻办法,至少我看到的都是这样的.关于这一方面的介绍不少,我就不在这里缀述了,如果有想要示例的,可以留下邮箱.

fqlove的专栏 1444

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

delphi技巧——移动无标题窗口

 delphi技巧——移动无标题窗口关键词:移动,消息,无标题                      作者:朱能文   我们都知道windows是通过标题栏来移动窗体的,当我们在标题栏上按下鼠标左键时,windows将发送wM_NCHitTest消息,来告诉系统要移动窗体。但我们在实际编程时,有时为了界面的需要或特殊的要求,窗体没有标题栏,我们必须通过程序来移动窗体。下面我将介

nwen的专栏 1282

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Delphi 无标题窗体增强功能实现

Delphi 无标题窗体增强功能实现 去发现同类优质开源项目:https://gitcode.com/ 资源简介 本资源提供了一种在 Delphi 开发环境中对无标题窗体(borderstyle=bsnone)进行增强的方法。默认情况下,无标题窗体不显示边框,用户无法通过常规方式移动或调整窗体大小。本资源通过特定的技术手段,为无标题窗体添加了边框,同时实现了窗体的拖拽调整大小和移动位置的功能。 功...

gitblog_06743的博客 433

android 设置为无标题,android无标题全屏的三种设置方式

注意,在设置前把XXX-Activity extends ActionBarActivity 修改成XXX-Activity extends Activity,否则activity无法启动1.在onCreat方法中setContentView()之前插入//设置无标题requestWindowFeature(Window.FEATURE_NO_TITLE);//设置全屏getWindow().s...

weixin_35398679的博客 825

移动无标题栏的窗口-java

import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener;

Ymy2011的专栏 591

【无标题】

今天在练习自定义标题栏(Android初级开发(四)——补充3)的过程中遇到了隐藏系统自带标题栏的问题,现将几种去掉系统自带标题栏的方式做一总结。大体上可以分为两种方式,一种是修改xml文件(这种方式产生的效果作用于所有Activity),一种是编码实现(这种方式产生的效果只作用于当前Activity): 方法1-1: 1、查看清单文件AndroidManifest.xml中的theme android:theme="@style/AppTheme"(系统默认的)保...

xujingcheng123的博客 165

android ActionBarActivity设置全屏无标题

新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,要么就是黑屏。坑了我一个多小时!!! 原因是ActionBarActivity设置theme的时候只能使用v7包里的Theme.AppCompat***开头的主题,因此设置全屏无标题的话需要自定义个style: name="ActionBar

奥特曼超人的博客专栏 2274

android手机设置无标题后,程序挂掉 解决 (如何用最简短语句设置 手机 全屏无标题)

手机设置无标题后,总是挂掉,最初以为是布局的问题,换了还是不中,然后新建一个工程,发现还是不中!怎么回事?我以前是搞过着的啊,原来设置全屏无标题,这些语句一定要设在setContentView前面!谨记啊! 还是对这些知识不熟悉,所以我写到这,复习下! 设置无标题+全屏: requestWindowFeature(Window.FEATURE_NO_TITLE); int flag = Wi

yanzi1225627的专栏 3033

Android设置无标题窗口

在android中,有的时候要做一个无标题的窗口,包括没状态栏的,有两种方法实现:  1 在XML配置文件中:             package="de.vogella.android.temperature"        android:versionCode="1"        android:versionName="1.0">

Bottle's Blog 6万+

界面_无标题窗口的移动

使用OnNcHitTest消息实现无标题窗口的移动////////////////////////////////////////////////////////////UINT myWnd::OnNcHitTest(CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 // rect 指定,鼠标点在什么地方时,可以移动窗口 // 其实就是把这部分区域当成是 标

2057

Android应用界面无标题栏和全屏效果的两种实现方式

我们在开发Android应用的时候,很多情况下为了提高屏幕显示的内容,需要设置无标题或者是全屏模式。但是如何进行这样的设置呢?主要有以下两种方式:(1)AndroidManifest.xml配置文件进行配置;(2)在Activity类中写程序语句进行设置。

Fantasy Dancer 2488
上一篇: fence 到底在解决什么问题:内存序、可见性与缓存的边界
下一篇: Android TA/CA 开发与 Binder 各层适配(含通信演示)
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值