自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 以太网帧格式、IP数据报头部、TCP头部、UDP头部

以太网MAC帧格式。

2025-11-05 15:39:07 323

原创 DHT11温湿度传感器Linux驱动开发完整流程

类型:温湿度复合传感器通信协议:单总线异步半双工通信引脚配置:VCC、DATA、GND三线制通信方式单总线(Single Bus)——仅需1根数据线(除VCC、GND外)精度指标温度精度:±2℃湿度精度:±5%RH分辨率:1协议理解:严格遵循DHT11单总线时序规范驱动架构:采用platform_driver + miscdevice标准框架资源管理:通过设备树获取GPIO,确保可移植性鲁棒性设计:超时机制+错误码返回+用户层校验性能考虑:最小化内核态操作,数据快速传递到用户空间。

2025-10-28 19:51:19 613

原创 Linux 文件系统-目录操作,文件属性、软硬链接的定义与使用,系统级与文件级的操作上限

宏定义含义对应 ls -l 显示字符S_IFSOCK套接字sS_IFLNK符号链接lS_IFREG普通文件S_IFBLK块设备文件bS_IFDIR目录dS_IFCHR字符设备文件cS_IFIFO命名管道p权限类别宏定义说明所有者S_IRUSR所有者读权限S_IWUSR所有者写权限S_IXUSR所有者执行权限所属组S_IRGRP所属组读权限S_IWGRP所属组写权限S_IXGRP所属组执行权限其他用户S_IROTH。

2025-10-25 17:03:59 797 1

原创 Linux I²C 总线驱动开发:从架构到实战的完整指南

Linux I²C 驱动开发的核心是理解 “分层分离” 的架构思想,遵循 “硬件验证→设备树声明→驱动编写→测试调试” 的流程。开发者无需重复实现底层总线逻辑,只需聚焦于设备的特定功能,通过内核提供的 API 即可快速完成驱动开发。记住一个核心原则:“先通逻辑,再写驱动;硬件问题优先排查在实际开发中,善用调试工具,遵循最佳实践,就能高效解决各类问题,开发出稳定可靠的 I²C 设备驱动。

2025-10-22 10:54:50 969 1

原创 “硬件上电” 到 “用户能操作系统” 的完整流程

三者协同,完成从 “硬件上电” 到 “用户能操作系统” 的完整流程。

2025-10-10 19:21:51 411

原创 ADC (Analog-to-Digital Converter) 模数转换器详解

ADC 是连接物理世界和数字系统的关键接口。它通过采样、保持、量化和编码四个步骤,将连续的模拟电压信号转换为离散的数字信号。其性能主要由分辨率(决定精度)和采样频率(决定对快速变化信号的响应能力)等参数决定。理解 ADC 的工作原理及其关键参数,对于正确使用和设计基于微控制器的嵌入式系统至关重要。

2025-09-29 19:50:33 819

原创 I2C总线详解

I2C(Inter-Integrated Circuit)总线是由飞利浦半导体(现恩智浦NXP)在1980年代开发的一种。

2025-09-28 21:33:43 1141

原创 嵌入式通信基础知识整理(基于 IMX6ULL 处理器)、UART串口通信

并行通信:内部 AHB/APB 总线实现高速内部交互,外部 EIM/LCD 接口满足高带宽外设需求;串行通信:UART 用于调试与低速外设,I2C/SPI/QSPI 用于传感器、存储等外设的中高速连接;同步 / 异步:异步 UART 简化调试接口,同步 SPI/I2C 提升外设数据传输效率;电气标准:内部默认 TTL 电平,对外可通过电平转换芯片(如 MAX232 转 RS-232,SN65HVD485 转 RS-485)适配不同工业场景的通信需求。

2025-09-28 15:20:13 899

原创 IMX6ULL时钟系统与定时器(EPIT/GPT)

