自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 VMware安装 Ubuntu20.04.6超完整图文攻略(含分辨率问题找不到“继续”按钮解决方案+必备软件推荐)

Ubuntu 20.04.6 LTS 虚拟机安装指南 本文提供详细的VMware虚拟机安装Ubuntu 20.04.6教程,包含准备工作、虚拟机创建和系统安装三个主要步骤。首先需要下载VMware Workstation和Ubuntu镜像文件,建议硬件配置为双核CPU和8GB内存。创建虚拟机时需注意选择Linux系统类型、分配2-4GB内存和30-50GB磁盘空间。安装过程中如遇分辨率问题,可通过显示设置调整解决。教程配有详细图文指引,适合新手逐步操作,确保顺利安装Ubuntu开发环境。

2025-08-09 17:59:13 3842 1

原创 Linux内核中的中断上半部、下半部、上下文与睡眠详解

中断上半部:快速、不能睡眠。中断下半部:延迟处理,可在中断上下文(tasklet/softirq)或进程上下文(workqueue)。中断上下文:紧急处理,禁止睡眠。进程上下文:对应用户进程,可睡眠。睡眠:只能发生在进程上下文,依赖中断唤醒。理解这五个概念及其关系,基本就掌握了 Linux 内核驱动的执行框架。很多驱动代码的复杂度,往往就是围绕“何时可以睡眠、何时必须快速返回”展开的(完)

2025-11-19 15:02:19 697 2

原创 RK3399内核驱动实战:获取设备号控制LED的四种方法(由浅入深、代码注释详尽)

本文介绍了RK3399 Linux内核驱动开发中获取设备号控制LED的三种方法,从基础到进阶逐步深入。首先讲解了设备号(dev_t)的基础概念和操作方法,然后详细介绍了三种实现方式:1) 使用register_chrdev()快速入门方法;2) 推荐工程化的alloc_chrdev_region()+cdev方法;3) 多设备管理方法。每种方法都提供了完整的内核模块代码示例,包含详细注释和错误处理。文章还包含用户态测试程序、编译加载说明以及常见问题调试清单,帮助开发者快速掌握Linux字符设备驱动开发的关键

2025-09-01 14:08:21 1073

原创 像信号处理一样理解中断:STM32与RK3399中断机制对比及 Linux 驱动开发实战

本文系统解析了ARM处理器的工作模式、异常向量表及中断机制,对比了STM32(Cortex-M)与RK3399(Cortex-A)的中断处理差异。ARM架构定义了7种工作模式和异常向量表,而不同芯片扩展了中断控制器(如STM32的NVIC和RK3399的GIC)。文章通过RK3399按键中断驱动实例,展示了Linux内核下中断处理的完整流程,包括GPIO转中断号、注册/释放中断及中断处理函数实现。最后总结了ARM中断机制的核心要点及不同架构的实现特点。

2025-09-01 11:27:45 1350

原创 深入理解 Linux 驱动中的 file_operations:从 C 语言函数指针到类比 C++ 虚函数表

本文深入解析了Linux驱动中的file_operations结构体,揭示了其与C语言函数指针及C++虚函数表的关联。文章首先通过基础示例展示C语言函数指针的用法,说明如何通过指针间接调用函数。然后将函数指针嵌入结构体,形成操作方法表,类比Linux驱动中file_operations的设计理念。通过LED驱动实例,详细说明file_operations如何将系统调用映射到具体驱动函数。最后将其与C++虚函数表对比,指出两者都是通过函数指针实现动态绑定,区别在于前者手动实现而后着由编译器自动生成。全文清晰阐

2025-08-30 17:54:46 834

原创 C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region

本文介绍了C语言中的输出参数概念及其应用。输出参数通过指针让函数返回额外结果,用于需要返回多个值的场景。文中先用简单例子说明输出参数的用法,然后结合Linux驱动开发中的alloc_chrdev_region函数进行深入分析,解释了该函数如何通过输出参数返回设备号。文章指出,输出参数的本质是让函数通过指针"返回"额外结果,适用于一个返回值不够用的场合,如alloc_chrdev_region既要返回执行状态又要返回设备号的情况。

