自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(103)
  • 收藏
  • 关注

原创 pimpl

Pimpl 是“Pointer to IMPLementation”的缩写,意为“指向实现的指针”。它是 C++ 中一种将类的实现细节从对象表示中移除、放到一个分离的类中、并通过不透明指针进行访问的编程技巧。其核心思想是:将类的具体实现封装到一个独立的结构体或类中,原类只保留一个指向该实现的指针。4)类的实现频繁变动的场景:如果一个类的私有成员、实现逻辑经常修改,使用 Pimpl 可以避免频繁重新编译依赖它的代码。3)需要隐藏实现细节的场景:比如开发商业软件、核心算法模块,避免实现逻辑泄露。

2026-10-19 00:40:42 91

原创 c语言版多态

原理和内核一模一样。C++ 的虚表是编译器自动生成;生成虚表,对象头部自动放虚表指针。真实内核代码更复杂,下面是。

2026-10-18 19:36:02 205

原创 ELF文件到Linux进程 图解

2026-10-18 00:02:38 13

原创 各种文件系统调用图解

2026-10-17 23:53:13 204

原创 各种文件系统

2026-10-17 23:40:37 163

原创 进程间通信(IPC)

IPC 的本质是:用户态进程不能直接访问彼此地址空间,所以内核提供一块“公共媒介”——内核缓冲区、共享物理页、消息队列、信号、套接字等——让进程能够安全地交换信息。

2026-10-17 23:11:35 50

原创 gdb、asan、Valgrind

每次函数调用时,系统会在栈上分配一块内存区域,用于保存该函数的局部变量、参数、返回地址等信息,这块区域就叫“栈帧”。#0:当前正在执行的函数(崩溃点)#1:调用#0的函数#2:调用#1的函数,依此类推。

2026-10-17 22:28:47 159

原创 cursor/vs code的markdown插件 和 代码阅读

如果插件在插件商店搜不到,就让ai帮忙下载visx安装。

2026-10-11 02:04:16 134

原创 内核中的侵入式链表,slub对象池,CAS

slub 把一页切分成 N 个一模一样大小的对象,做成对象池子,避免频繁向伙伴系统申请页面,减少内存碎片,提升多核并发性能。// RCU版本删除,只是把节点摘出链表,不释放内存。RCU 等待:所有正在读这条链表的 CPU 全部退出 RCU 读临界区之后,才调用回调释放旧节点。原子:整个操作不可被 CPU 中断,要么全部做完,要么完全不做,不会卡在中间状态。Hazard Pointer / RCU:不让内存被释放回收,从根源避免地址复用。,全局 partial 链表,拿别人剩下的 partial slab;

2026-08-06 10:02:38 244

原创 低延迟系统

应用程序 → 系统调用 (socket recv) → Linux 内核协议栈 → 网卡硬件。先划池 → 再互斥占坑 → 最后把热线程钉死在坑上,减少迁移和互相抢核带来的抖动。试核0 → lockf 成功 → affinity(0) → 停。试核1 → lockf 成功 → affinity(1) → 停。0、1 都被锁 → 试核2 → 成功 → affinity(2)有多次内存拷贝、中断、内核调度,带来延迟与抖动,P99 毛刺高。开销来源:中断、内核‑用户态内存拷贝、协议栈处理、内核调度。

2026-08-05 17:02:17 188

原创 了解vnpy

→ 解析 IssueCode/MarketCode/CorpCode/ExecutionNo/Price/Quantity/BuySell…"BuySell": self._map_vnpy_direction(...), # LONG→买 / SHORT→卖。同时:orderid_strategy_map["QG.CorpCode"] = strategy # CTA 记下归属。→ 有号:vt_orderid = "QG.{CorpCode}",on_order(提交中)

2026-08-05 09:45:07 176

原创 本人常用命令总结

打开 core 程序段错误: ① 内核同步写入一条 segfault 日志到 dmesg(照旧);② 内核额外生成 core 文件到当前目录;不开 core(默认 ulimit -c=0) 程序段错误 → 内核写一条记录到 dmesg 只能。Cursor 官方已经调整了先导按键:Windows 端新版把 VSCode 原先。拿到崩溃地址,配合 addr2line 只能定位大概行,看不到变量、完整栈。先开启 Windows 自带 Telnet 客户端。按字母排序输出,方便查找。找不到 xxx.so。

2026-07-10 11:31:45 622

原创 学习笔记123

适合:后台管理、接口服务、Web业务、微服务集群特点:多线程、接口驱动、Tomcat容器、生态成熟外网Web业务、管理系统全部用:Nginx + SpringBoot多线程架构内网量化、车机、长连接、消息服务用:自研插件式事件循环 + Kafka + Etcd主备架构。