切换时钟源到OSC(安全操作)配置PLL倍频系数配置分频器得到目标频率配置PFD分频系数设置各时钟根(AHB、IPG、PERCLK)使能外设时钟门控。

2025-09-26 10:32:31 855

原创 嵌入式开发基础:链接脚本、编译工具与 LED 点灯原理

总结:LED 点灯的本质是 **“使能时钟→配置引脚功能→设置输出模式→控制电平”**,通过操作芯片寄存器实现硬件控制。以 IMX6ULL 芯片为例,LED 点灯程序的核心是。链接脚本(Linker Script)是。

2025-09-24 21:55:31 987

原创 ARM 架构与嵌入式系统

ARM 系统将外设寄存器、RAM、Flash 等都映射到同一个地址空间,CPU 通过不同的地址来区分访问的是哪种资源,所以操作外设寄存器时,看起来像在操作普通内存地址。这张表完整呈现了 ARM 处理器 “从异常触发→进入异常处理→恢复正常执行” 的全流程,以及异常向量表的地址分配逻辑,是理解 ARM 异常机制的核心内容。ARM 属于 RISC 架构,其低功耗、低成本和高性能的优势,使其广泛应用于移动设备、物联网设备等嵌入式领域。,是为安全扩展的、用于执行安全监控代码的特权模式;ARM 处理器工作模式。

2025-09-20 10:32:47 950

原创 SQLite 数据库核心知识与 C 语言编程

- 方式1:默认字段类型为TEXT-- 方式2:指定字段类型(推荐)id INT, -- 整数类型name TEXT, -- 文本类型age INT, -- 整数类型dt DATETIME -- 时间类型INT(整数)、TEXT(文本)、REAL(浮点数)、BLOB(二进制)若不指定类型,默认按TEXT处理回调函数用于处理// 回调函数:逐行处理查询结果void *NotUsed, // 用户自定义参数(由sqlite3_exec的arg传入)int argc, // 结果列数。

2025-09-09 21:28:10 647

原创 I/O 多路复用 (I/O Multiplexing)

I/O 多路复用是指单线程或单进程能够同时监测多个文件描述符(File Descriptor, FD),并判断哪些描述符已经就绪、可以执行I/O操作的能力。本质:用更少的系统资源(避免线程/进程创建开销、上下文切换成本、资源竞争)完成更多事件流的并发处理。

2025-09-06 22:04:42 1230

原创 网络通信与协议栈 -- TCP协议与编程

TCP(Transmission Control Protocol,传输控制协议)是传输层 “面向连接、可靠传输” 的核心协议,通过三次握手建立连接、四次挥手关闭连接,配合确认重传、流量控制、拥塞控制机制,保障数据有序、不丢失、不重复传输,适用于对可靠性要求高的场景(如网页浏览、文件传输、即时通信)。以下从协议特性、通信框架、编程流程到代码示例,系统梳理 TCP 编程核心内容。

2025-09-03 23:42:12 750

原创 网络通信与协议栈 -- OSI,TCP/IP模型,协议族,UDP编程

网络通信的核心是实现,其技术体系围绕 “协议分层模型” 展开,向下依赖硬件介质传输电 / 光信号,向上支撑各类网络应用(如网页浏览、文件传输)。本文结合 OSI 理论框架与 TCP/IP 工业标准,从模型、协议、地址、配置、编程到架构,系统梳理网络通信核心知识。

2025-09-03 22:50:58 1196 1

原创 进程间通信IPC(interprocess communicate)

父进程打印 i is 0 到 i is 63 后阻塞(64次×1024=64KB),第64次写入后继续打印 i is 64。当写端程序运行后,读端打印:fifo: hello, this is fifo tested...收到 SIGUSR2 信号时打印"老妈叫你",第5次后恢复默认处理(终止进程)子进程阻塞3秒后,打印:child, buf:hello,child。成功向指定进程发送信号(无输出),目标进程按信号类型执行相应操作。等待3秒后写入数据到管道(无直接输出,需配合读端程序)。

