- 博客(40)
- 收藏
- 关注
原创 51 单片机核心知识点:GPIO、中断、定时器与蜂鸣器驱动
以 12MHz 晶振为例,不同频率对应不同的定时初值,宏定义便于按键逻辑调用:c运行// 不同频率对应的定时器初值(50%占空比,12MHz晶振)#define HZ_200 63035 // 200HZ,定时0.0025s#define HZ_400 64285 // 400HZ,定时0.00125s#define HZ_600 64700 // 600HZ,定时约0.00083s#define HZ_800 64915 // 800HZ,定时约0.000625s。
2026-03-20 18:50:41
288
原创 51 单片机入门踩坑实录:从编译报错到数码管显示 1234 的完整解决
51 单片机模块化编程中,头文件(.h)与源文件(.c)的关联是基础,函数名、变量类型、参数格式的一致性是编译通过的前提,哪怕一个字母的拼写错误,都会导致编译器无法识别匹配,引发系列报错。本文复盘的delay函数编译报错和数码管无显示问题,都是 51 单片机入门的经典问题,看似简单,却涵盖了模块化编程、数码管动态扫描、51 单片机硬件特性等核心知识点。入门阶段的坑,其实是最好的学习素材,每解决一个问题,都是对知识点的一次巩固。
2026-03-19 17:42:20
339
原创 SQLite 数据库实战
数据库是专门用于高效管理大批量数据的软件,核心价值在于结构化存储、快速检索和便捷修改数据,避免了纯文本文件管理数据的混乱与低效。SQLite 基础:轻量级无服务端数据库,通过 apt 安装,核心交互命令(.tables/.schema 等)用于快速操作;SQL 核心语法:CREATE/DROP 管理表,INSERT/DELETE/UPDATE 操作数据,SELECT 支持条件、排序、多表联合查询;C 语言编程:核心依赖,查询结果通过回调函数处理,需注意内存释放和错误处理。
2026-03-09 20:54:57
410
原创 深入理解 TCP 并发服务器:从 IO 模型到多路复用实现
TCP 并发服务器的核心是解决阻塞 IO 的并发问题,多路复用模型是高性能首选方案;epoll 相比 select/poll 无 fd 数量限制、无需反复拷贝数据、支持 ET 模式,是高并发场景的最优选择;实现 epoll 服务器时,ET 模式需配合非阻塞 IO,且要正确处理客户端断开连接的资源释放逻辑。
2026-03-07 17:00:45
408
原创 深入浅出 TCP 通信:从基础到并发服务器实现
TCP 通信是面向连接的可靠传输,核心流程为 “客户端 connect 连接,服务端 listen/accept 接收连接,双方 send/recv 收发数据”;TCP 粘包源于流式传输无边界,解决核心是 “约定数据边界(固定长度 / 分隔符 / 长度头)”;TCP 并发服务器可通过 “线程 / 进程模型(简单)” 或 “多路复用 IO 模型(高性能)” 实现,多路复用是高并发场景的首选方案。
2026-03-06 19:42:31
447
原创 【实战】基于 TCP 协议实现文件传输(C 语言版
TCP(传输控制协议)是一种面向连接、可靠的、基于字节流的传输层通信协议,凭借其三次握手、确认应答、重传机制等特性,成为文件传输的首选协议。本文将从原理到实战,完整实现 TCP 客户端(发端)向服务端(收端)传输文件的功能,并附带完整可运行的代码。TCP 文件传输的核心是先建立连接,再分块传输数据,利用 TCP 的可靠性保证文件完整。实战代码实现了 “客户端发文件 - 服务端收文件” 的完整流程,包含文件名传输、分块读写、确认响应等关键逻辑。
2026-03-04 19:46:27
380
原创 深入浅出理解 TCP/IP 网络模型与 UDP 通信编程
TCP/IP 模型是工业标准,分为应用层、传输层、网络层、网络接口层,UDP/TCP 属于传输层,IP 属于网络层。UDP 是无连接、不可靠的传输协议,适合对实时性要求高的场景;TCP 是面向连接、可靠的协议,适合对数据完整性要求高的场景。IP 地址分为公有 / 私有,私有 IP(如 192.168.x.x)仅局域网内使用,跨网通信需借助 NAT 转换。
2026-03-02 19:58:21
723
1
原创 深入理解 Linux 进程间通信(IPC):消息队列、共享内存与信号灯
消息队列的消息必须遵循固定结构,核心包含消息类型和消息正文:c运行long mtype;/* 消息类型,必须>0 *//* 消息正文,可自定义长度 */消息队列:异步通信,按类型收发消息,无需进程同步,但效率低于共享内存;共享内存:最高效的 IPC 方式,直接访问物理内存,但需配合信号灯实现同步;信号灯:核心用于进程同步 / 互斥,通过 P/V 操作控制信号量值,解决共享资源竞争问题。
2026-02-27 19:29:54
565
原创 Linux 进程间通信核心笔记:管道与信号实战解析
本文结合Linux系统特性,从基础概念、核心接口到特性原理,全面拆解管道与信号两种最常用的进程间通信方式,兼顾理论梳理与实战参考,适合Linux编程初学者巩固学习,也可作为课程设计、项目开发的速查手册。信号本质是一个整数标识,通过简单的信号编号传递事件,无法传输复杂数据。1. 通信逻辑:信号在内核态与用户态之间传递,进程1向内核发送信号,内核再将信号分发给进程2,进程2根据预设规则处理信号。无名管道仅适用于具有亲缘关系的进程(如父子进程、兄弟进程),其生命周期与进程绑定,进程退出后管道自动销毁。
2026-02-26 20:29:26
330
原创 【深入浅出】Linux 线程与进程间通信:从原理到实战
基础通信方式:全局变量 + 互斥锁(解决资源竞争),是最简单的线程通信方式。同步控制:信号量通过 “资源数” 控制线程执行顺序,实现严格的同步逻辑(如 A→B→C 顺序打印)。死锁规避:统一加锁顺序、使用是避免死锁的核心手段。
2026-02-25 20:02:41
674
原创 【Linux 编程】深入理解 POSIX 线程(pthread)核心接口与分离属性
核心函数创建线程、终止线程、回收 JOINABLE 线程资源,用于线程属性的初始化与销毁;分离属性:JOINABLE 线程需手动回收(可获取退出状态),DETACHED 线程由系统自动回收(无需 join);使用原则:无需等待线程结果时优先使用分离属性,避免僵尸线程;需要同步或获取线程执行结果时使用 JOINABLE 属性。掌握 pthread 核心接口和分离属性的使用,能有效提升多线程程序的稳定性和资源利用率,是 Linux 系统编程的必备技能。
2026-02-24 19:38:33
443
原创 【深入浅出】Linux 进程与线程核心知识点总结
僵尸进程的核心成因是父进程未回收子进程资源,可通过 “父进程主动回收” 或 “让子进程成为孤儿进程” 规避;exec 函数族的核心是 “程序替换”,后缀 l/v/p/e 分别对应参数列表 / 数组、PATH 查找、自定义环境变量;线程是轻量级进程,共享进程资源但独立调度,多线程开发需重点关注共享资源的竞争问题(锁机制)。掌握进程与线程的核心特性,是编写高性能、高稳定性 Linux 应用的基础。实际开发中,需根据场景选择多进程(如独立服务)或多线程(如高并发接口),并做好资源回收与同步控制。
2026-02-11 17:31:27
282
原创 深入理解 Linux 进程与线程:从概念到实战
进程核心特性:进程是动态的程序实例,拥有独立的虚拟地址空间,通过 MMU 映射到物理内存,进程间相互隔离;fork 核心逻辑:fork 创建子进程时采用写时复制,父子进程并行执行,父进程需通过 waitpid 回收子进程资源;实战关键技巧创建多子进程时需避免子进程重复 fork;遍历目录时需跳过。和..,并通过文件类型过滤目标文件;始终处理系统调用的返回值,避免僵尸进程和资源泄漏。
2026-02-10 20:17:59
585
原创 深入理解 Linux 文件 IO:从基础接口到实战应用
文件 IO 与标准 IO 的核心差异:文件 IO 是无缓存的系统调用,适合设备 / 通信文件;标准 IO 是有缓存的库函数,适合普通文件;文件 IO 核心流程open(打开 / 创建文件)→read/write(读写数据)→lseek(调整偏移)→close(关闭文件);实战关键:二进制文件拷贝需使用固定缓冲区循环读写,且要严格处理系统调用的返回值,避免数据丢失或文件描述符泄漏。掌握文件 IO 是 Linux 系统编程的基础,后续无论是网络编程、设备驱动开发还是进程间通信,都离不开这些核心接口的应用。
2026-02-09 19:32:07
646
原创 【Linux C 编程】标准 IO 详解与实战:从基础接口到文件操作实战
标准 IO(Standard I/O)是 C 语言提供的一套文件操作接口,封装了底层的系统调用(如 read/write),并引入缓存机制提升 IO 效率。相比系统调用,标准 IO 具有跨平台性强、使用简单、缓存优化等优势,是 Linux C 编程中文件操作的首选方式。标准 IO 是 Linux C 编程中文件操作的核心工具,其核心优势在于缓存机制和跨平台性。
2026-02-08 15:06:44
659
原创 深入理解 C 语言标准 IO:从基础到实践
一切皆是文件:统一的抽象让我们用同一套接口操作不同资源缓存机制:全缓存、行缓存、无缓存,不同场景适配不同性能需求核心流程fopen→ 读写(fputcfputsfprintf等) →fclose错误处理:始终检查fopen返回值,避免空指针操作;fclose不可省略掌握标准 IO,是我们深入 Linux 系统编程的第一步,后续我们会继续探讨更底层的文件 IO 与高级文件操作,敬请期待!
2026-02-06 19:07:37
623
原创 Linux软件编程入门:从基础操作到Shell脚本实战
Linux软件编程入门的核心的是“多练、多试、多总结”,很多新手容易陷入“只看不动手”的误区,这里给大家2个实用建议:命令练习:每天花30分钟,练习本文整理的常用命令,尤其是管道、grep、chmod、tar等高频命令,熟练到不用查笔记就能输入。脚本实战:从简单脚本开始写,比如“批量创建文件”“批量删除文件”,再逐步写复杂脚本(比如结合循环和分支的自动化脚本),遇到错误不要慌,终端的错误提示会告诉你问题所在。
2026-02-05 20:27:19
617
原创 必学排序与查找算法:6个核心知识点梳理(附特性+实操要点)
掌握算法特性后,精准选型能大幅提升程序效率,结合实际场景总结如下:小规模数据(n<10):优先插入排序(稳定)、选择排序(简单);中等规模数据:希尔排序(无额外空间)、快速排序(效率高);大规模数据:快速排序(首选),需稳定排序则选归并排序(补充:虽未梳理,但与快速排序复杂度一致,稳定);有序数据查找:折半查找(O(logn)),无序数据查找:线性查找(简单)。排序与查找算法的核心是理解“逻辑本质”,而非死记硬背代码。实际应用中,需结合数据规模、稳定性需求、空间限制综合选型,灵活调整算法细节。
2026-02-04 17:06:28
575
原创 二叉树的遍历以及哈希表
哈希:算法思想,将数据根据哈希算法映射成键值,根据键值来写入或是查找数据,以实现查找数。哈希碰撞(哈希冲突):多个数据通过哈希算法映射成同样的键值,说明产生哈希冲突。链地址法:数据产生哈希冲突通过在同一键值位置用链表实现多个数据的存储。
2026-02-03 19:53:51
26
原创 队列和二叉树
分支节点:既有前驱又有后继,树形结构中的分支节点最多有一个前驱,但是可以有多个后继。7. 高度:节点的高度是距离该节点最远的叶子节点的距离。层:根节点所在的位置称为第一层,每过一个节点,层数。节点:组成树形结构的数据称为树形结构中的节点。左孩子:二叉树中节点左侧的子节点称为左孩子。右孩子:二叉树中节点右侧的子节点称为右孩子。深度:节点的深度是距离根节点的节点个数。根左右:1、2、4、5、7、8、3、6。左根右:4、2、7、5、8、1、3、6。左右根:4、7、8、5、2、6、3、1。度:前驱或者后继的个数。
2026-02-02 20:30:14
39
原创 链表、栈和队列
队列是一种先进先出,后进后出的数据结构。入栈(压栈):将数据插入栈顶元素的位置。出栈(弹栈):将数据从栈顶元素位置取出。栈是一种先进后出,后进先出的数据结构。栈底:不允许入栈和出栈的一端称为栈底。栈和队列只能在指定的位置插入和删除。栈顶:允许入栈和出栈的一端称为栈顶。空栈:栈针指向入栈位置,称为空栈。满栈:栈针指向栈顶位置,称为满栈。栈针:指向栈顶位置的指针或下标。栈和队列是一种特殊的表状机构。链表的插入和删除效率比较高。表可以在任意位置插入和删除。数组插入和删除效率比较低。链表元素是没有上限的。
2026-02-01 17:51:00
69
原创 数据结构-链表
两个指针,一个指针指向开头,一个指针指向相遇点,两个指针都同时向后。14.判断链表是否有环。步,两个指针相遇即为有环。走,相遇点即为环入口位置。从相遇点走一圈,计数。
2026-01-30 20:23:31
21
原创 1.数据结构概念
时间复杂度:数据量增长与程序运行时间增长呈现的比例函数关系称为时间复杂度函数,简称为时。本质等同于数组,通过申请堆区空间存储数据,通过首地址完成对所有空间的访问。空间复杂度:数据量增长与程序空间增长呈现的比例函数关系称为空间复杂度。数据结构:程序操作数据对象的结构。二叉树(完全二叉树、满二叉树)算法:程序操作数据对象的方法。线性结构:一对一关系。树形结构:一对多关系。图形结构:多对多关系。常见的排序和查找算法。
2026-01-29 20:43:54
250
原创 C语言中库函数学习和内存常见的调试方法
问题原因:内存泄露,申请的空间没有被释放,所以不断有空间被申请,造成可用空间越来越。在可能出错的位置加入打印,查看对应的结果是否与预期一致,如果一致在后续的代码。打印法,加入打印,前一句能打印,后一句无法打印,证明中间代码出现问题。):语法警告,语法有可能会出现问题,不影响二进制文件的生成,程。字符串分割函数,能够根据指定的字符集对字符串进行分割。中继续加入打印,直到不满预期为止,则完成对错误的定位。问题原因:指针的越界访问,特别是字符串越界访问。,程序代码不稳定,数据被莫名其妙的修改。
2026-01-26 20:28:55
556
原创 12.多文件编程及Makefile使用
代码实现的二进制形式,在链接时与源代码链接为一个可执行程序。多个程序使用同一静态库,需要分别加载各自独立的静态库。原来没值,就赋值新值,原来有值,不会赋值新值。格式替换,根据格式将变量中的字符串完成替换。完成预处理、编译、汇编,编译成二进制代码。多个程序可以使用通一动态库,节省代码体积。变量中的所有文件去除路径,只留下文件名。完成预处理、编译,编译成汇编代码。所有依赖的文件,中间空格隔开。去除文件路径,只留下文件名。删除动态库,代码将无法运行。,系统会查找当前目录下的。完成预处理,编译成展开后。
2026-01-25 20:45:19
615
原创 C语言中构造类型的学习
栈区是由操作系统管理,操作系统负责对空间的申请释放,一般用于存放局部变量,执行到变。内存低地址存低放数据位,内存高地址存放高数据位,称为内存小端。内存低地址存放高数据位,内存高地址存放低数据位,称为内存大端。3.结构体成员变量空间独立,共用体所有成员变量共用同一空间。枚举常量的值都为整形,每个枚举常量的值为前一个枚举常量的值。栈的增长方向为自高向低增长,堆的增长方向为自低向高增长。量定义开辟空间,超过变量作用域,回收变量空间。成功返回申请到的堆区空间的首地址。参数:申请到的堆区空间的首地址。
2026-01-23 20:43:45
891
原创 C语言中指针和构造数据类型的学习
3.无论使用结构变量访问成员还是用结构体指针访问成员,最终类型是由成员变量的类型决定。结构体成员变量只能存放在内存地址为自身基本类型长度整数倍的内存单元中。2.结构体指针类型访问用成员变量用箭头: ->argv:传入所有参数字符串首地址的指针数组。1.结构体变量类型成员访问用 点: .结构体的大小必须为最大基本类型长度的数倍。struct 结构体名。argc:传入传参的个数。4.结构体成员变量的访问。3.结构体变量的初始化。6.结构体作为函数参数。
2026-01-22 19:39:25
347
原创 C语言中指针的学习
常用于搭配指针或者变量使用,表示变量或指针指向的空间中的数据是容易被改变的。2.指针数组传参时,数组的数组名是指向第一个指针元素的指针即二级指针。防止编译器优化代码,每次读写变量都是到内存中去存取变量的值。数组的数组名是指向数组第一个元素的指针,可以理解为。1.定义:二级指针是指向一级指针变量的指针.,值不变,类型升级为指向整个数组的数组指针。值不变,类型降级为指向数组第一个元素的指针。指针数组是数组,数组的每个元素都是指针。数组指针是指针,指针指向整个数组。是指向数组第一行元素的数组指针。
2026-01-21 20:38:53
394
原创 函数中指针的学习
表示指针指向一个固定的地址空间,但是可以通过指针修改对应空间的值,指针必须要。函数返回值作为下一个调用函数参数时可以使用指针函数。多用于函数传参,指针指向的空间中的数据不能修改。函数体内想修改函数体外部变量值的时候传地址。函数体内想使用函数体外部变量值的时候传值。函数返回值为指针类型的函数称为指针函数。函数指针是指针,指针指向一个函数。指针函数不能返回局部变量的地址。函数的函数名就是指向该函数的指针。4.字符型数组和字符串的传参。数组是用来存放一组数据的。3.指针和数组的关系。指针是用来操作数据的。
2026-01-20 19:42:54
308
原创 C语言中指针的学习
3.指针变量:指针变量是一个变量,变量用来存放地址,使用变量就是使用该地址,所以指变量有时又称指针。1.地址:内存中用来区分不同字节的编号 64位操作系统8个字节表示地址。2.指针:指针就是地址,地址就是指针,指针指向某个地址对应的内存空间。:指针向内存高地址偏移指向数据类型大小个字节空间。:指针向内存低地址偏移指向数据类型大小个字节空间。左值:将右值放入指针指向的空间。1.&:获得变量在内存的首地址。未初始化的指针,指向随机空间。:变量在内存空间中的首地址。右值:取指针指向空间中的值。
2026-01-19 19:54:22
409
原创 函数传参的学习
带参宏是代码的替换,没有函数调用,形参,实参,返回值的概念。函数调用,实参将值传递给形参,形参是实参的副本形参改变不会影响实参的值。带参宏是代码的替换没有传参过程,所以效率比函数高。主调函数调用被调函数,被调函数运行结束后回到主调函数继续向下执行。函数代码实现比较简单可以使用带参宏替代函数。值传递只能使用外部变量的值而无法改变函数体外部变量值。1.函数在定义时调用本身,这样的函数称为递归函数。函数内部想要操作函数体外部变量值的时候需要传参。2.带参宏(宏函数)通过使用全局变量在函数间传递数据。
2026-01-18 16:21:31
149
原创 C语言中数组和函数的学习
函数类型:函数运行结果的类型,如果省略不写默认为int类型,可以写成void表示没有运行结果。局部变量:变量作用在局部范围内(只能定义变量最近的大括号内使用),出了作用域无法使用变量。返回值:函数的结果,如果函数与函数类型不一致,需要返回值强制类型转换为函数类型返回。将变量存放在cpu内部的寄存器中,寄存器存满则存放在栈区等价于auto类型。引用一个外部定义的变量,需要在当前文件中声明该变量为外部存储类型。如果被调函数在主调函数的下放定义,则需要对被调函数声明。形参:形式参数,展示对数据的操作方法。
2026-01-16 20:34:26
233
原创 C语言中数组的学习
功能:将第二个字符串拼接到第一个字符串的末尾。字符串比较大小是:两个字符串不相同的字符谁的。二维数组默认初始化:行能省略,列不能省略。目的空间必须能够存放的下拼接后的字符串。功能:比较两个字符串是否相同,相同返回。目的空间一定要能够存放的下源字符串。局部初始化中没有给定初值的元素为。功能:将源字符串拷贝到目的空间。连续性:数组空间连续,数组大小。语言用来存放字符串的类型。二维数组是:一维数组的数组。要存储的字符串的字符个数。存放数据的顺序是有序的。中间元素的个数,不包含。在内存中所占的字节数。
2026-01-15 19:27:49
308
原创 C语言中数组的学习
元素个数必须为常量或常量表达式,不能为变量或变量表达式。局部初始化没有给定初值的元素会被初始化为。数组:数组是相同类型有限元素的集合。有序性:数组存放元素的顺序有序,连续性:数组存放元素空间连续。1. 一维数组 a。2. 二维数组 a。单一性:数组元素类型一致。每个元素所占空间大小。数组元素的倒置(逆序)
2026-01-14 21:22:10
192
原创 流程控制学习
循环执行前需要执行的表达式(对循环中使用的变量赋初始值):循环条件(满足条件执行循环,不满足条件循环结束)只能用于循环结构中,表示结束本次循环。重复执行一段代码使用循环结构。:每次循环完毕后要执行的代码。有规律的代码使用循环结构。语句块:重复执行的代码。中,表示跳出当前循环或。变量 查看变量中的值。
2026-01-13 20:38:43
202
原创 流程控制学习
程序从main函数第一句开始执行,执行到main函数结束。后面的值必须为常量,不能为常量表达式、变量或变量表达式。如果上面的表达式满足,不会判断后续的表达式。后面的表达式必须为整形,不能为浮点数类型。不加大括号默认控制一句,最好加上大括号。:真取非得假,假取非得真。:左边为假值右边不再执行。特殊运算符(三目运算符)同一类数据完成不同操作使用。:左边为真值右边不再执行。:一假为假,全真为真。:一真为真,全假为假。后面必须加条件判断,次,然后顺序向下执行。
2026-01-12 20:02:30
234
原创 常用的输入输出函数
中出现非输入控制符,需要用户从终端输入对应的内容,否则接收失败。从main函数第一句开始执行,到main函数结束程序运行结束。putchar 、 getchar 单个字符的输入输出函数。printf 、 scanf 格式化输入输出函数。实现某些函数的工具,使用时需要加上头文件。printf打印非输出控制符。将字符串转换为单个字符形式。功能:在屏幕中显示一个字符。将字符串转换为十进制形式。将字符串放入对应空间中。格式化字符串输入函数。格式化字符串输出函数。
2026-01-11 14:45:26
285
原创 Linux系统中C语言开发的初步学习
1.主要分为short(2字节), int(4字节), long(8字节)类型。掉电数据丢失(代码运行过程中的数据) 掉电数据不会丢失(文件)double(12~16位有效数字)类型:1位符号位+11位指数为+52位尾数为。2.char分为有符号类型(char)和无符号类型(unsigned char)float(6~8位有效数字)类型:1位符号位+8位指数位+23位尾数位。整数类型, 浮点类型, 字符类型, 缺省类型, 波尔类型。
2026-01-08 20:29:06
263
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