- 博客(107)
- 收藏
- 关注
原创 SQL Lite 备忘录2
SQLite支持事务,具备ACID特性,可通过BEGIN/COMMIT/ROLLBACK管理。提供DEFERRED、IMMEDIATE、EXCLUSIVE三种事务模式。虽并发读取良好,但同一时间仅一个写入者,性能受限。启用WAL模式可提升并发读写能力。支持分页查询(LIMIT/OFFSET),但大偏移量效率低。支持ALTER TABLE操作(重命名、增删改列)。可创建普通、唯一、联合及部分索引。外键需开启PRAGMA foreign_keys=ON,支持CASCADE等约束;触发器可在DML操作时自动执行,
2026-09-16 15:31:07
212
原创 SQL Lite 备忘录1
SQLite是嵌入式、轻量级的文件型关系数据库,无需独立服务器,数据存储于单一文件中,由应用程序直接访问。其核心优势在于无需启动服务、支持标准SQL与ACID事务,适用于移动端、桌面及嵌入式场景。与MySQL等客户端/服务器架构数据库相比,SQLite为单机本地使用设计,不支持复杂权限体系,并发写入能力有限。它采用动态类型系统,列类型仅为建议,实际以存储类型(NULL、INTEGER、REAL、TEXT、BLOB)为准。自增主键使用AUTOINCREMENT避免重用已删除的ROWID。通过PRAGMA ta
2026-09-16 15:14:18
168
原创 C++ 智能指针、共享指针及独占指针
C++智能指针通过RAII机制实现动态资源自动管理,避免内存泄漏与异常安全问题。std::unique_ptr独占所有权,不可拷贝,仅可移动;std::shared_ptr共享对象,引用计数控制生命周期,但可能引发循环引用;std::weak_ptr作为观察者,不增加引用计数,可通过lock()安全访问对象,解决循环引用问题。三者协同保障资源安全释放。
2026-09-15 14:35:34
102
原创 uboot编译 fw_setenv
<think>我们根据用户给出的内容,生成一个≤150字的文章摘要。内容是关于如何在没有fw_setenv的系统中通过配置fw_env.config来使用U-Boot环境变量工具。摘要需要概括主要步骤和关键发现。保持简洁,不超过150字。</think>本文介绍在无fw_setenv的ARM Linux系统中修改U-Boot环境变量的方法。通过检查系统确认无该工具,随后分析U-Boot配置(ENV_IS_IN_MMC、设备1、偏移0xC0000、大小0x2000),确定环境存储于/d
2026-09-05 15:44:48
221
原创 Nginx与Ajax 备忘录
<think>我们只需要根据给出的内容生成一个不超过150字的摘要。内容是关于Nginx使用与排错交接文档,包括Nginx是什么、位置、路由、安装、服务管理、配置检查等。摘要要简洁,涵盖主要点。限制150字,需要高度概括。</think>Nginx是高能Web服务器与反向代理,用于静态文件服务、URL路由、负载均衡及HTTPS处理。文档涵盖Ubuntu安装、服务管理(systemctl)、配置检查(nginx -t)、端口与进程排查,以及curl测试。核心是理解location路由和
2026-08-31 13:57:17
232
原创 C++ const 函数及explicit关键字
constconst,这个概念是。在 C 语言里,const是用来修饰表示x不能被修改。意思是:函数承诺不会通过str修改字符串内容。表示这个成员函数(除非成员变量被mutable修饰)。因为f()被声明为 const,不能改变对象状态。explicit,不能单独使用。在 C++ 里,。
2026-08-27 10:57:38
209
原创 OpenSSL 的异步 TLS 1.3 加密
TLS 1.3 负责安全性与速度:砍掉了老旧加密套件,握手由 2 次往返缩减到 1 次,生成一次性会话密钥。OpenSSL 异步框架负责高吞吐:利用类似协程的挂起/恢复机制,在进行大吞吐量对称加密(AES/ChaCha20)或非对称密码计算时释放 CPU,使单台服务器能够同时抗住数十万并发连接。
2026-08-25 11:32:24
324
原创 C++中的左右值引用(对比C语言)
是指。它通常具有较长的生命周期,可以使用取地址符获取它的地址,也可以被赋值。这里的a是左值,因为它在内存中有固定的位置,&a是合法的,可以通过地址访问它。数组元素也是左值,例如:代表数组中的一个实际存储位置,因此也可以被赋值。
2026-08-24 14:48:34
171
原创 内核驱动添加与裁剪
obj-y += fire_led/ # 总是编译该目录(不推荐,最好用配置控制)obj-$(CONFIG_FIRE_ABC) += fire_led/ # 由配置决定是否编译该目录。这是具体的LED驱动,依赖上面的FIRE_ABC。→ 可以选 y / m / n(编入内核、模块、不编)→ 编译进内核镜像(固定在内核里,开机就有)→ 只能选 y 或 n(编入内核或不编),驱动会编译进内核镜像(zImage)。这个变量的值(y/m/n)由。
2026-08-18 13:36:50
216
原创 嵌入式 Linux 系统移植与 SD 卡量产镜像制作
本文详细介绍了将嵌入式Linux系统(Uboot+内核+设备树+根文件系统)打包成SD卡镜像的完整流程。主要内容包括:1. 系统启动流程解析:从上电到内核加载的全过程;2. 五步实现方案:存储分区规划(FAT+EXT4)、Uboot自动启动配置、源码修改编译、镜像打包(使用dd工具)和烧录验证;3. 关键实现细节:Uboot环境变量设置、分区布局设计(50MB FAT+150MB EXT4)、自动化脚本添加等。最终生成的.img文件可直接用于工厂批量烧录,实现设备上电即用功能。
2026-08-17 14:15:08
267
1
原创 编译-链接过程备忘录
本文对比了静态库、动态库和可执行文件的生成过程及差异:静态库由归档器(ar)打包.o文件生成,不进行链接;动态库和可执行文件由链接器(ld)生成,前者保留外部符号未定义,后者进行完整链接。动态库包含两张符号表——必需的动态符号表(.dynsym)和可选的调试符号表(.symtab)。Linux中strip命令通常只删除调试符号表而不影响动态库功能,但若误删动态符号表会导致外部程序无法调用。
2026-08-15 16:52:11
345
原创 ARCH与交叉编译器的关系
摘要:编译器本质是代码翻译工具,构建系统(如Makefile)通过ARCH环境变量控制平台相关代码的选择(如arch/arm/或arch/x86/),CROSS_COMPILE决定编译工具链。内核代码分为体系无关部分(kernel/等目录,实现通用算法)和体系相关部分(arch/目录,直接操作硬件寄存器)。前者关注逻辑抽象,后者与特定CPU架构严格绑定,负责底层硬件交互。这种架构实现了跨平台支持与硬件细节的隔离。
2026-08-15 16:38:07
202
原创 制作一个可启动的、压缩格式的初始 RAM 磁盘(initrd / initramfs)镜像文件。
文章摘要: ebf_rd.img.gz由Linux内核(非U-Boot)在启动早期解压。U-Boot仅负责将压缩文件加载到内存(0x88000000),内核通过initrd参数发现并解压其中的ext2镜像(检测gzip魔数1F8B),最终挂载为根文件系统。 制作过程关键点: 固定8MB ext2镜像:通过dd创建空文件并格式化为无日志的ext2,适配嵌入式设备存储限制。 回环挂载:mount -o loop将镜像文件虚拟为块设备,cp -a保留权限/符号链接等关键属性。 压缩与清理:gzip --best压
2026-08-15 15:21:28
335
原创 文件系统制作-实操备忘录(NFS,Busybox)
本文详细介绍了嵌入式Linux系统开发中根文件系统的构建与部署方法。主要内容包括:1. 根文件系统的概念与必备内容:包含可执行程序、动态库、启动配置文件等;2. 两种常见部署方式:重点讲解NFS网络根文件系统的配置步骤及验证方法;3. 使用BusyBox构建最小根文件系统的完整流程:从编译配置到创建目录结构、编写关键配置文件;4. 验证调试顺序与常见问题解决方案。文章特别强调了NFS挂载的原理和注意事项,以及动态库路径设置的重要性,为嵌入式开发提供了一套完整的根文件系统构建方案。
2026-08-14 19:00:11
447
原创 文件系统制作-基础理论篇
文件系统是管理存储设备数据的核心机制,主要功能包括:建立文件名与磁盘地址的映射、构建树形目录结构、管理存储空间分配回收、记录元数据和权限控制。其中根文件系统是内核启动后挂载的第一个文件系统(/),对系统启动至关重要。若内核无法挂载根文件系统,将导致Kernel Panic,主要原因包括:无法启动用户态首个进程(PID=1的init)、缺失控制台设备节点(/dev/console)、以及缺乏用户态工具支持系统功能。这体现了Linux内核仅提供基础机制,而依赖用户态工具实现完整功能的架构特点。
2026-08-14 14:14:56
34
原创 Cortex-A 内核编译(zImage,uImage)
本文总结了Linux内核开发的关键知识点,主要包括:1)获取内核源码的两种方式(厂商提供和主线下载);2)源码目录结构(区分体系结构相关/无关部分);3)内核配置系统(Kconfig/Makefile)的工作原理;4)开发环境搭建(交叉编译器配置);5)详细的内核编译流程及镜像文件说明;6)内核启动条件和常见问题;7)以i.MX6ULL为例的移植步骤。文章还提供了关键工具和文件路径参考,适合嵌入式开发者快速掌握内核定制与移植的核心方法。
2026-08-13 14:21:36
179
原创 Bootloader(tftp)
嵌入式 Linux 跟 PC 不同,PC 有 BIOS/EFI 固件,但嵌入式。芯片内部的固化 ROM(只读存储器)中只有一段极小的代码(几十 KB),它的唯一作用就是把外部的 Bootloader(Uboot)加载到内存里运行。然后 Uboot 再去引导内核->->->根文件系统。
2026-08-12 14:22:38
505
原创 Cortex A移植概念备忘录
本文介绍了Linux系统移植中的交叉编译工具链配置与ELF文件处理技术。主要内容包括:1. 交叉编译工具链的组成及环境变量配置方法;2. 关键工具命令详解:file查看文件类型、readelf分析ELF头部信息、size查看段大小、nm查看符号表、strip去除调试信息;3. ELF文件结构解析,重点说明入口地址和段信息的作用;4. 符号表的作用机制及strip操作对静态/动态符号表的不同影响;5. 二进制镜像文件和ELF可执行文件的生成流程差异。文章通过底层原理讲解和实际应用场景分析,为嵌入式开发中的程序
2026-08-12 13:58:30
612
原创 OpenCV Mat 备忘录
OpenCV中的Mat是存储图像和矩阵数据的核心数据结构,本质上是包含图像尺寸、数据类型、内存地址和像素数据的矩阵。Mat支持多种类型,如CV_8UC1(8位灰度图)、CV_8UC3(彩色图)等。访问像素时,灰度图使用uchar,彩色图使用cv::Vec3b获取BGR值。Mat默认采用浅拷贝机制,多个对象可共享同一数据,深拷贝需使用clone()方法。理解这些特性对高效处理图像至关重要。
2026-08-11 16:28:19
610
原创 Windows C++ 第三方库使用流程备忘录--OpenCV
这篇短文解释了使用OpenCV开发C++程序时的编译运行过程。程序开发涉及三个阶段:编译(检查语法)、链接(组合代码)和运行(执行程序)。OpenCV开发需要三种关键文件:头文件(.h/.hpp)提供类/函数声明,静态库文件(.lib)提供链接信息,动态链接库(.dll)包含实际运行代码。运行时系统会按特定路径(exe目录、系统目录、PATH环境变量)查找所需的dll文件,若找不到就会出现0xC0000135错误。文章以OpenCV的cv::Mat和cv::imshow为例,说明了头文件如何让编译器识别类,
2026-08-11 14:41:37
592
原创 size_t,ssize_t........
C/C++中常用整数类型的选择指南 摘要: 本文系统分析了C/C++中几种关键整数类型的适用场景:size_t(无符号,推荐用于容量/数量)、ssize_t(有符号,用于系统调用返回值)、ptrdiff_t(指针差值)、intptr_t/uintptr_t(指针地址存储)以及精确宽度类型(如int32_t)。重点阐述了这些类型相较于普通int/long的优势:跨平台兼容性(自动适配32/64位系统)、精确的位宽保证以及特殊场景需求(如错误码返回、指针运算等)。文章通过具体案例(如线程参数传递)演示了如何正确
2026-08-07 19:20:13
268
原创 字符串函数#include <string.h>
本文演示了C语言中常用字符串和内存处理函数的使用方法,包括:strlen计算字符串长度;strcpy/strncpy字符串复制;strcat/strncat字符串连接;strcmp/strncmp字符串比较;strchr/strrchr查找字符;strstr查找子串;strtok字符串分割;atoi/atof/strtol数值转换;memcpy内存复制;memset内存填充;memcmp内存比较等。每个函数调用都配有注释说明和输出结果,展示了参数传递方式和返回值特点。这些函数来自<string.h&g
2026-08-07 18:33:04
224
原创 HTTP备忘录
HTTP请求头是纯文本结构,包含请求行(方法、路径、版本)和头部字段(Key:Value格式),以连续的\r\n\r\n作为结束标志。代码中通过memcmp检测终止标志,若缓冲区满(如1024字节)仍未出现结束符则返回-1。模拟方法包括发送超长单行或无结束标志的合法请求。Cookie用于解决HTTP无状态问题,浏览器自动存储和发送服务器下发的键值对。关键特性包括会话级(关闭浏览器失效)和持久级(设置过期时间)Cookie,以及安全限制(HttpOnly、Secure、SameSite)以防止XSS和CSRF
2026-08-07 16:33:44
450
原创 flag bitmask 设计
本文介绍了位掩码(Bitmask)的基本概念和使用方法。通过8位二进制数示例,展示了如何用不同bit位表示不同状态(如可读、可写等)。重点说明了如何用位运算(OR操作)组合多个状态,例如"可读+可写"可通过00000001 | 00000010 = 00000011实现,其中两个bit位同时为1即表示同时具有这两种状态。这种技术常用于系统编程中高效地表示和组合多种状态标志。
2026-08-07 16:06:37
31
原创 Epoll,Poll,Select备忘录
本文介绍了Linux下三种I/O多路复用机制:select、poll和epoll。select使用位图监控文件描述符,内存占用极低但受限于1024个连接;poll改用动态数组解决了数量限制问题,但仍需每次传递所有描述符;epoll则采用事件驱动模型,通过红黑树和就绪链表实现高效管理,支持水平触发和边缘触发两种模式,最适合高并发场景。三者在数据结构、监控方式和性能上存在显著差异,epoll因其高效性成为现代高性能网络编程的首选。
2026-08-07 11:49:01
178
原创 线程池备忘录
线程池是Linux C服务器常见的并发模型,它通过预先创建固定数量线程并复用它们来解决传统"一任务一线程"的弊端。主要问题包括:线程创建销毁消耗资源、线程数量失控导致内存和CPU过载、以及过多线程引发频繁上下文切换。线程池核心包含线程数组、任务队列及同步机制(互斥锁和条件变量)。worker线程通过循环检查任务队列,无任务时休眠等待,有任务时取出执行,实现高效任务处理。这种设计显著提升了资源利用率和系统稳定性。
2026-08-06 19:00:04
202
原创 Reactor 事件驱动模型
本文摘要:Reactor事件驱动模型是高性能网络服务器的核心架构,由五大组件构成:Handle(事件源)、同步事件多路复用器(如epoll)、事件分发器(Reactor核心)、事件处理器接口及具体业务处理器。其工作流程分为注册、事件监听和分发处理三步。回调机制的本质是将业务函数注册到框架中,由框架在事件触发时反向调用,实现控制反转。文中通过C代码示例演示了Reactor如何通过查表机制将事件分发给注册的回调函数,体现了"被动调用"的特性。该模型通过异步非阻塞IO和线程池结合,支撑了Ngi
2026-08-06 18:27:14
278
原创 C语言字符数组与字符串数组
本文介绍了C语言中字符串数组的两种实现方式:二维字符数组和字符指针数组。二维字符数组(如char str[3][10])连续存储多个字符串,每个字符串占用固定长度空间,可以修改内容。字符指针数组(如char* str[])存储字符串地址而非内容,各字符串内存不连续,通常指向常量字符串不可修改。两者本质不同:前者是数组的数组,后者是指针的数组。字符串数组既可用二维字符数组实现,也可用指针数组实现,但二者不等价,需根据需求选择合适方式,尤其要注意内存布局和修改权限的差异。
2026-08-05 15:46:18
205
原创 栈区,堆区,静态区,内存泄漏,野指针
本文介绍了程序运行时内存的四个主要区域:栈区(存储局部变量、函数参数等,自动管理但空间有限)、堆区(动态申请内存需手动释放)、全局/静态区(存储全局和静态变量)和代码区。重点分析了内存泄漏的四种常见情况:忘记释放堆内存、指针覆盖导致原地址丢失、指针置NULL以及链表操作不当。同时解释了野指针的概念,即指针指向已释放内存的情况,强调访问此类内存是非法的。文章通过具体示例说明了各内存区域的特点及正确管理方法。
2026-08-05 15:29:11
336
原创 顺序队列假溢出及链式队列
顺序队列的假溢出问题是指队列存储空间仍有空位,但由于队头指针移动导致队尾指针到达数组末尾而无法入队。例如,数组Q[5]在出队两个元素后,前端空出位置但rear已到末尾,无法继续入队。解决方法包括:1)循环队列(推荐),通过首尾相连利用空位;2)移动元素(效率低)。链式队列通过单链表实现,无假溢出问题,仅受内存限制。总结:普通顺序队列存在假溢出,循环队列和链式队列可避免该问题。
2026-08-05 14:55:34
490
原创 树与二叉树
本文介绍了二叉树及其常见类型的关系与区别:1. 二叉树是每个节点最多有两个子节点(分左右)的特殊树结构。2. 主要分类包括:满二叉树(结构完全填满)、完全二叉树(节点连续排列)、平衡二叉树(左右子树高度差≤1)和搜索二叉树(BST,满足左<根<右的有序结构)。3. 不同类型关注点不同:BST侧重查找效率,平衡树控制高度,完全树强调节点排列紧凑性。4. 这些类型存在包含关系(如满二叉树必定是完全二叉树和平衡二叉树),但也可独立存在(如BST可能不平衡)。通过典型示例展示了各类二叉树的特征和相互关系
2026-08-04 16:11:03
226
原创 CMAKE备忘录
本文摘要: CMake是一种用于生成Makefile的构建工具,适用于大型项目管理。文章重点介绍了CMake的两个核心命令:set()用于变量定义(如路径、文件列表),file()用于文件和目录操作,包括查找源码(GLOB/GLOB_RECURSE)、读写文件、复制/删除文件、创建目录及获取绝对路径等。常用场景包括自动添加源码和复制配置文件。CMake与gcc、make、Makefile的关系是:CMake生成Makefile,make依据规则调用gcc编译代码。关键命令如project()、add_exe
2026-07-31 16:21:36
242
原创 GPIOx_BSRR ,GPIOx_BRR和ODR
摘要 GPIOx_BSRR和GPIOx_BRR是STM32中控制GPIO输出的两种寄存器。BSRR为32位寄存器,低16位置1使引脚输出高电平,高16位置1使引脚输出低电平;BRR为16位寄存器,仅用于输出低电平。相比传统ODR的"读-改-写"操作,这两种寄存器支持原子操作,避免了中断影响,速度更快更安全。BSRR可同时实现置位和复位功能,而BRR仅用于复位。使用时,BSRR低16位写1拉高引脚,高16位或BRR写1拉低引脚。
2026-07-28 19:16:45
215
原创 裸机开发点灯裸机整理
本文介绍了如何使用STM32F103控制PB5引脚上的LED实现1秒闪烁。主要内容包括:1)通过数据手册确定PB5属于GPIOB外设;2)配置GPIOB时钟和CRL寄存器,设置PB5为推挽输出模式;3)使用BSRR寄存器控制引脚电平。关键步骤涉及APB2时钟使能、GPIO模式配置(MODER/OTYPER)以及通过BSRR/BRR寄存器实现电平控制。该方案适用于STM32 GPIO基本输出控制场景。
2026-07-28 19:11:51
274
原创 STM32 上拉和下拉
文章摘要:上拉和下拉电阻在嵌入式系统中用于稳定信号电平,防止引脚浮空。上拉电阻连接VCC使默认电平为高(逻辑1),下拉电阻连接GND使默认电平为低(逻辑0)。它们的作用包括稳定信号、提高驱动能力、配合开漏输出及增强抗干扰性。实现方式分为内部集成(弱上拉/下拉)和外部焊接电阻。输入模式包括浮空、上拉、下拉和模拟输入,用于检测外部信号;输出模式分推挽和开漏,用于驱动外部设备。施密特触发器用于抗干扰和防抖动,确保信号稳定转换。
2026-07-28 16:20:24
505
原创 STM32时钟树(Clock Tree)
STM32时钟系统核心概念解析 摘要:STM32时钟树是单片机运行的基础,为CPU和外设提供精确时钟信号。主要包含三种时钟源:HSI内部时钟(8-16MHz)、HSE外部晶振(精度高)、LSE/LSI低速时钟(32kHz/40kHz)。PLL锁相环是关键倍频器,如将8MHz晶振倍频至72MHz系统时钟。时钟树通过RCC控制器分配时钟:SYSCLK系统时钟决定CPU主频;HCLK直接驱动CPU核心;PCLK分APB1(≤36MHz)和APB2(≤72MHz)两组驱动不同外设。理解时钟源、倍频原理和分配结构是S
2026-07-28 15:58:16
242
原创 ARM Cortex-A(ARMv7-A)寄存器组织
ARM处理器在不同模式下通过备份寄存器保护现场:r0-r12作为通用寄存器需软件保存;异常模式拥有独立的r13(SP)和r14(LR)副本,确保栈指针和返回地址隔离;CPSR记录当前状态,异常时自动备份到SPSR以便恢复。FIQ模式额外备份r8-r12加速中断处理。这种硬件级备份机制使CPU能快速响应中断而不破坏用户程序寄存器状态,仅需保存部分寄存器即可完成上下文切换。(149字)
2026-07-27 19:03:01
473
原创 硬件知识备忘录
计算机存储系统采用分层结构,遵循"离CPU越近速度越快、成本越高、容量越小"的规律。从CPU内部寄存器(最快但仅几十个)、SRAM构成的高速缓存(Cache),到DRAM主内存,再到外存的SDRAM/DDR(通过时钟同步和双倍速率提升性能),最后是闪存等非易失存储。其中寄存器直接参与运算,Cache缓解CPU与内存速度差,DRAM作为主存,而DDR通过上升/下降沿双倍传输提升SDRAM效率。ROM家族(如Flash)则用于持久化存储启动程序和数据。这种层次化设计在速度、容量和成本间实现平
2026-07-24 17:05:17
185
原创 让Ubuntu 的第二块网卡 ens37 永久固定为 192.168.30.111
摘要:本文提供了快速配置Ubuntu系统ens37网卡IP地址的方法,无需修改netplan或yaml文件。通过nmcli命令分四步操作:1)设置静态IP为192.168.30.111/24;2)重启连接使配置生效;3)用ip命令验证配置;4)确保配置开机自动加载。重点强调只修改第二网卡(ens37)对应的"Wired connection2",保留ens33网卡原有配置。最后要求用户反馈ip addr show ens37的执行结果以确认配置成功。
2026-07-21 09:37:58
226
原创 SQLite C API 备忘录
本文介绍了SQLite数据库的基本操作函数:1. sqlite3_open()用于打开/创建数据库文件,自动创建不存在的数据库;2. sqlite3_close()关闭数据库连接;3. sqlite3_exec()是最重要的函数,用于执行SQL语句(如创建表),可通过回调函数处理查询结果。文章还列举了SQLite常用函数的使用频率,包括数据库操作、预处理语句、参数绑定和结果处理等核心功能。重点强调了数据库使用完毕后必须关闭连接,以及不同SQL语句对回调函数的处理方式差异。
2026-07-16 11:03:49
282
算法分析时间复杂度与空间复杂度备忘录
2026-05-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