2026-06-29 16:54:15 275

原创 科目一 1111

一个周期内,累计两次扣满12分的应该参加什么考试?应该参加几天的学习?驾驶人饮酒驾车受过处罚的,在最近几个记分周期内不得参加记分减免?禁考或延期,兵役__ 年 欺骗获得驾驶证 __ , 吸毒__ , 被撤销驾驶证的。校车超员10%扣几分?饮酒驾驶营运车辆的驾驶证被吊销几年?罚款200的口诀,罚款20-200的口诀,罚款200-500的口诀?在网上3日内累计参加30min的学习可以减几分?普通路倒车和逆行扣几分?高速逆行和倒车扣几分?1分,3分,6分,9分,12分的口诀是什么?灯光,车牌的扣分是哪几个档次?

2026-06-13 21:41:04 215

原创 科目一2026

车道方向会随时间变的 “可变车道”,就像海水潮汐:早高峰、晚高峰车流方向不一样,它就跟着换方向,给车多的一边临时加一条车道,治拥堵。早高峰 7–9 点:大家上班进城,潮汐车道 → 改成进城方向,进城多 1 条车道晚高峰 17–19 点:大家下班出城,潮汐车道 → 改成出城方向,出城多 1 条车道。

2026-05-10 21:51:01 510

原创 Linux 设备模型和platform平台

你不用自己创建。

2026-05-01 14:30:29 511

原创 Liunx驱动 IO 模型

那时要先换动态设备号改驱动,或使用未被占用的主设备号——这里暂且假设能成功加载。,哪个有数据就处理哪个,不用每个 fd 开一个线程阻塞等。→ 进程休眠、让出 CPU→ 硬件 / 驱动有数据了。,是 Linux 性能最强的同步 IO 多路复用模型。判断是否非阻塞,没数据直接返回 -EAGAIN。,直接去干别的事内核自己后台把数据准备好,完事。(可能没有换行,取决于内核里缓冲区内容)。这是进阶项,书里一般会配示例程序。,告诉应用:现在没数据,你待会再来。,再跑一次非阻塞读,应能读到数据。

2026-05-01 13:03:14 471

原创 Linux 内核驱动 —— 锁机制

拿不到就原地转圈等,不许睡觉,适合短操作、中断里能用。拿不到锁就去睡觉,不占 CPU,适合耗时操作,只能进程上下文用。

2026-05-01 12:08:21 421

原创 内存分配,GPIO驱动,中断处理

硬件触发中断时,CPU 暂停用户进程、暂停内核普通线程,强行跑你的中断函数。此时环境叫做中断上下文。

2026-04-24 10:12:21 403

原创 Python 反射

反射 = 用字符串的名字,去操作对象的属性和方法。obj.nameobj.say()反射 = 用字符串操作对象属性 / 方法hasattr:判断有没有getattr:获取值 / 方法setattr:设置值。

2026-04-21 13:52:47 252

原创 cursor+wsl 跳转c++和python代码

如果想要实现c++代码的跳转,必须使用wsl插件,然后进入wsl中,手动安装cpptools-linux-x64.vsix (C++)插件,因为版本原因,高版本的无法实现跳转(csdn中有对应的教程),并且由于在wsl中是linux系统,所以要用的是Linux下适配的插件,如果用cpptools-windows-x64.vsix插件,cursor会提示你版本不适配。首先如果用\\wsl.localhost\xxx 无法实现c++代码的跳转,但是可以实现python代码的跳转。

2026-04-14 09:17:51 160

原创 python协程

async def用async def定义的函数,就是协程函数调用它不会直接执行,只会返回一个协程对象c = hello() # 不会打印任何东西,只得到一个 coroutine 对象。

2026-04-12 20:37:28 211

原创 python装饰器

装饰器就是为了:不改动原来的代码,还能给函数统一加功能,同时代码不乱、不重复。

2026-04-12 20:21:44 244

原创 字符设备驱动

2. 静态创建结构体后有要对结构体进行初始化,使用cdev_init函数进行,cdev_init有两个参数。4. mknod 时会在内核中创建一个inode的结构体,这里只写inode重要的成员信息。5. 应用程序调用 open("/dev/hello")这个函数时。3. 使用cdev_add把设备好加入到cdev组成的链表当中。1. 在驱动程序中,首先要创建一个cdev结构。内核就是靠这一串数字找到驱动。在 Linux 里是一个。

2026-04-06 17:08:54 355

原创 liunx内核模块