2025-08-31 16:08:01 1083

原创 Linux系统 -- 多线程的控制(互斥与同步)

声明一个// 定义互斥锁声明一个sem_tsem_t sem;// 定义无名信号量互斥锁是 “排他工具”,解决 “多线程抢资源” 的问题,确保临界资源的独占访问。信号量是 “有序工具”,解决 “多线程按顺序执行” 的问题,在互斥基础上实现同步。死锁是多线程编程的常见陷阱,需通过 “破坏必要条件” 或 “使用非阻塞操作” 避免。实际开发中,需根据场景选择工具:仅需排他用互斥锁,需顺序控制用信号量;同时注意临界区最小化、资源申请顺序统一,减少死锁风险。

2025-08-28 23:54:47 1077

原创 Linux系统 -- 线程(pthread)核心知识整理

线程是,是进程内部的多个并发执行任务,共享进程的大部分资源(如地址空间、文件描述符),仅拥有私有执行上下文(寄存器、栈、程序计数器)。

2025-08-27 21:36:06 767

原创 Linux系统 -- 进程 (Process) 核心知识整理

是程序的一次执行过程。它是操作系统进行的基本独立单位。:程序是存储在硬盘上的静态代码和数据的集合(如a.out文件),而进程是这个程序被加载到内存中并正在运行的动态实体。:进程运行时,系统会为其分配必要的资源,如CPU时间、内存、I/O设备等。操作系统为每个进程维护一个数据结构,称为,用于描述进程的全部信息和状态。在Linux中,PCB的具体实现是结构体。:唯一标识一个进程的数字。:创建该进程的父进程的PID。:进程当前操作的目录路径(可通过chdir设置,pwd查看)。:记录该进程打开的所有文件的信息。

2025-08-27 00:08:35 814

原创 数据结构 -- 哈希表和内核链表

一种支持高效存储与查找的数据结构,目标查找复杂度为 O(1)∼O(lgN) ,通过哈希函数映射数据到存储位置,平衡存储与查询效率。

2025-08-23 17:05:37 494

原创 数据结构 -- 树

树是由n(n ≥ 0)当n = 0时,称为空树;当n > 0时,存在唯一的根结点(无前驱结点),其余结点可划分为m(m ≥ 0)个互不相交的有限子集,每个子集都是一棵独立的子树。二叉树是n(n ≥ 0)当n = 0时,为空二叉树;当n > 0时,由根结点左子树和右子树组成,且左、右子树互不相交,均为二叉树。

2025-08-23 00:04:39 1049

原创 数据结构 -- 队列

队列是受限线性表,仅允许在一端(队尾)插入元素、另一端(队头)删除元素,遵循“先进先出(FIFO,First In First Out)”原则。

2025-08-22 14:19:16 481

原创 数据结构 -- 栈

栈是一种受限线性表,仅允许在表的一端(栈顶)进行插入(入栈)、删除(出栈)操作,遵循“先进后出(LIFO,Last In First Out)”原则。

2025-08-22 11:39:43 582

原创 数据结构 -- 链表--双向链表的特点、操作函数