2025-08-30 17:34:22 454

原创 线程生命周期:pthread_detach 和 pthread_join 区别梳理

本文深入探讨线程生命周期及资源回收机制,重点对比 pthread_join 和 pthread_detach 的区别。线程终止后,pthread_join 会阻塞主线程等待子线程结束并回收资源,适合需要获取返回值的场景;而 pthread_detach 则让系统自动回收资源,主线程无需等待,适用于不关心结果的异步任务。文章还分析了僵尸线程产生的原因及解决方案,强调应根据实际需求选择合适的线程回收方式,避免资源泄漏和管理混乱。通过代码示例和对比表格,清晰展示了两种机制的使用场景和特性差异。

2025-08-18 16:35:50 424

原创 Linux 下基于 TCP 的 C 语言客户端/服务器通信详解(三个示例逐步进阶)

本文介绍了Linux下基于TCP协议的C语言socket编程,通过三个示例逐步实现客户端/服务器通信:1) 客户端单向发送消息;2) 客户端循环发送键盘输入;3) 实现双向通信。详细讲解了socket API调用流程,包括socket()、bind()、connect()、listen()、accept()、send()/recv()等函数的使用方法,并对比了strlen和sizeof在收发数据时的应用场景差异。文章采用"电话"比喻生动说明TCP通信过程,并提供了完整可运行的代码示例,帮

2025-08-17 17:52:31 1391

原创 Linux -【新手必看】Makefile完全指南:4种写法详解+基础语法+变量与函数全解析

本文以简单计算器项目为例,详解了四种常见 Makefile 写法及其区别。第一种直接编译所有源文件,简单但效率低;第二种显式写出每个目标文件的编译规则,效率高但规则繁琐;第三种利用隐式规则简化命令,保持增量编译且更简洁;第四种结合变量、通配符和自动变量,灵活且易维护,是推荐写法。文章还系统介绍了 Makefile 基础语法、变量分类(自定义变量与内置变量)、自动变量($@、$^、$<)、显示规则与隐式规则区别,以及常用函数(wildcard、patsubst、shell)

2025-08-06 20:01:29 1162

原创 C语言 - 详解 memset 和 memcpy 的使用与区别

本文详细介绍了C语言中两个常用内存操作函数memset和memcpy的使用方法及区别。memset用于将内存设置为指定字节值,常用于数组或结构体的初始化清零;memcpy用于内存块的复制,适用于数组、字符串和结构体的拷贝。文章通过示例代码展示了二者的正确用法,并特别指出常见错误:如memset设置非零整数数组时的误解,以及memcpy复制字符串时可能遗漏结束符的问题。最后总结了二者的适用场景:memset适合内存初始化,memcpy适合数据复制,它们是C语言底层开发的重要工具。

2025-07-24 14:09:30 1185

原创 深入浅出:RS232、RS485、UART、Modbus与差分信号、共模信号的那些事儿

摘要: RS232、RS485、UART和Modbus是工业控制与嵌入式开发中常见的通信标准。UART是异步串口通信的核心技术,实现并行与串行数据的转换。RS232采用单端信号,适合短距离点对点通信,而RS485通过差分信号支持长距离、抗干扰的多设备网络。Modbus作为协议层,运行于RS232/RS485之上,分为RTU(二进制)和TCP(以太网)两种形式,适用于工业自动化。CH340芯片常用于USB转串口通信,DB9则是常见的物理接口。选择方案时,小型项目可用RS232+CH340,工业场景推荐RS48

2025-07-12 15:56:13 1460

原创 单片机 - STM32F103“复用功能重映射”完整解析:从JTAG释放到TIM重映射实战详解