内核模块 = 可以动态插进 Linux 内核的一段程序你可以把 Linux 内核想象成一个巨大、复杂、一直在运行的操作系统核心。(1)最基础:module_parammodule_param(参数名, 类型, 权限);(2)字符串参数module_param_string(参数名, 存到哪, 长度, 权限);(3)数组参数module_param_array(参数名, 类型, 接收长度变量, 权限);支持哪些类型?权限是什么?就是0664:可读可写0444:只读:内核标准写法。

2026-04-06 12:31:18 390

原创 canopen

当CAN_H=3.5V和CAN_L=1.5V,此时CAN_H和CAN_L的压差为2V,此时状态表⽰为逻辑0,称为显性位,竞争时显性位优先。为了避免数据⼤量时⽆索引可分配,在某些索引下定义了⼀个8 位的索引值,这个索引值通常被称为⼦索引,其范围是0x00到0xFF之间。当CAN_H和CAN_L均是2.5V左右,此时CAN_H和CAN_L的压差为0V,此时状态表⽰为逻辑1,称为隐性位。PDO通信⽅式,⽤来传输实时数据,PDO 属于过程数据,即单向传输,⽆需接收节点回应报⽂来确认,属于⽣产消费模型。

2026-03-19 18:38:09 211

原创 qt八股文

信号与槽都需要在类中声明,信号用signals关键字,槽函数在QT5中可以用public slot,也可以用普通函数或lambda表达式。连接信号与槽要使用QObject的connect函数,格式一般是connect发送者,signal信号,接收者,slot槽函数。当发送者发射信号时,连接的槽函数就会自动执行。而且一个信号可以连接多个槽,多个信号也可以连接同一个槽,还能进行信号与信号的连接参数不要求完全一致,只要求信号的参数个数大于等于槽的参数,并且对应位置的参数类型必须兼容。

2026-03-09 19:36:41 479

原创 QML基础

QML 的核心是:你不用写 “如何做” 的逻辑(比如一步步绘制按钮),而是直接描述 “界面长什么样、有什么行为”。类似于json,相当于是替代了qtwidget的ui文件。

2026-03-05 22:04:26 508

原创 IIC学习

这种具体的表现和逻辑运算符当中的与"&"运算符完全一致,所以我们把这种总线机制称之为"逻辑线与"。I2C通信当中的逻辑线与是通过设置引脚为开漏输出模式,配合上拉电阻来共同实现的,这是一种硬件实现的逻辑线与。逻辑线与有啥用呢?逻辑线与决定了I2C总线上,SCL线以及SDA线的高低电平状态。公式如下:某条线上的高低电平状态 = 主机该端口输出(0 / 1) & 从机1该端口输出(0 / 1) &....

2026-01-12 23:20:27 320

原创 STM32F103

系统主频率(SYSCLK)= 72MHz(STM32F103 的常用最大主频);外设时钟按需分频(PCLK1=36MHz、PCLK2=72MHz);同时保留了 RTC 的精准 32.768kHz 时钟。

2026-01-09 22:04:51 1282

原创 STM32F103的启动过程

ARM 汇编语言的基本语法其中,[ ]]内的是可选项。LABEL :标号。是指令、变量或数据的地址或者常量。此项为可选项,如果有区必须顶格书写,后面不能加冒号。OPERATION :指令、宏指令、伪指令或伪操作。此项为必选项,但不能在一行开头顶格书写,而且前后必须有空格。特别注意,在 ARM 汇编程序中,一条指令伪指令、寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用。OPERAND :操作的对象(即操作数)。可以是常量、变量,标号、寄存器或表达式。

2026-01-09 21:11:39 612

原创 FreeModbus

FreeModbus是一款开源、免费、轻量级的工业级 Modbus 协议栈,完全遵循Modbus 标准协议规范实现,是嵌入式领域中最主流、应用最广泛的 Modbus 协议解决方案。✅ 核心优势:无商业授权限制、代码精简(适配资源受限的嵌入式设备)、跨平台性极强、支持 Modbus 全核心功能,可快速移植到单片机 / 嵌入式系统中实现工业通信。✅核心支持的通信模式Modbus RTU:基于串口(UART)

2026-01-04 23:14:21 1348

原创 ModBus协议

具体来说,例如功能码表明主机要求读取从机若⼲个寄存器的数值,从机接收到通讯帧后进⾏⼀系列的处理,返回给主机相同的功能码,表明从机对该功能进⾏了响应。例如,在9600bit/s的传输速率下,⼀个字节传输的时间约为0.8ms,那么当数据传输中,出现约3ms的空闲时间时,设备就认为⼀帧数据接收完成。什么是CRC校验呢,简单来说,⽐如你要发⼀段数据,最后想在后⾯加两个字节,这两个字节是通过前⾯所发的数据通过某种算法计算出来的唯⼀的两个字节。数据帧的结束,之前接收到的字节就是这次数据帧的所有字节。

