- 博客(22)
- 收藏
- 关注
原创 C/C++ 面试复习笔记(6)
flock()锁:绑定到文件表项(struct file),进程复制文件描述符(如fork()或dup())时锁会被 继承,导致同一进程的多个描述符共享锁。fcntl()记录锁:绑定到Vnode 和进程,通过struct inode管理锁的持有者,不同进程的锁会冲突。
2025-06-12 20:15:40
94
原创 Linux 信号机制深度解析:从基础概念到实战应用
信号是 Linux 系统中用于异步通知进程的事件机制,本质是一个整数(信号编号)。它可以由硬件事件(如键盘中断)、系统内核(如内存访问错误)或用户进程(如kill命令)产生,用于:通知进程异步事件(如文件就绪、定时器超时)。强制进程终止或暂停(如SIGKILLSIGSTOP实现进程间通信(轻量级 IPC)。模块关键知识点基础概念信号编号、分类(实时 / 非实时)、生命周期(产生 - 未决 - 递送)。处理方式默认、忽略、捕获(signal函数),信号处理函数的异步执行。僵尸回收SIGCHLD。
2025-06-10 22:52:30
1386
原创 C/C++ 面试复习笔记(5)
定义: 文件空洞是文件中未被显式写入数据的区域,逻辑上存在(文件大小包含这部分),但物理上不占用磁盘空间。特征:逻辑大小 > 物理大小:通过ls -l显示的文件大小大于du命令显示的磁盘占用。读取时返回零:访问空洞区域时,系统返回零值字节(但实际未存储)。节省磁盘空间:文件系统仅分配实际写入数据的块,跳过空洞。实际场景:虚拟机磁盘映像: 虚拟机(如QEMU的qcow2格式)使用空洞表示未分配空间,避免占用宿主机实际存储。
2025-06-09 22:04:55
507
原创 C/C++ 面试复习笔记(4)
内存颠簸是指系统在频繁地进行内存页的换入换出操作,导致大量的磁盘 I/O,系统性能急剧下降的现象。当系统的物理内存不足,而进程对内存的需求又不断变化时,就容易出现内存颠簸。例如,一个进程频繁地访问不同的内存页,而这些页在内存中频繁地被换出和换入。在 Linux 系统中,可以通过以下方法避免或解决内存颠簸问题:增加物理内存:如果物理内存不足是导致内存颠簸的主要原因,增加内存条可以直接提 高系统的可用内存,减少页交换操作。
2025-06-06 23:25:37
951
原创 深入解析 Linux 进程管理:从概念到实战的全面指南
进程是程序的一次动态执行实例,是操作系统分配资源(CPU 时间、内存等)的基本单位。程序是存储在磁盘上的静态文件(包含代码和数据)。进程是程序加载到内存并由 CPU 执行的动态实体。例如,同一个程序(如文本编辑器)可以同时运行多个进程,每个进程独立占用系统资源。从内核视角看,进程的核心作用是作为资源分配的载体,实现多任务并发执行。功能:用新程序替换当前进程的内存映像(PID 不变,进程 “变身”)。核心函数execl:参数以列表形式传递(execv:参数以数组形式传递(execvp:自动搜索。
2025-06-04 23:44:00
1294
原创 1-Wire 一线式总线:从原理到实战,玩转 DS18B20 温度采集
一线式串行总线,顾名思义,只需一根数据线即可实现 CPU 与外设的通信(需上拉电阻,默认高电平)。单数据线:数据传输与时钟同步都依赖这根线。串行通信:一位一位地传输数据,而非并行。总线结构:支持多个从设备挂接在同一数据线上(需通过 ROM 寻址)。一线式总线以其极简的硬件设计和独特的通信机制,为嵌入式系统提供了一种低成本、易扩展的解决方案。通过本文的实战案例,我们掌握了 DS18B20 温度传感器的基本原理和编程方法,理解了一线式总线的通信协议与实现技巧。
2025-05-31 23:39:36
1273
原创 C/C++ 面试复习笔记(2)
答案:快排是一种分治算法,选择一个基准元素,将数据划分成两部分,然后递归排序补充://判断是否需要排序return;//基准值//实现大于基准值的数字放到左边right--;//将基准值填入left++;//实现小于基准值的数字放到右left++;//将基准值填入right--;//递归排序。
2025-05-31 00:06:38
1159
原创 文件系统与文件管理:从磁盘到内核的全链路解析
物理层:硬盘通过磁道 / 扇区 / 柱面组织数据,文件系统将物理地址抽象为逻辑块。逻辑层:i 节点管理文件元数据,目录文件维护文件名与 i 节点的映射,数据块存储实际内容。编程层:通过系统调用()和高级接口(mmap/fcntl)操作文件,利用文件锁和缓冲机制优化性能与安全。延伸思考为什么删除符号链接不影响目标文件?(符号链接仅存储路径,删除不影响 i 节点引用计数)如何用strace追踪文件打开失败的原因?(查看open系统调用返回值和错误码)
2025-05-29 23:08:39
1005
原创 C/C++ 面试复习笔记(1)
答案:位域允许程序员在结构体中按位定义变量,用于节省内存空间。解析:位域通常用于需要节省内存的场景,如硬件编程、协议解析等。位域的大小通常不能超过指定的位数,且通常用于表示标志位。补充:1.// 取值范围为:0~3// 取值范围为:0~15// 取值范围为:0~63// 给pk1各成员赋值并打印输出pk1.a = 1;pk1.b = 10;pk1.c = 50;// 给pk2各成员赋值并打印输出pk2.a = 5;pk2.b = 20;pk2.c = 66。
2025-05-29 21:18:17
920
原创 程序的 “内存舞台”:深入解析虚拟地址空间与内存管理
安全隔离:每个进程拥有独立的用户空间,防止互相干扰(如恶意程序篡改其他进程内存)。内存抽象:程序员无需关心物理内存细节,通过虚拟地址统一编程,降低开发复杂度。内存扩展:利用磁盘交换分区,使程序可用内存远超物理容量(尽管性能下降)。通过理解虚拟地址空间与内存管理机制,开发者能更高效地调试内存问题,合理使用系统资源,写出健壮的程序。内存管理如同舞台调度,只有掌握规则,才能让程序在有限的空间中优雅起舞。
2025-05-28 23:26:10
1133
原创 程序开发的 “瑞士军刀”:深入解析库文件的原理与实践
从早期的静态库到动态库,再到动态加载技术,库文件的发展始终围绕 “效率” 与 “灵活性” 展开。理解其原理不仅能帮助开发者正确使用现有库,更能自主构建高效的代码复用体系。无论是开发工具链、操作系统组件,还是复杂的业务系统,库文件都是现代软件开发不可替代的基础设施。相关教程:C++静态库与动态库 | 菜鸟教程t=P4F5C++静态库与动态库 | 菜鸟教程https://www.runoob.com/w3cnote/cpp-static-library-and-dynamic-library.html。
2025-05-27 22:44:18
1231
原创 小知识:STM32 printf 重定向(串口输出)--让数据 “开口说话” 的关键技巧
重定向的本质是修改标准库函数的输出目标。在 C 语言中,printf函数会调用fputc函数来完成实际的字符输出操作,而fputc默认指向的输出设备(如终端屏幕)在嵌入式系统中并不存在。因此,我们需要重新实现fputc函数,将字符输出的目标指向 STM32 的串口寄存器或 HAL 库的串口发送函数,这一过程就称为重定向。FILE通过重定向fputc函数,我们赋予了 STM32 使用printf函数的能力,使其能够通过串口与外界进行数据交互。
2025-05-25 23:08:51
1418
原创 深入理解 I2C 总线:STM32 外设通信的关键纽带
两线式:处理器与外设之间仅需两根信号线,即 SCL(时钟控制信号线)和 SDA(数据线)。SCL 由 CPU 掌控,用于实现数据同步,遵循 “低放高取” 原则,即 SCL 为低电平时将数据放置在 SDA 上,SCL 为高电平时从 SDA 获取数据;SDA 用于传输数据,通信双方均可控制,发送数据时由发送方掌控。需特别注意,SCL 和 SDA 必须分别连接上拉电阻,使其默认电平为高电平。串行:因仅有一根 SDA 数据线,数据传输为串行方式,且在 SCL 时钟信号控制下,一个时钟周期传输一个 bit 位。
2025-05-23 22:57:50
1821
原创 探秘 STM32 串口通信:从原理到实战的全方位指南
通用:UART 在工控、电力等诸多领域广泛应用,凭借其简单易用和兼容性强的特点,成为嵌入式系统中数据通信的常用选择。串行:与并行通信不同,UART 通信时处理器与外设仅需一根信号线相连,数据按位依次传输,且从低位开始。并行通信虽传输速度快,但需多根数据线,抗干扰能力弱、传输距离受限,相比之下,串行通信在抗干扰和长距离传输方面更具优势。异步:在计算机系统中,处理器与外设的数据处理速度差异显著,数据同步至关重要。
2025-05-20 22:46:06
1413
原创 释放 CPU 潜能:STM32 中断系统从原理到实战全解析
通过本文的学习,我们深入理解了 STM32 中断系统的工作原理和配置方法。与轮询相比,中断机制能够显著提高 CPU 的利用率,让系统更加高效地响应外部事件。中断基础知识:了解中断与轮询的区别,掌握中断的硬件连接和工作流程。EXTI 控制器:学会配置外部中断 / 事件控制器,设置触发方式和中断模式。NVIC 优先级:理解抢占优先级和响应优先级的区别,合理配置中断优先级分组。中断处理流程:掌握中断服务函数的编写和中断标志的清除方法。在实际开发中,中断是实现实时响应和多任务处理的基础。
2025-05-19 14:35:01
1133
原创 精准掌控时间:揭秘 STM32 Systick 定时器的原理与实战应用
Systick 定时器,全称 System Tick Timer,是 ARM Cortex-M 系列处理器的 “标配” 模块。无论是 STM32、GD32 还是其他基于该内核的微控制器,都内置了这一强大功能。无需占用额外外设资源,仅需通过配置内核寄存器,即可实现高精度延时与定时中断,极大提升了系统资源利用率。从基本定义到寄存器配置,再到完整代码实现,我们全面剖析了 Systick 定时器的核心功能。它不仅是 STM32 开发中实现精准延时的 “利器”,更是操作系统、实时任务调度的重要基石。
2025-05-13 12:27:08
1174
原创 掌控 STM32 的 “脉搏”:一文吃透时钟系统的奥秘与实战
为了更好地理解时钟的作用,我们先来认识一下 D 触发器。作为最简单的触发器类型,D 触发器的工作原理十分直观:在时钟信号的触发边沿(通常是上升沿)到来时,它会将输入端(D 端)的值存入其中,且这个过程与触发器当前存储的值无关。在两个有效脉冲边沿之间,D 端信号的变化不会影响触发器的存储状态。不过,在脉冲边沿到来之前,D 端信号必须有足够的建立时间,以确保信号稳定,避免出现数据错误。
2025-05-11 21:45:40
1054
原创 STM32 位带操作:解锁高效寄存器控制的 “隐藏技能”
在system.h文件中,我们先定义一系列宏,用于简化位带操作的地址计算和寄存器访问://system.h//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).//IO口操作宏定义//IO口地址映射#endif通过今天的分享,我们深入了解了 STM32 中位带操作的原理、地址映射关系以及实际应用。从解决寄存器操作的痛点出发,到掌握位带区与别名区的转换公式,再到亲手编写代码控制 LED 和蜂鸣器,相信大家对这项技术已经有了全面的认识。
2025-05-10 22:08:53
891
原创 一文解锁 GPIO 的 8 种神奇模式
通过本文的分享,我们深入了解了 GPIO 的基本概念、丰富的功能模式以及在 STM32F10X 系列单片机中的初始化实现方法。从输入模式下的信号采集到输出模式下的电平控制,GPIO 在嵌入式系统开发中扮演着至关重要的角色。无论是采用寄存器直接操作的方式,还是借助库函数进行配置,都需要我们熟练掌握其原理和应用技巧。在实际项目开发中,合理选择 GPIO 的工作模式,能够有效提升系统的稳定性和功能性。
2025-05-09 22:31:33
948
原创 C 可变参数
作为编程小白,我想用最直白的语言结合自己的理解来分享这些知识。当然,我还在学习阶段,如果有说得不对的地方,或者大家有不同的看法,欢迎在评论区指出。写博客也是我学习的过程,我最近刚开始写博客,要是大家有任何建议,还请多多指教~
2025-05-02 22:35:41
654
原创 深入剖析 STM32:HAL、标准库、LL 库与寄存器操作
在 STM32 开发中,寄存器操作、标准库、HAL 库和 LL 库各有优劣。寄存器操作适合对硬件性能要求极高、对硬件细节有深入了解的开发者;标准库适合初学者快速上手,但由于其停止更新,在新项目中使用较少;HAL 库适合快速开发和项目移植,但代码体积和执行效率是其短板;LL 库则在性能和开发效率之间取得了较好的平衡。开发者应根据项目的具体需求和自身的技术水平,选择最合适的开发方式。
2025-05-01 22:18:07
1088
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人