智能网卡之hinic3 WQE(Work Queue Element)结构梳理
hinic3 WQE(Work Queue Element)结构详解
本文基于 hinic3
驱动源码,对 WQE(Work Queue Element)做详细讲解。如需查阅完整源码和结构体定义可参考hinic3_nic_qp.h等文件。
1. WQE 的作用
- WQE(Work Queue Element):网卡芯片可识别的数据格式。
- sk_buff:Linux 协议栈中的数据结构,硬件不可直接识别。
- 驱动作用:负责将
sk_buff
转换为 WQE,供硬件使用。
类比
+---------------------+ 转换 +------------------+ 交互
| 上层 sk_buff | -------------> | WQE | ----> 网卡芯片
+---------------------+ 驱动 +------------------+ 硬件
2. SQ队列与wqebb
- SQ:发送队列(Send Queue)。
- wqebb(Work Queue Element Basic Block):SQ的最小分配单元,每个大小为16字节(16B)。
- 最大深度:16K(16384)个 wqebb。
- 一个WQE 可以包括多个 wqebb。
+---------+---------+---------+ ... +---------+
| wqebb 0 | wqebb 1 | wqebb 2 | ... | wqebb N |
+---------+---------+---------+ ... +---------+|<--- 一个WQE由多个wqebb组成 --->|
相关宏定义见 hinic3_nic_io.h:
#define HINIC3_SQ_WQEBB_SHIFT 4
#define HINIC3_SQ_WQEBB_SIZE BIT(HINIC3_SQ_WQEBB_SHIFT) // 16B
3. SQ WQE 的三种类型
设计目的
为提升端到端性能,hinic3 的 SQ WQE 结构支持三种类型:
- 1. Extended SQ WQE with normal TS(支持无状态卸载,结构最复杂,支持各种 offload)
- 2. Extended SQ WQE with small TS(不支持无状态卸载,支持多SGE)
- 3. Compact SQ normal WQE(不支持无状态卸载,且只含单SGE,结构最简单)
4. WQE 结构与bit详细解析
4.1 Extended SQ WQE with normal TS(支持无状态卸载)
结构组成
- CTRL(Control Segment):描述WQE属性、部分卸载信息
- TASK:状态卸载标志(16B)
- BDSL(Buffer Descriptor Segment List):指向数据块的指针数组
- QSF:卸载相关任务字段
结构框图
CTRL字段详细bit位解释(来自hinic3_nic_qp.h)
字段 | 含义 |
---|---|
O | Owner bit,在队列翻转时,需要进行 obit 的翻转 |
EC | wqe type: 1’b1 - extended wqe type;1’b0 - compact wqe type |
DN | 1’b1 - Direct wqe type;1’b0 - Normal wqe type,NIC 默认设置为 0 |
DF | Data format:1’b0 – SGL;1’b1 - inline data,NIC 使用 SGL 方式 |
TS | Task section size:1’b1 - 16B;1’b0 - 46bit |
BDSL | SGE number(包括 wqe header 和 BDSL section 中的 sge 数量) |
相关宏定义:
#define SQ_CTRL_BD0_LEN_SHIFT 0
#define SQ_CTRL_RSVD_SHIFT 18
#define SQ_CTRL_BUFDESC_NUM_SHIFT 19
#define SQ_CTRL_TASKSECT_LEN_SHIFT 27
#define SQ_CTRL_DATA_FORMAT_SHIFT 28
#define SQ_CTRL_DIRECT_SHIFT 29
#define SQ_CTRL_EXTENDED_SHIFT 30
#define SQ_CTRL_OWNER_SHIFT 31#define SQ_CTRL_BD0_LEN_MASK 0x3FFFFU
#define SQ_CTRL_RSVD_MASK 0x1U
#define SQ_CTRL_BUFDESC_NUM_MASK 0xFFU
#define SQ_CTRL_TASKSECT_LEN_MASK 0x1U
#define SQ_CTRL_DATA_FORMAT_MASK 0x1U
#define SQ_CTRL_DIRECT_MASK 0x1U
#define SQ_CTRL_EXTENDED_MASK 0x1U
#define SQ_CTRL_OWNER_MASK 0x1U
TASK字段结构(16B)
相关宏定义:
#define SQ_TASK_INFO0_TUNNEL_FLAG_SHIFT 19
#define SQ_TASK_INFO0_ESP_NEXT_PROTO_SHIFT 22
#define SQ_TASK_INFO0_INNER_L4_EN_SHIFT 24
#define SQ_TASK_INFO0_INNER_L3_EN_SHIFT 25
#define SQ_TASK_INFO0_INNER_L4_PSEUDO_SHIFT 26
#define SQ_TASK_INFO0_OUT_L4_EN_SHIFT 27
#define SQ_TASK_INFO0_OUT_L3_EN_SHIFT 28
#define SQ_TASK_INFO0_OUT_L4_PSEUDO_SHIFT 29
#define SQ_TASK_INFO0_ESP_OFFLOAD_SHIFT 30
#define SQ_TASK_INFO0_IPSEC_PROTO_SHIFT 31#define SQ_TASK_INFO0_TUNNEL_FLAG_MASK 0x1U
#define SQ_TASK_INFO0_ESP_NEXT_PROTO_MASK 0x3U
#define SQ_TASK_INFO0_INNER_L4_EN_MASK 0x1U
#define SQ_TASK_INFO0_INNER_L3_EN_MASK 0x1U
#define SQ_TASK_INFO0_INNER_L4_PSEUDO_MASK 0x1U
#define SQ_TASK_INFO0_OUT_L4_EN_MASK 0x1U
#define SQ_TASK_INFO0_OUT_L3_EN_MASK 0x1U
#define SQ_TASK_INFO0_OUT_L4_PSEUDO_MASK 0x1U
#define SQ_TASK_INFO0_ESP_OFFLOAD_MASK 0x1U
#define SQ_TASK_INFO0_IPSEC_PROTO_MASK 0x1U
QSF 字段(主要和卸载相关)
Field | Range | Comments |
---|---|---|
pri | [31:29] | RSV |
Uc | [28] | RSV |
sctp | [27] | Sctp packet. |
mss | [26:13] | mss |
tcp_udp_cs | [12] | RSV |
tso | [11] | Transmit segmentation offload is activated when the tso flag is set. Not support TSO, when pkt_type=2’b01; |
ufo | [10] | For UDP packet, engine reads the whole UDP packet from host by 1 DMA read, and IPSU calculates UDP checksum, uCode does IP segment. |
Pld_ofs | [9:2] | Pkt_type = 2’b00: Payload offset. It is the start position to calculate tcp/udp checksum or sctp CRC. Unit is 2B, the max value is 239 (239*2=478B) Pkt_type = 2’b01: Bit9:5 – RSV Bit4:2 – cmd_code to AAD |
Pkt_type | [1:0] | pkt_type: 2’b00 – normal sq WQE; 2’b01 – sq direct-forward WQE; Others – RSV; |
相关宏定义:
#define SQ_CTRL_QUEUE_INFO_PKT_TYPE_SHIFT 0
#define SQ_CTRL_QUEUE_INFO_PLDOFF_SHIFT 2
#define SQ_CTRL_QUEUE_INFO_UFO_SHIFT 10
#define SQ_CTRL_QUEUE_INFO_TSO_SHIFT 11
#define SQ_CTRL_QUEUE_INFO_TCPUDP_CS_SHIFT 12
#define SQ_CTRL_QUEUE_INFO_MSS_SHIFT 13
#define SQ_CTRL_QUEUE_INFO_SCTP_SHIFT 27
#define SQ_CTRL_QUEUE_INFO_UC_SHIFT 28
#define SQ_CTRL_QUEUE_INFO_PRI_SHIFT 29#define SQ_CTRL_QUEUE_INFO_PKT_TYPE_MASK 0x3U
#define SQ_CTRL_QUEUE_INFO_PLDOFF_MASK 0xFFU
#define SQ_CTRL_QUEUE_INFO_UFO_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_TSO_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_TCPUDP_CS_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_MSS_MASK 0x3FFFU
#define SQ_CTRL_QUEUE_INFO_SCTP_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_UC_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_PRI_MASK 0x7U
BDSL(Buffer Descriptor Segment List)
由若干个 struct hinic3_sq_bufdesc
组成,每个struct hinic3_sq_bufdesc
结构体可以包含一个SGE 数据:
struct hinic3_sq_bufdesc {u32 len; // 31bit长度u32 rsvd;u32 hi_addr; // 高32位物理地址u32 lo_addr; // 低32位物理地址
};
4.2 Extended SQ WQE with small TS(不支持无状态卸载,多SGE)
- 结构类似normal TS,但不能用offload。
- BDSL部分要求sge_num >= 2,CTRL里可以带一个SGE指针。
4.3 Compact SQ normal WQE(单SGE,极简)
- 只占用1个wqebb(16B),极致精简。
- 适用于不需要offload且报文只含1个SGE的场景。
5. Doorbell 结构详解
驱动填充完WQE后,用doorbell机制通知硬件。hinic3采用64bit doorbell,结构如下:
Doorbell数据结构(hinic3_nic_io.h)
struct hinic3_nic_db {u32 db_info;u32 pi_hi;
};
db_info字段按位解释:
- QID[12:0]:队列编号
- CFLAG[23]:0表示SQ, 1表示RQ
- Cos[26:24]:优先级
- Type[31:27]:类型(一般1)
- PI: Producer Index
相关宏定义:
#define DB_INFO_QID_SHIFT 0
#define DB_INFO_NON_FILTER_SHIFT 22
#define DB_INFO_CFLAG_SHIFT 23
#define DB_INFO_COS_SHIFT 24
#define DB_INFO_TYPE_SHIFT 27#define DB_INFO_QID_MASK 0x1FFFU
#define DB_INFO_NON_FILTER_MASK 0x1U
#define DB_INFO_CFLAG_MASK 0x1U
#define DB_INFO_COS_MASK 0x7U
#define DB_INFO_TYPE_MASK 0x1FU
6. RQ WQE 结构与bit详细解析
6.1 RQ WQE 结构体
hinic3 的 RQ(Receive Queue)WQE 主要有两种结构:普通模式和扩展模式。其核心结构体如下:
struct hinic3_rq_normal_wqe {u32 buf_hi_addr;u32 buf_lo_addr;u32 cqe_hi_addr;u32 cqe_lo_addr;
};struct hinic3_rq_extend_wqe {struct hinic3_sge_sect buf_desc;struct hinic3_sge_sect cqe_sect;
};struct hinic3_rq_wqe {union {struct hinic3_rq_normal_wqe normal_wqe;struct hinic3_rq_extend_wqe extend_wqe;};
};
- buf_hi_addr / buf_lo_addr:数据缓冲区物理地址高/低 32 位。
- cqe_hi_addr / cqe_lo_addr:CQE 缓冲区物理地址高/低 32 位。
- buf_desc / cqe_sect:扩展模式下的 SGE 描述符。
由结构体可见,RQ WQE 也是16byte。其内存分配和管理与SQ WQE共用一套代码和接口。有差异的是结构体中每bit 的含义不一样。
6.2 RQ CQE 结构体
硬件收包后会写入 CQE(Completion Queue Element),结构如下:
struct hinic3_rq_cqe {u32 status;u32 vlan_len;u32 offload_type;u32 hash_val;u32 xid;u32 decrypt_info;u32 rsvd6;u32 pkt_info;
};
RQ WQE/CQE 结构框图
+-------------------+-------------------+-------------------+-------------------+
| status (32b) | vlan_len (32b) | offload_type (32b)| hash_val (32b) |
+-------------------+-------------------+-------------------+-------------------+
| xid (32b) | decrypt_info(32b) | rsvd6 (32b) | pkt_info (32b) |
+-------------------+-------------------+-------------------+-------------------+
主要字段说明
字段 | 含义 |
---|---|
status | 状态字段,包含校验和错误、LRO、RXDONE 等信息 |
vlan_len | 高 16 位为 VLAN Tag,低 16 位为包长度 |
offload_type | 硬件卸载类型,包含包类型、IP 类型、VLAN、RSS 等 |
hash_val | RSS Hash 值 |
xid | 交换 ID |
decrypt_info | 解密相关信息 |
pkt_info | 超级 CQE、包数、首包/尾包长度等 |
6.3 关键bit位与宏定义
1. offload_type 字段
字段 | 位宽/偏移 | 说明 |
---|---|---|
PKT_TYPE | [4:0] | 包类型 |
IP_TYPE | [6:5] | IP 类型 |
ENC_L3_TYPE | [7] | 封装 L3 类型 |
TUNNEL_FMT | [11:8] | 隧道包格式 |
PKT_UMBCAST | [20:19] | 组播/广播 |
VLAN_EN | [21] | VLAN 有效 |
RSS_TYPE | [31:24] | RSS 类型 |
相关宏定义:
#define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_SHIFT 0
#define RQ_CQE_OFFOLAD_TYPE_IP_TYPE_SHIFT 5
#define RQ_CQE_OFFOLAD_TYPE_ENC_L3_TYPE_SHIFT 7
#define RQ_CQE_OFFOLAD_TYPE_TUNNEL_PKT_FORMAT_SHIFT 8
#define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_SHIFT 19
#define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_SHIFT 21
#define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_SHIFT 24#define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_MASK 0x1FU
#define RQ_CQE_OFFOLAD_TYPE_IP_TYPE_MASK 0x3U
#define RQ_CQE_OFFOLAD_TYPE_ENC_L3_TYPE_MASK 0x1U
#define RQ_CQE_OFFOLAD_TYPE_TUNNEL_PKT_FORMAT_MASK 0xFU
#define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_MASK 0x3U
#define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_MASK 0x1U
#define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_MASK 0xFFU
2. vlan_len 字段
- 高 16 位为 VLAN Tag,低 16 位为包长度。
相关宏定义:
#define RQ_CQE_SGE_VLAN_SHIFT 0
#define RQ_CQE_SGE_LEN_SHIFT 16#define RQ_CQE_SGE_VLAN_MASK 0xFFFFU
#define RQ_CQE_SGE_LEN_MASK 0xFFFFU
3. status 字段
字段 | 位宽/偏移 | 说明 |
---|---|---|
CSUM_ERR | [15:0] | 校验和错误 |
NUM_LRO | [23:16] | LRO 包数 |
LRO_PUSH | [25] | LRO 推送 |
LRO_ENTER | [26] | LRO 进入 |
LRO_INTR | [27] | LRO 中断 |
FLUSH | [28] | Flush 标志 |
DECRY_PKT | [29] | 解密包 |
BP_EN | [30] | BP 使能 |
RXDONE | [31] | 收包完成 |
相关宏定义:
#define RQ_CQE_STATUS_CSUM_ERR_SHIFT 0
#define RQ_CQE_STATUS_NUM_LRO_SHIFT 16
#define RQ_CQE_STATUS_LRO_PUSH_SHIFT 25
#define RQ_CQE_STATUS_LRO_ENTER_SHIFT 26
#define RQ_CQE_STATUS_LRO_INTR_SHIFT 27#define RQ_CQE_STATUS_BP_EN_SHIFT 30
#define RQ_CQE_STATUS_RXDONE_SHIFT 31
#define RQ_CQE_STATUS_DECRY_PKT_SHIFT 29
#define RQ_CQE_STATUS_FLUSH_SHIFT 28#define RQ_CQE_STATUS_CSUM_ERR_MASK 0xFFFFU
#define RQ_CQE_STATUS_NUM_LRO_MASK 0xFFU
#define RQ_CQE_STATUS_LRO_PUSH_MASK 0X1U
#define RQ_CQE_STATUS_LRO_ENTER_MASK 0X1U
#define RQ_CQE_STATUS_LRO_INTR_MASK 0X1U
#define RQ_CQE_STATUS_BP_EN_MASK 0X1U
#define RQ_CQE_STATUS_RXDONE_MASK 0x1U
#define RQ_CQE_STATUS_FLUSH_MASK 0x1U
#define RQ_CQE_STATUS_DECRY_PKT_MASK 0x1U
4. pkt_info 字段
- 超级 CQE、包数、首包/尾包长度等。
相关宏定义:
#define RQ_CQE_SUPER_CQE_EN_MASK 0x1
#define RQ_CQE_PKT_NUM_MASK 0x1FU
#define RQ_CQE_PKT_FIRST_LEN_MASK 0x1FFFU
#define RQ_CQE_PKT_LAST_LEN_MASK 0x1FFFU
5. decrypt_info 字段
- 解密状态、ESP next header。
相关宏定义:
#define RQ_CQE_DECRY_INFO_DECRY_STATUS_SHIFT 8
#define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_SHIFT 0#define RQ_CQE_DECRY_INFO_DECRY_STATUS_MASK 0xFFU
#define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_MASK 0xFFU
6.4 RQ CQE 字段解析流程示例
static inline u32 hinic3_get_pkt_len_for_super_cqe(const struct hinic3_rq_cqe *cqe, bool last)
{u32 pkt_len = hinic3_hw_cpu32(cqe->pkt_info);if (!last)return RQ_CQE_PKT_LEN_GET(pkt_len, FIRST_LEN);elsereturn RQ_CQE_PKT_LEN_GET(pkt_len, LAST_LEN);
}
相关文章:

智能网卡之hinic3 WQE(Work Queue Element)结构梳理
hinic3 WQE(Work Queue Element)结构详解 本文基于 hinic3 驱动源码,对 WQE(Work Queue Element)做详细讲解。如需查阅完整源码和结构体定义可参考hinic3_nic_qp.h等文件。 1. WQE 的作用 WQE(Work Queue…...
go的工具库:github.com/expr-lang/expr
github.com/expr-lang/expr 是一个 Go 语言的表达式求值库,它允许你在运行时安全地执行表达式。主要用途包括: 1.表达式求值: program, err : expr.Compile("2 2") if err ! nil {// 处理错误 } result, err : expr.Run(program…...

力扣HOT100之二分查找:4. 寻找两个正序数组的中位数
这道题如果没有时间复杂度的限制的话,相当好做,但是这道题要求时间复杂度为O(log(m n)),思路很难想,我看了一圈题解,发现华南溜达虎的视频讲得还不错,我是参考他的思路写出来的,这里把他的思路…...

PyTorch——损失函数与反向传播(8)
Loss Functions 越小越好 L1loss MSELoss 损失函数 CrossEntyopyLoss 损失函数 import torch from torch.nn import L1Loss from torch import nn# 创建输入和目标张量,用于后续的损失计算 inputs torch.tensor([1,2,3],dtypetorch.float32) targets torch.tenso…...

macOS 升级 bash 到最新版本
macOS 的默认「终端」,千年不变的版本。 》〉bash --version GNU bash, version 3.2.57(1)-release (arm64-apple-darwin24) Copyright (C) 2007 Free Software Foundation, Inc. 官方 bash.git - bash 已经将 bash 升级到了 5.2的大版本。 macOS 最新版系统的 ba…...
Linux下如何查看一个端口被什么进程占用? 该进程又打开了哪些文件?
Linux下如何查看一个端口被什么进程占用? 该进程又打开了哪些文件? 查看端口 1.使用lsof命令查看端口占用的进程 lsof可以列出系统上打开的文件,其中包括网络连接、进程信息等。 lsof -i:<端口号> 例如,如果需…...

力扣面试150题--课程表
Day 63 题目描述 做法 初次思路:本质就是将所有前置课程和后置课程作为一个有向图(前者指向后者),判断这个图是否是一个有向无环图(即是否存在拓扑排序)(本质做法是dfs) 做法&…...

用通俗的话解释下MCP是个啥?
在AI领域,模型的开发、部署和迭代速度日益加快,但随之而来的挑战也愈发显著:如何高效管理不同版本的模型?如何在复杂环境中确保模型的可追溯性和可复用性?如何实现跨团队、跨平台的模型协作? 在计算机领域…...

LeetCode 高频 SQL 50 题(基础版)之 【子查询】· 上
题目:1978. 上级经理已离职的公司员工 题解: select employee_id from Employees where salary<30000 and manager_id is not null and manager_id not in (select distinct employee_id from Employees ) order by employee_id题目:626.…...

Spark流水线+Gravitino+Marquez数据血缘采集
1.Openlinage和Marquez简介 1.1 OpenLineage 概述 OpenLineage 是一个开放标准和框架,用于跨工具、平台和系统捕获数据血缘信息。它定义了通用的数据血缘模型和API,允许不同的数据处理工具(如ETL、调度器、数据仓库)以标准化格…...
一个完整的时间序列异常检测系统,使用Flask作为后端框架,实现了AE(自编码器)、TimesNet和LSTM三种模型,并提供可视化展示
时间序列异常检测系统 下面是一个完整的时间序列异常检测系统,使用Flask作为后端框架,实现了AE(自编码器)、TimesNet和LSTM三种模型,并提供可视化展示。 系统概述 这个系统能够: 从多种来源加载时间序列数据使用三种先进算法进行异常检测可视化展示原始数据、重建数据和…...
深度学习在非线性场景中的核心应用领域及向量/张量数据处理案例,结合工业、金融等领域的实际落地场景分析
一、工业场景:非线性缺陷检测与预测 1. 半导体晶圆缺陷检测 问题:微米级划痕、颗粒污染等缺陷形态复杂,与正常纹理呈非线性关系。解决方案: 输入张量:高分辨率晶圆图像 → 三维张量 (Batch, Height,…...

基于微信小程序的车位共享平台的设计与实现源码数据库文档
摘 要 近年来,随着国民经济的飞速发展,城镇化进程的步伐加快,城市人口急剧增长,人们的生活水平持续改善,特别是大中型城市,城市的交通规模日益增大,汽车的保有量不断提高,然而城市的…...

多模态大语言模型arxiv论文略读(111)
SEA: Supervised Embedding Alignment for Token-Level Visual-Textual Integration in MLLMs ➡️ 论文标题:SEA: Supervised Embedding Alignment for Token-Level Visual-Textual Integration in MLLMs ➡️ 论文作者:Yuanyang Yin, Yaqi Zhao, Yaji…...
网页端 VUE+C#/FastAPI获取客户端IP和hostname
1 IP可以获取,但是发现获取到的是服务端的IP,如何解决呢。 如果采用nginx反向代理,那么可以在conf/nginx.conf文件中配置 location /WebApi/ { proxy_pass http://localhost:5000/; #这个/会替换location种的WebApi路径 #关键,加…...
一个自动反汇编脚本
一、环境 wsl ubuntu18.04、python3.6 二、目的 调试程序,需要分析第三方库。希望能将多个库自动转为汇编文件。 三、使用方法 将该脚本下载,进入wsl,进入到该脚本所有文件夹。 请使用 python 脚本名.py 运行。 1)、运行…...
函数与数列的交汇融合
前情概要 现行的新高考对数列的考查难度增加,那么整理与数列交汇融合的相关题目就显得非常必要了。 典例剖析 依托函数,利用导数,求数列的最值;№ 1 、 \color{blue}{№ 1、} №1、 等差数列 { a n } \{a_{n}\} {an} 的前 n n n 项和为 S n S_{n} Sn, 已知 S 10…...

怎么让自己ip显示外省?一文说清操作
在互联网时代,IP地址不仅关联网络连接,还可能影响IP属地显示。那么,手机和电脑用户怎么让自己IP显示外省?一文说清操作要点。 二、4种主流方法详解 要让自己的IP显示为外省地址,主要有以下几种方法: …...

【Docker】容器安全之非root用户运行
【Docker】容器安全之非root用户运行 1. 场景2. 原 Dockerfile 内容3. 整改结果4. 非 root 用户带来的潜在问题4.1 文件夹读写权限异常4.2 验证文件夹权限 1. 场景 最近有个项目要交付,第三方测试对项目源码扫描后发现一个问题,服务的 Dockerfile 都未指…...

汽车车载软件平台化项目规模颗粒度选择的一些探讨
汽车进入 SDV 时代后,车载软件研发呈现出开源生态构建、电子架构升级、基础软件标准化、本土供应链崛起、AI 原生架构普及、云边协同开发等趋势,这些趋势促使车载软件研发面临新挑战,如何构建适应这些变化的平台化架构成为车企与 Tier 1 的战…...

【八股消消乐】构建微服务架构体系—服务注册与发现
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点ÿ…...
大数据+智能零售:数字化变革下的“智慧新零售”密码
大数据+智能零售:数字化变革下的“智慧新零售”密码 大家好,今天咱们聊聊一个火到不行的话题:大数据在智能零售中的应用。这个领域,不仅是技术的“硬核战场”,更是商业创新的风口浪尖。谁能玩转数据,谁就能掌控消费者心智,实现销售爆发。 咱们不搞枯燥学术,而是用最“…...
C++_核心编程_菱形继承
4.6.8 菱形继承 菱形继承概念: 两个派生类继承同一个基类 又有某个类同时继承者两个派生类 这种继承被称为菱形继承,或者钻石继承 菱形继承问题: 1. 羊继承了动物的数据, 驼同样继承了动物的数据࿰…...

掌握Git核心:版本控制、分支管理与远程操作
前言 无论热爱技术的阅读者你是希望掌握Git的企业级应用,能够深刻理解Git操作过程及操作原理,理解工作区暂存区、版本库的含义;还是想要掌握Git的版本、分支管理,自由的进行版本回退、撤销、修改等Git操作方式与背后原理和通过分…...

c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框
常识(基础) 众所周知,mmsys.cpl使管理音频设备的控制面板小工具, 其能产生一个对话框(属性表)让我们查看和修改各设备的详细属性: 在音量合成器中单击音频输出设备的小图标也能实现这个效果&a…...

STM标准库-TIM旋转编码器
文章目录 一、编码器接口1.1简介1.2正交编码器1.3编码器接口基本结构**1. 模块与 STM32 配置的映射关系****2. 设计实现步骤(核心流程)****① 硬件规划****② 时钟使能****③ GPIO 配置(对应架构图 “GPIO” 模块)****④ 时基单元…...
深入解析JVM工作原理:从字节码到机器指令的全过程
一、JVM概述 Java虚拟机(JVM)是Java平台的核心组件,它实现了Java"一次编写,到处运行"的理念。JVM是一个抽象的计算机器,它有自己的指令集和运行时内存管理机制。 JVM的主要职责: 加载:读取.class文件并验…...
MCP通信方式之Streamable HTTP
目录 一、前言二、三种传输方式对比1、Stdio和 HTTP SSE工作原理2、Streamable HTTP3、Streamable HTTP解决什么问题三、Streamable HTTP MCP设计原理四、Streamable HTTP MCP demo演示1、MCP server示例2、MCP Client示例一、前言 2025年5月9日,MCP(Model Context Protocol)…...
第七十三篇 从电影院售票到停车场计数:生活场景解析Java原子类精髓
目录 一、原子类基础:电影院售票系统1.1 传统售票的并发问题1.2 原子类解决方案 二、原子类家族:超市收银系统2.1 基础类型原子类2.2 数组类型原子类 三、CAS机制深度解析:停车场管理系统3.1 CAS工作原理3.2 车位计数器实现 四、高性能实践&a…...

【原创】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
AI视频处理系统功能总览 🎯 系统概述 这是一个智能短视频自动化处理系统,专门用于视频搬运和二次创作。系统支持多赛道配置,可以根据不同的内容类型(如"外国人少系列"等)应用不同的处理策略。 Ἵ…...