2026-01-02 21:15:32 1056

原创 常见元器件3

蜂鸣器是⼀种⼀体化结构的电⼦讯响器,采⽤直流电压供电,⼴泛应⽤于计算机、打印机、复印机、报警器、电⼦玩具、汽⻋电⼦设备、电话机、定时器等电⼦产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。按其驱动⽅式的原理分,可分为:有源蜂鸣器(内含驱动线路,也叫⾃激式蜂鸣器)⽆源蜂鸣器(外部驱动,也叫他激式蜂鸣器);有源蜂鸣器和⽆源蜂鸣器区别注意:这⾥的“源”不是指电源,⽽是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要⼀通电就会叫;

2025-12-27 12:07:57 819

原创 电子元器件2

可以产出方波原理图如下:⼯作原理如下:⾸先电源VCC通过R1和R2给C电容充电,⾸先电容的电压肯定⽐较⼩,⼩于 1VCC/3,同样C1正端是2VCC/3,C2负端1VCC/3,TH和TR端是连接在⼀起的,刚开始是⼩于 1VCC/3,此时C1输出1,C2输出0,此时置位端有效,Q为1,Q⾮为0,uo为1,三极管截⽌,输出⾼电平。此时,电源仍然给电容充电,当TH和TR端是连接在⼀起的那点⼩于2VCC/3⼤于1VCC/3,C1输出1,C2输出1,三极管导通,uo为。

2025-12-26 23:45:22 945

原创 numpy和matplotlib

NumPy(Numerical Python)是 Python 科学计算的核心库,它提供了高性能的 多维数组对象(ndarray)和数学函数,能高效处理数值计算、矩阵运算、线性代数等任务,是 Pandas、Matplotlib、Scikit-learn 等库的基础。,它能创建高质量的静态、动态和交互式图表,支持线图、柱状图、散点图、直方图、饼图等多种图表类型,也是 Pandas、Seaborn 等库的可视化基础。,相比 Python 原生列表,它的存储更紧凑、运算速度更快(底层由 C 实现)。

2025-12-25 21:41:43 747

原创 常见的元器件1

集电极(c)电流 与。当基极电流⾼过此范围时,三极管集电极电流会达到饱和值 (导通),基极电流低于此范围时,三极管会进⼊截⽌状态(断路), 这种导通。饱和状态下的三极管基极电流ib变⼤时,集电极电流ic也不会变⼤了,这就相当于⽔⻰头的开关已经开得⽐较⼤了,开关再开⼤时,流出。在放⼤状态下,就相当于是⼀个受控制的⽔⻰头,⽔⻰头流出⽔流的⼤⼩受开关(基极)控制,开关拧⼤⼀点,流出的⽔就会⼤⼀点。三极管是⼀种电流放⼤器件,可制成交流或直流信号放⼤器,由基极输⼊⼀个很⼩的电流从⽽控制集电极输出很⼤的电流,

2025-12-24 23:20:21 833

原创 python的容器

基础容器是 Python 核心:列表(可变有序)、元组(不可变有序)、字典(键值对映射)、集合(无序去重),覆盖绝大多数常规场景。容器选择依据:是否有序、是否可变、是否需要映射关系、是否需要去重,对应选择合适的容器类型。进阶容器(collections 模块):针对特定场景优化,如 defaultdict 解决键不存在问题、deque 提升两端操作效率、Counter 快速统计元素次数。

2025-12-23 19:18:05 633

原创 python的类

class# 定义一个“学生”类# 类属性:所有学生共享的学校名称school = "第一中学"# 构造方法:初始化学生的姓名、年龄、成绩# 实例属性:每个学生独立拥有# 实例方法:打印学生信息print(f"姓名:{self.name},年龄:{self.age},成绩:{self.score},学校:{self.school}")# 实例方法:提升成绩print(f"{self.name}成绩提升{add_score}分,当前成绩:{self.score}")

2025-12-23 19:12:54 1102

原创 python学习

通过sep参数可以修改多个对象之间的分隔符,替代默认的空格,支持字符串、空字符等多种形式# 用逗号作为分隔符,输出:苹果,香蕉,橙子print("苹果", "香蕉", "橙子", sep=",")# 用短横线作为分隔符,输出:2025-12-23# 空分隔符,输出:abc123默认情况下,print 输出后会自动添加换行符\n(即打印后自动换行),通过end参数可以修改结尾符,实现不换行输出或自定义结尾内容。# 不换行输出(结尾用空字符),最终输出:123456# 结尾用分号,输出:Python。

2025-12-23 18:08:32 779

线程池基础实现(C++)

线程池基础实现(C++)

2025-09-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除