本文详细解析了STM32F103系列中的"复用功能重映射"(Remap)机制,包括其概念、判断逻辑和实际应用。主要内容涵盖:JTAG默认占用问题的解决方法;重映射的三种类型(无重映射、部分重映射和完全重映射);并以TIM3在PB4/PB5输出PWM控制电机为例,给出了完整的配置步骤和代码实现。文章强调外设引脚使用必须遵守ST提供的映射规则,建议在项目初期合理规划引脚资源。该指南适合STM32开发者在遇到引脚复用和功能重映射问题时参考使用,能有效解决外设冲突和优化引脚资源分配。

2025-06-26 17:45:21 2522

原创 单片机 - STM32读取GPIO某一位时为什么不能直接与1判断为高电平?

摘要:在STM32开发中,初学者常遇到GPIO位判断失效的问题。例如读取GPIO电平时,(GPIOB->IDR & (1<<7)) == 1判断总是失败,而改用!=0却能成功。原因是:位掩码操作返回的是具体位值(高电平时为0x80),而非简单1/0。标准写法应使用右移+掩码归一化:((GPIOx->IDR>>n)&0x01),确保结果为0或1。这种位操作差异在I2C等时序敏感场景尤为关键,错误判断会导致通信失败。建议开发者规范宏定义,避免直接对原始寄存器值进行等值判断。

2025-06-17 17:56:16 1252

原创 单片机 - STM32软件模拟IIC通信中delay_us的使用规律全解析(含口诀与源码详解)

摘要:本文详细解析了STM32软件模拟IIC通信中delay_us的使用规律。通过分析IIC协议的核心时序特征,总结了delay_us在时钟切换、数据稳定、采样等待等场景下的使用原则,并提供了"SCL拉低先准备,SCL拉高等稳定"的口诀帮助记忆。文中包含典型错误案例分析、推荐延时时间表以及带注释的源码示例,并建议使用宏定义统一管理延时。文章强调软件模拟IIC的关键在于精确控制时序,delay_us虽简单但能有效保证通信稳定性,适用于硬件I2C受限或需要灵活调试的场景。

2025-06-17 14:04:19 1747

原创 单片机 - STM32F407 ADC 模式详解:单次转换、连续转换、扫描模式、非扫描模式

摘要: STM32F407的ADC模块提供四种核心工作模式组合:单次/连续转换模式与扫描/非扫描模式。单次模式适合手动触发采样场景,连续模式用于实时数据采集;扫描模式支持多通道自动轮询,非扫描模式适用于单一信号源。通过灵活组合这些模式(如扫描+连续转换+DMA实现高效多通道实时采样),可满足不同应用需求。配置时需明确转换行为(单次/连续)和通道采样方式(扫描/非扫描)两个关键维度,初学者建议从简单模式逐步调试扩展。

2025-06-14 17:36:36 1750 1

原创 单片机 - STM32 非阻塞式编程详解:以 LED 和按键为例(附超详细寄存器级代码)

摘要:本文介绍了STM32嵌入式开发中的非阻塞式编程方法。通过对比阻塞与非阻塞的区别,文章阐述了非阻塞编程的核心思路:利用时间戳差值判断而非delay()阻塞等待。具体实现了基于SysTick计时器的1ms中断基准,演示了LED非阻塞闪烁和按键检测(含消抖)的寄存器级代码实现。该方法使CPU能够高效轮询处理多个任务,适用于需要并发处理的嵌入式场景。文章最后总结了非阻塞编程的精髓,并建议进一步学习状态机、事件驱动等扩展知识。

2025-06-11 11:43:44 1900 2

原创 C语言 - 深拷贝与浅拷贝详解

C语言-深拷贝与浅拷贝详解

2025-04-16 18:41:12 2956

原创 嵌入式C语言 - 计算机存储体系与32位CPU寻址能力解析

计算机存储体系与32位CPU寻址能力解析

2025-04-14 17:32:39 2158

原创 C 语言 - 右左法则与实践练习题 & 答案解析