需要反向遍历链表(例如,从大到小输出一个有序链表)时,双向链表非常高效。:同样,在已知某个节点指针的情况下,双向链表可以在 O(1) 时间内完成在其前面的插入操作。:每个节点都需要一个额外的指针来存储前驱节点的地址。对于节点数据本身很小的链表(例如,只存储一个整数),这个额外的指针开销占比会很大。双向链表(Doubly Linked List)是一种更复杂的链表,它的每个节点不仅包含指向下一个节点的指针(:在已知某个节点指针的情况下,双向链表可以在 O(1) 时间内删除该节点,因为它可以直接通过。

2025-08-21 18:35:25 316

原创 数据结构 -- 链表--单向链表的特点、操作函数

的基本概念:它是一种 “一对一” 的有序数据结构,比如排队的人、一串数字(1,2,3,4),每个元素(除了第一个和最后一个)都有唯一的前一个和后一个元素。链表没有下标,想访问第 n 个元素,必须从第一个节点开始,顺着指针一个个往后找(像 “顺着钩子找珠子”),所以找元素比数组慢。链表中插入元素,只需要改两个指针:新节点的指针指向 “下一个节点”,前一个节点的指针指向 “新节点”,其他元素不用动。(删除同理,只需要把前一个节点的指针跳过要删的节点,指向它的下一个节点就行),而是指向第一个节点,形成一个环。

2025-08-19 17:55:16 882

原创 数据结构 -- 顺序表的特点、操作函数

【代码】数据结构 -- 顺序表操作函数。

2025-08-19 00:24:20 289

原创 数据结构与算法核心知识整理

解决问题的 “清晰步骤清单”,类似 “菜谱步骤”“路线规划”,与数据结构配合:数据结构负责 “存数据”,算法负责 “用数据解决问题”。

2025-08-18 10:46:20 468

原创 Linux系统 -- 文件编程(文件IO-系统调用)标准IO VS 文件IO

注:umask 是进程属性,用于屏蔽不需要的权限,可通过。类型),而标准库函数使用 FILE 指针(系统调用使用文件描述符(

2025-08-17 18:10:28 534

原创 linux系统-- 文件编程(C库函数-标准IO)

C 语言文件操作遵循 "打开→读写→关闭" 的基本流程,核心依赖标准库。流打开函数 ,打开 pathname指定的文件,并 关联一个流。不适合二进制文件(如图片、视频),因为二进制文件中可能包含。适合处理二进制文件或固定结构的数据(如结构体),不依赖。实现内存与外部存储(如硬盘文件)的数据交互。:流指针 ,关联到这个流上 ,代表这个流。:内存与外部文件之间的 "数据通道",的作用是创建该通道并关联到指定文件。:检查是否到达文件结尾。打印错误信息(需包含。:检查流是否发生错误。

2025-08-12 22:39:30 720

原创 Linux 系统编程与 Shell 脚本核心知识点总结

核心作用作为用户与操作系统内核的交互接口,解析并执行用户输入的命令运行用户程序(通过调用系统接口),隔离用户操作与内核,保护操作系统安全支持批量命令执行(脚本化),提升操作效率定义规则变量名 = 值(等号两侧无空格,区分大小写)无需声明类型(弱类型,默认字符串,可自动转换为数值)操作bashname="Alice" # 定义变量echo $name # 引用变量($不可省略)unset name # 删除变量# 只读变量(无法修改或删除)

2025-08-12 19:00:31 601

原创 C语言 -- 位运算

进行操作的运算方式,在嵌入式开发中常用于硬件寄存器控制(如 GPIO 配置、状态位读写等),具有执行效率高、操作精准的特点。为反掩码,仅第 n 位为 0,其余为 1)。为掩码,仅第 n 位为 1,其余为 0)。用于生成 "反掩码",配合 & 实现清零。其他位",需配合掩码(mask)使用。循环左移:左移后溢出的高位补到低位。(非 0 则第 n 位为 1)。需要的位,保留其他位"。用于 "保留需要的位,位运算是直接对整数的。

2025-08-11 20:12:50 367

原创 C语言 -- 结构体,共用体,枚举

语法struct 结构体名 {成员类型1 成员名1;// 成员可以是基本类型、数组、指针甚至其他结构体成员类型2 成员名2;...// 必须带分号示例:描述学生信息int sno;// 学号(整数)// 姓名(字符串)char sex;// 性别(字符)// 成绩(浮点型)// 必须带分号定义方式说明示例先定义类型,再定义变量最常用,类型可重复使用定义类型时直接定义变量一次性定义类型和变量匿名结构体(无类型名)仅能在定义时创建变量,类型无法复用char b;} temp;语法。

2025-08-08 21:53:18 610

原创 C语言 -- 指针(快速排序,指针与数组,const修饰指针,基于指针的字符串处理函数的实现)

修饰指针时需区分 “修饰基类型” 和 “修饰指针本身”,遵循。:结果为两个指针之间相差的 “基类型元素个数”(整型)。:指针地址增加 “基类型大小”(而非 1 字节)。),指针操作字符串需注意存储区域和可修改性。:逐个比较字符 ASCII 值,返回差值(数组的本质是连续存储空间,指针通过。可用于判断指针是否越界。修改指向的内容,若内容可写)。同时修饰基类型和指针本身,:比较指针指向的地址位置。(指向数组的指针)操作。,可高效操作数组元素。(距离谁近就修饰谁)。本身可指向其他地址)。为负,相等为 0)。