C 语言-右左法则与实践练习题 &答案解析

2025-04-12 10:06:01 376

原创 C 语言 - 指针与const复杂声明完全掌握 | 右左法则详解与实践指南

C语言-指针与const复杂声明完全掌握,右左法则详解与实践指南

2025-04-11 09:11:16 1822

原创 C 语言 - 复杂指针与声明语法 - 两条重要原则

C 语言-复杂指针与声明语法-两条重要原则

2025-04-10 09:08:49 661

原创 C 语言 - 代码精简手册:献给每一个写完自己都看不懂的人

C 语言是一门既灵活又危险的语言。它允许你写出极其精简但也极其晦涩的代码。有些老程序员偏爱这种写法,看起来像神,维护起来像鬼。下面是一些常见的 C 语言浓缩语句,以及它们拆解后的正常人类能看懂的版本。

2025-04-09 09:00:00 1178

原创 C语言 - 字符串函数手搓大全 | `strcpy`、`strcat`、`strcmp`、`strlen`、`strchr`、`strstr` 全解(含注释)

C语言字符串函数手搓大全 | strcpy、strcat、strcmp、strlen、strchr、strstr 全解(含注释)

2025-04-08 18:36:21 694

原创 C语言 - 指针变量 + 1 的本质

C语言 - 指针变量 + 1 的本质。

2025-04-02 15:46:54 749

原创 C语言 - 变量修饰关键字

嵌入式 C 语言变量修饰关键字

2025-03-29 17:20:00 801

原创 单片机 - MSB先发的串行数据收发 知识点整理

MSB 先发的串行数据收发

2025-03-27 20:15:56 1681

原创 C语言 - 数据类型转换中常见的技巧 (取小数的整数部分 & 取多字节的低字节部分)

数据类型转换中常见的技巧 (取小数的整数部分 & 取多字节的低字节部分)

2025-03-26 19:48:27 1211

原创 C语言 - 用位运算逐位打印二进制位 (高位先发)

C语言打印二进制位,高位先发

2025-03-26 12:04:48 582

原创 C语言 - 整数与浮点数运算的类型转换规则

这些规则适用于 C 语言,也适用于 C++ 及其他类似的编程语言。在 C 语言中,不同数据类型在运算时会进行。当 unsigned int。,运算结果通常会转换为。,运算结果通常会转换为。

2025-03-25 19:20:22 1709

原创 单片机 - 位运算详解(`&`、`|`、`~`、`^`、`>>`、`<<`)

位运算是单片机编程(C/C++)中经常使用的技巧,用于高效地操作寄存器、I/O 端口和数据。以下是各位运算符的详细解析,并结合单片机实际应用举例。端口连接了 LED,我们要点亮 LED(假设 LED 连接在 P2 的第 2 位)。代表某个 I/O 端口,我们想要清除 P1 端口的第 3 位(保留其他位不变)。是否相等(所有位均相同)。

2025-03-25 16:53:53 3420

原创 计算机网络 - OSI 七层模型

TCP/IP 是目前实际应用的主要网络协议,而 OSI 主要作为理论模型指导网络协议的设计。OSI(Open System Interconnection,开放系统互联)模型由。制定,目的是为不同计算机网络系统之间的通信提供一个标准化的框架。,每层都负责不同的功能,并与上下层进行交互。

2025-03-24 17:58:32 3711

原创 单片机 - 串行通信 & 并行通信、接口类型及常见通信协议详细解析

按位(bit)依次传输数据,并通过时钟信号或特定的协议进行同步。SPI 是一种高速全双工串行通信协议,适用于。同时传输多个数据位(bit),通常需要。,两者的主要区别在于数据传输的方式。,用于计算机和外设之间的通信。

2025-03-24 10:23:06 3024

原创 操作系统 - 存储管理

1.内存管理计算机系统的部分涵盖了操作系统如何管理计算机的内存、存储设备和文件的资源,以确保数据存取的高效性、安全性和可靠性。存储管理包括多个方面,尤其是内存管理、存储设备管理和文件系统管理。1.内存管理内存管理是指操作系统如何有效地分配和管理计算机的主内存(RAM),使得程序能够在内存中运行,同时避免不同进程之间的冲突。内存管理的关键任务包括内存的分配、回收、保护和共享。

2025-03-23 14:49:15 907

原创 单片机 - 为什么32位CPU通常不能支持超过4GB RAM?

32位CPU和64位CPU的最大寻址能力有着显著的差异,导致32位CPU在处理大内存时存在一些限制。本文详细探讨32位和64位CPU的寻址能力,并分析为什么32位CPU通常不能支持超过4GB的RAM。为了突破4GB的寻址限制,Intel在Pentium Pro(1995年)之后的CPU引入了。由于操作系统和硬件架构的限制,现代操作系统实际上支持的最大RAM远小于16EB。即使物理内存超过4GB,CPU也无法使用这些额外的内存。在计算机架构中,CPU的寻址能力决定了它能够访问的。32位CPU的地址总线为。

2025-03-23 14:47:58 1295

原创 数据结构 - 冒泡排序算法(C语言简洁版,附超详细注释)

冒泡排序算法(C语言简洁版,附超详细注释)

2025-03-22 09:29:33 947

原创 一文全面掌握 RAM、ROM、EEPROM、Flash、硬盘的区别与联系

本文系统梳理了RAM、ROM、EEPROM、Flash和硬盘等存储器的核心区别与联系。RAM作为临时存储速度快但掉电丢失,ROM用于固件存储不可改写,EEPROM支持字节级擦写适合配置数据,Flash需整块擦除用于程序存储,硬盘/SSD提供大容量长期存储。通过特性对比表和典型应用场景分析,帮助读者建立清晰的存储设备认知体系,并给出嵌入式开发的选型建议。文章还澄清了常见概念混淆,最后用口诀帮助记忆不同存储器的核心特点。

2025-03-22 09:28:57 4352

原创 C语言 - getchar() 的缓冲区问题,不推荐使用fflush(stdin);

C 标准不支持,它的行为是未定义的(UB)。Windows(MSVC)可以工作,但Linux/macOS(GCC)不保证正确行为。

2025-03-21 09:04:15 528

原创 C语言 - getchar() 和 getch() 的区别

getchar():标准输入函数,需要按 Enter有回显有缓冲跨平台。getch()立即读取字符无回显无缓冲仅 Windows(Linux 需特殊处理)。如果你希望即时读取字符(如游戏、键盘监听),用 getch()。如果你希望用户输入完整内容(如普通文本输入),用 getchar()。(完)

2025-03-21 09:03:01 1259

原创 数据结构 - 应用头插法&尾插法创建单向链表(C语言简洁版,附超详细注释)

在链表的创建过程中,常见的插入方法有和:每次插入新节点时,都将其插入到链表的头部,使新节点成为新的头节点。此方法适用于需要逆序存储数据的情况,效率较高。:每次插入新节点时,都将其插入到链表的尾部。适用于保持数据顺序的情况,但在单向链表中,每次插入新节点都需要遍历到链表尾部,效率相对较低。

2025-03-20 09:33:57 811

原创 数据结构 - 链表简介

链表(Linked List)是一种常见的线性数据结构,它由一组节点(Node)构成,节点是通过指针连接在一起的。与数组不同,链表的元素在内存中不需要是连续存储的,因此它在插入和删除元素时比数组更灵活。节点(Node):链表的每个元素都被称为一个节点。每个节点至少包含两部分:头节点(Head):链表的起始节点,通常用来标记链表的开始位置。如果链表为空,则头节点为。尾节点(Tail):链表的最后一个节点,通常指向,表示链表的结束。链表可以有不同的变种,常见的有:单链表(Singly Linked List):

2025-03-19 14:36:42 1175

空空如也

空空如也

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

TA关注的人

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