2025-08-07 00:01:49 797

原创 C 语言 -- 指针详解

指针变量用于存储地址,需明确基类型、指针修饰符和变量名。基类型:指针指向的内存空间中存储的数据类型,决定了空间的大小(如 int 为 4 字节)和使用规则。:修饰符,表明定义的是指针变量(非普通变量)。指针变量名:符合标识符命名规则的名称(如 p、ptr 等)。int a = 10;// 定义int型变量a// 定义int*型指针p,用a的地址(&a)初始化,即p指向a定义多个指针变量时,每个变量前都需加// 正确:p1、p2、p3均为int*型指针// 错误写法:int* p1, p2;

2025-08-05 21:38:57 1039

原创 C 语言 -- Linux 编程流程,GCC编译,预处理,多文件编程详解

define。

2025-08-04 21:16:58 831

原创 C 语言 --- 标识符的作用域、可见性及变量生命周期

【代码】C 语言 --- 标识符的作用域、可见性及变量生命周期。

2025-08-04 19:18:38 349

原创 C语言 -- 函数

函数可以直接定义在调用它的代码(如main函数)之前。例如:// 函数定义在调用前// 调用add,此时已定义return 0;若函数定义在调用它的代码之后,必须在调用前进行函数声明(声明函数的返回类型、名称和参数列表)。// 函数声明// 调用前已声明,可正常使用return 0;// 函数定义在调用后总结:函数要么先定义再调用,要么先声明再调用(定义可放在后面)。若未声明且定义在调用后,编译器会报错。

2025-07-31 21:50:19 1074

原创 C语言 -- 二维数组(整型数组,字符型数组)

/二维数组能省略行数,从本质上看,实际上相当于是一维数组的长度被省略 了。//定义了一个 可以包含 3个 int[4]的 一维数组。//a的数据类型 --- int[3][4] --- 二维数组类型。//int[4] --- 整型一维数组类型。二维数组的本质 --- 还是一维数组 ,是“数组的数组”[常量表达式1] //第一维 -- 行。[常量表达式2] //第二维 -- 列。

2025-07-30 23:58:29 305

原创 C语言 --- 字符串处理函数

处理字符串数据的函数(包含在头文件<string.h>中)

2025-07-30 23:32:28 422

原创 C语言 -- 数组(排序,查找)

◦ 示例:数组 [3,1,4,2],第1步插入1:已排序部分 [3],1<3,插入后为 [1,3];第3步插入2:2<4→4后移,2<3→3后移,插入到1后,得 [1,2,3,4]。◦ 示例:数组 [3,1,4,2],第1轮找到最小值1与3交换,得 [1,3,4,2];◦ 示例:数组 [3,1,4,2],第1轮比较后变为 [1,3,2,4](4冒泡到末尾);第3轮无交换,排序完成。◦ 第2轮:从第2个元素开始遍历剩余元素,找到最小值,与第2个元素交换,此时前2个元素为已排序。

2025-07-30 09:23:23 443

空空如也

空空如也

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

TA关注的人

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