自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从像素点亮到时序控制:i.MX6U 驱动 LCD 的完整流程

i.MX6U 驱动 LCD 的核心是理解像素点亮逻辑硬件连接和时序控制这三点。从硬件上通过 eLCDIF 并行传输数据,到软件上精准配置时序参数,每一步都直接影响着画面的稳定性和显示效果。

2026-01-27 17:39:57 444

原创 ADC 的原理与实战

ADC 是连接物理世界和数字系统的关键纽带。理解它的原理,掌握选型和实战技巧,能让你在嵌入式开发中更游刃有余。

2026-01-27 17:38:06 348

原创 嵌入式 I2C 通信全解析:从硬件原理到驱动实现

I2C 的通信完全由时序信号控制,掌握起始 / 停止信号、数据传输、应答机制是解析协议的核心。START(起始信号):当 SCL 为高电平时,SDA 产生一个下降沿,表示通信开始。STOP(停止信号):当 SCL 为高电平时,SDA 产生一个上升沿,表示通信结束。数据传输:在 SCL 为低电平时,发送方可以改变 SDA 电平;在 SCL 为高电平时,SDA 电平必须保持稳定,接收方此时采样数据。应答(ACK/NACK):接收方在接收到 1 字节数据后,在第 9 个时钟周期内拉低 SDA 表示。

2026-01-25 19:49:55 785

原创 嵌入式 UART 串口开发实战:IMX6ULL 底层驱动实现与 stdio 移植

基础是关键:掌握异步 / 同步、串行 / 并行、全双工 / 半双工及 TTL/RS232/RS485 电平标准,理解 UART 的通信本质;寄存器是核心:熟悉 IMX6ULL UART 的 8 类核心寄存器,尤其是 UCR2(功能配置)、USR2(状态检测)和波特率计算公式,按正确顺序完成配置;移植提效率:通过重定向底层 IO 接口,将标准 stdio 库移植到 UART 驱动,实现 printf/scanf 的格式化输入输出,大幅提升开发和调试效率。

2026-01-25 19:19:24 821

原创 嵌入式定时器核心解析:51 单片机 / IMX6ULL (EPIT/GPT) 原理与实战

时钟 (Clock):电子系统的 “心跳”,由专用电路产生的稳定、周期性振荡信号,为所有数字电路操作提供同步时序基准,如同节拍器一般规范电路运行节奏。实时时钟 (RTC):微处理器的独立计时模块,自带备用电源接口,系统主电源关闭时仍能持续工作,专门提供精确的日历和时间信息(年 / 月 / 日 / 时 / 分 / 秒),与普通定时器的 “短时间计数” 功能形成互补。定时器 (EPIT/GPT/51 定时器)

2026-01-25 19:14:18 920

原创 IMX6ULL 裸机开发进阶:按键驱动(轮询→中断)+ 中断控制器 GIC 实战

轮询 vs 中断:轮询简单但实时性差,适合低要求场景;中断无漏检、实时性高,是工业级场景的首选;GIC 核心:IMX6ULL 的中断需经过 GIC 分发器→CPU 接口,才能被 Cortex-A7 响应,需重点配置中断使能、优先级、CPU 目标;CP15 操作:协处理器 CP15 的 SCTLR(向量表)、VBAR(向量基地址)、CBAR(GIC 基地址)是中断配置的关键;代码封装。

2026-01-21 18:11:21 799

原创 进阶 IMX6ULL 裸机开发:从 C 语言点灯到 BSP 工程化(附 SDK / 链接脚本实战)

直接通过地址映射定义寄存器,直观但冗余:c运行// CCM时钟寄存器// GPIO1_IO03相关寄存器volatile 关键字是 C 语言操作外设的必备项,防止编译器优化导致寄存器读写失效;SDK 复用无需完整安装,仅拷贝头文件即可简化寄存器定义,提升开发效率;BSP 工程结构是嵌入式开发的标准范式,将外设驱动模块化(led/beep),便于维护和扩展;链接脚本控制程序内存布局,启动代码需初始化.bss段为 0,否则未初始化全局变量会出错;

2026-01-20 18:11:44 859

原创 实战 IMX6ULL 裸机开发:用汇编点亮 LED 灯(从环境搭建到代码运行)

IMX6ULL 裸机开发核心是外设寄存器操作,需先通过手册确认寄存器地址和配置值;汇编控制 LED 的关键步骤:引脚复用→电气特性→方向配置→电平控制,配合延时实现闪烁;开发流程:代码编写→交叉编译→SD 卡烧写→开发板测试,Makefile 可大幅简化编译操作。

2026-01-20 14:02:16 926 2

原创 ARM 汇编核心实战:从指令到启动代码,搭建 C 语言运行环境

ARM 汇编学习的核心目标是编写启动代码,无需掌握所有指令,聚焦初始化 C 语言运行环境的核心指令即可;启动代码的核心逻辑:初始化栈→保护现场→切换工作模式→调用 C 主函数,核心指令为 MOV/LDR/STMFD/LDMFD/MRS/MSR;12 位立即数、栈 8 字节对齐、寄存器传参规则是嵌入式汇编的高频坑点,需重点掌握。

2026-01-20 13:50:37 720

原创 ARM 学习笔记:从入门到理解嵌入式系统核心

嵌入式系统是以,以计算机技术为基础,软硬件可裁剪的专用计算机系统。它的设计目标是满足特定场景下的功能、可靠性、成本、体积和功耗要求。我用的开发板是正点原子的iMX6ULL,它的核心是 ARM Cortex-A7 架构,属于典型的嵌入式开发平台。

2026-01-20 13:44:53 558

原创 深入理解DS18B20温度采集:从原理到时序全解析

DS18B20的温度采集核心在于“理解参数+掌握时序”:首先明确传感器的参数指标,确保适配项目需求;其次掌握串口通信的基础概念,理解单总线的通信本质;最后精准把控复位、写、读三种核心时序,严格遵循温度采集流程,就能顺利实现温度数据的采集。

2026-01-15 17:08:13 720

原创 51单片机UART串口通信全解析:从概念到寄存器配置

UART作为51单片机最核心的通信接口,核心在于“异步、全双工、串行”的通信特性,而掌握“交叉接线”“一致的通信参数”“正确的寄存器配置”是实现稳定通信的关键。从概念到实操,重点要理清:通信方式、数据传输规则、校验机制、核心参数,再通过配置SCON和PCON寄存器、计算定时器初值,就能让UART正常工作。

2026-01-14 17:33:54 1039

原创 51单片机核心外设知识点总结:GPIO、按键、中断、定时器与PWM

GPIO,全称General Purpose Input Output,即通用输入输出,是单片机与外界进行数据交互的最基本形式。每个GPIO引脚都可以独立配置为输入模式或输出模式,满足不同场景的使用需求。

2026-01-13 17:32:10 799

原创 51 单片机入门详解:从基础概念到实战开发

51 单片机作为嵌入式开发的入门利器,其核心在于理解 “硬件与软件的结合”—— 从基础的概念辨析,到硬件引脚的控制,再到程序的编写、编译、下载和调试,每一个步骤都需要我们动手实践、不断总结。本文从基础到实战,覆盖了 51 单片机入门的核心知识点,新手可以按照本文的流程,先实现 LED 点亮,再进阶到数码管显示,逐步积累嵌入式开发的经验。随着学习的深入,我们还可以接触到中断、定时器、串口通信等更复杂的功能,为后续学习 STM32、Linux 嵌入式等高端平台打下坚实的基础。

2026-01-12 22:24:33 1455

原创 HTML 基础 + SQLite3 数据交互

嵌入式 Web 开发的核心是 “轻量、实用”:HTML 层面掌握表单、超链接、图片即可满足大部分场景,无需过度追求样式;数据交互层面,SQLite3 凭借轻量、无需安装的特性,是嵌入式 Web 服务的最佳数据库选择。结合本文的 HTML 基础和 SQLite3 交互示例,可快速实现嵌入式设备的 Web 登录、参数配置、状态展示等核心功能,适配智能家居、工业控制、物联网网关等各类嵌入式场景。

2025-12-30 22:21:37 645

原创 SQLite3 数据库

SQLite3 以轻量、易用、跨平台的特性,成为嵌入式开发中数据管理的最优解。掌握其基础指令、SQL 语句及 C 语言编程接口,可快速实现嵌入式设备的海量数据存储与管理。无论是智能家居、工业控制还是物联网设备,SQLite3 都能以极小的资源开销,满足数据增删改查的核心需求。

2025-12-29 21:28:18 686

原创 理解 Linux IO 多路复用

IO 多路复用是 Linux 高并发网络编程的基石,select 作为经典实现,兼容度高但性能受限;epoll 则凭借事件驱动、零拷贝、无 fd 数量限制等优势,成为高性能服务器的首选方案。在实际开发中,需根据业务场景选择合适的 IO 模型:低并发场景可使用 select 快速实现,高并发场景则优先使用 epoll,充分发挥服务器的性能潜力。

2025-12-28 13:46:35 897

原创 进程间通信(IPC):管道通信全解析

无名管道(也叫匿名管道)是仅支持有亲缘关系进程(父子 / 兄弟进程)通信的半双工管道,无文件名称,文件系统不可见,生命周期随进程结束而销毁。有名管道(FIFO)解决了无名管道 “仅亲缘进程通信” 的限制,支持任意单机进程通信,底层队列结构与无名管道一致,最大区别是 “文件系统可见”(有明确的路径和名称)。

2025-12-27 12:40:38 834

原创 TCP 协议:从核心特性到套接字编程实战

TCP 是面向连接、可靠的传输层协议,核心优势是数据无丢失、有序交付,适合对可靠性要求高的场景(文件传输、登录认证、金融交易);CS/BS/P2P 是 TCP 的核心应用模型,其中 CS 灵活性高、BS 轻量化、P2P 去中心化;TCP 编程的核心是区分「监听套接字」和「通信套接字」,掌握三次握手 / 四次挥手的底层逻辑,同时注意处理黏包、连接断开等问题;

2025-12-24 18:33:21 749

原创 OSI 模型到 UDP 套接字

网络编程的核心是理解分层模型:OSI 是理论,TCP/IP 是实际应用,重点掌握应用层 / 传输层 / 网络层的核心协议;UDP 适合低延迟、实时性要求高的场景,核心是「无连接、数据报有边界、收发次数对应」;套接字编程的关键:正确转换字节序、绑定地址(服务端)、用实际字节数收发数据(尤其二进制文件)。

2025-12-23 18:49:49 927 1

原创 【Linux 进程间通信】信号通信与共享内存核心解析

c运行// 函数原型(简化版)功能:注册信号处理函数,自定义信号的处理行为;参数signum:要捕获的信号编号;handler:信号处理方式,支持 3 种:SIG_DFL:使用系统默认处理行为;SIG_IGN:忽略该信号;自定义函数:如,接收信号编号作为参数;返回值:成功返回原信号处理函数地址,失败返回SIG_ERR。示例:自定义 SIGCONT 信号的处理函数c运行printf("捕获到信号%d,进程被唤醒\n", num);// 注册信号处理函数信号通信。

2025-12-19 18:48:55 722

原创 Linux 线程控制核心:互斥锁与信号量(同步)

有先后顺序的排他性访问」—— 不仅要保证同一时刻一个资源被一个线程访问,还要强制线程按照指定顺序执行(如线程 A 执行完后,线程 B 才能执行)。因锁资源的申请 / 释放逻辑错误,导致线程 / 进程永久阻塞,无法继续执行的现象。互斥锁:解决「单一资源的排他访问」,临界区必须短小,加解锁同线程;信号量:解决「多资源竞争 / 线程同步」,支持交叉释放,临界区可适度耗时;死锁规避:打破四个必要条件中的任意一个(如统一锁申请顺序)即可;选型原则:单一资源排他访问 → 互斥锁;

2025-12-17 17:48:41 667

原创 Linux 线程(POSIX)核心教程

Linux 中,线程被称为 “轻量级进程(LWP,Light Weight Process)”,—— 一个进程可以包含多个线程,所有线程共享进程的资源(如内存空间、文件描述符、信号处理等),同时拥有独立的执行流。

2025-12-16 18:17:57 885

原创 Linux 进程控制核心:exec 族函数、waitpid 与 system 全解析

exec 族:程序替换核心,fork+exec 是 Linux 进程编程的经典组合,exec 成功则进程被替换,失败才返回;waitpid:子进程资源回收的唯一方式,阻塞 / 非阻塞模式适配不同场景,避免僵尸进程;system:便捷但受限,无法修改父进程状态,底层是 fork+exec+waitpid;路径控制:getcwd 获取当前路径,chdir 修改路径(仅影响当前进程);核心原则。

2025-12-16 09:00:39 981

原创 【Linux 进程核心】父子进程关系、终止与资源回收

父进程创建子进程后,子进程先终止子进程的用户空间内存被释放,不再参与 CPU 调度;内核中的 PCB(进程控制块)未释放(保留退出状态、PID 等信息);子进程状态变为 Z(Zombie),成为 “僵尸进程”。父进程创建子进程后,父进程先终止子进程失去父进程,会被内核指定的 “新父进程” 接管(通常是 init 进程 / PID=1,或 systemd/PID=1);子进程正常运行,终止后由新父进程回收资源。父子进程内存。

2025-12-13 14:07:16 543

原创 【Linux 系统编程核心】进程的本质、管理与核心操作

进程是程序的动态执行过程,由 PCB 管理,占用系统资源,支持并发;虚拟内存为进程提供隔离性和安全性,上下文切换是实现并发的核心机制;Linux 通过 CFS 等调度算法分配 CPU 时间片,实现 “宏观并行、微观串行”;fork()是创建进程的核心函数,父子进程独立运行,返回值是区分二者的关键;pstopkill是进程管理的常用命令,getpid()getppid()是获取进程 ID 的核心函数。

2025-12-11 18:49:42 663 1

原创 【Linux 系统编程】文件 IO 与 Makefile 核心实战:从系统调用到工程编译

类型本质核心特征适用场景文件 IO操作系统对外提供的系统调用函数无缓冲区、文件描述符(int)、功能强大设备文件(如/dev下设备)、实时性要求高的场景标准 IOC 标准库封装的文件操作函数带缓冲区、文件流指针(FILE*)、跨平台普通文件(文本 / 二进制)、通用文件操作通过自定义变量适配不同工程,可灵活修改源文件、目标名、编译选项:makefile# 自定义变量:源文件、目标名、编译选项SRC += func.c # 追加源文件FLAG = -g # 编译调试信息。

2025-12-11 18:49:09 597

原创 Linux 系统编程之标准 IO 文件操作全解析

argc:命令行参数的总个数(包含程序名本身)argv:字符串数组,存储每个参数的内容(argv[0] 是程序名,argv[1] 及以后是用户传递的参数)#include >// 定义结构体(二进制数据示例)int age;} Student;int main()// 1. 写入结构体数据// wb:二进制只写\n");return -1;// 写入 1 个 Student 大小的数据fclose(fp);// 2. 读取结构体数据// rb:二进制只读\n")

2025-12-10 14:32:19 928

原创 【Linux 系统编程】文件操作核心知识点:标准 IO 与文件基础

先通过fopen打开文件并指定操作模式,再根据场景选择字符级(fputc/fgetc)、行级(fputs/fgets)或块级(fread/fwrite)读写,最后通过fclose释放资源;理解 Linux 文件类型和 man 手册的用法,是解决文件操作问题的关键;命令行参数则是扩展文件操作程序灵活性的基础(如指定待操作的文件路径)。掌握这些知识点,即可覆盖绝大多数文本 / 二进制文件的读写场景,也是后续学习高级文件操作(如系统调用)的基础。

2025-12-08 18:18:04 776

原创 【数据结构核心篇】树与哈希(Hash)的原理、特性及实战应用

存储位置 =f(key)f:哈希函数(散列函数),负责将 key 转换为数组下标;key:待存储 / 查询的数据;存储位置:数组中存储该数据的地址(下标)。核心载体:通常基于顺序表(数组)实现(需支持随机访问)。但:不同数据通过哈希函数计算出相同的存储位置。c运行// 哈希表结构(数组实现)// 哈希表数组指针int tlen;// 哈希表总长度} HS_TABLE;// 核心操作函数// 创建哈希表// 插入数据// 查询数据// 销毁哈希表树。

2025-12-06 11:59:12 931

原创 【数据结构详解】栈与队列的核心原理、实现及应用场景

定义:队列是只允许在一端(队尾)插入、另一端(队头)删除的线性表。核心特性:先进先出(FIFO)。关键术语队头(Head):允许删除的一端;队尾(Tail):允许插入的一端;入队(EnQueue):向队尾添加元素;出队(DeQueue):从队头移除元素。核心应用:解决 “速度不匹配” 问题(如缓冲区、消息队列、任务调度)。c运行// 自定义数据类型// 队列数组指针int tlen;// 队列总容量int head;// 队头指针int tail;// 队尾指针。

2025-12-05 12:20:43 761

原创 双向链表的完整实现与应用详解

c运行// 业务数据类型(以学生信息为例)// 姓名char sex;// 性别int age;// 年龄int score;// 分数} DATATYPE;// 双向链表节点结构// 节点存储的业务数据// 前驱节点指针// 后继节点指针// 双向链表管理结构(带头节点)// 头节点指针(不存储业务数据)int clen;// 链表有效节点数// 遍历方向枚举SHOW_FORWARD, // 正向遍历(头→尾)SHOW_BACKWARD // 反向遍历(尾→头)

2025-12-05 12:16:58 375

原创 嵌入式开发必备:GDB 调试从入门到精通

断点策略:在关键函数入口、循环开始处、可疑代码前设置断点单步调试:用s进入自定义函数,n快速跳过库函数数据监控:善用display跟踪关键变量变化调用栈分析:遇到崩溃先用where定位问题位置条件断点:可结合b 行号 if 条件设置条件断点(进阶技巧)

2025-12-02 18:26:17 212

原创 单向链表:线性表的链式存储实现与应用

链表的基本单元是节点(Node)数据域:存储数据元素本身;指针域:存储下一个节点的地址,维系链表的逻辑关系。c运行// 通用数据类型定义char sex;int age;int score;} DATATYPE;// 链表节点结构// 数据域// 指针域(指向下一个节点)} LinkNode;为了方便管理链表,通常封装一个链表头结构,包含链表的核心信息:c运行// 指向链表头节点int clen;// 当前节点个数} LinkList;

2025-12-01 18:13:00 299

原创 数据结构基础:从概念到线性表的实现

线性表是零个或多个数据元素的有限序列,数据元素间呈一对一关系。由于数据量通常较大,线性表的内存一般分配在堆空间(生命周期由程序员控制,需手动 malloc/free)。顺序表是线性表的顺序存储实现,结构如下:c运行// 指向堆空间的数组首地址int tlen;// 总容量int clen;// 当前元素个数} SeqList;

2025-11-28 17:46:54 276

原创 C 语言进阶:共用体、枚举与位运算

c运行union 类型名 {数据类型 成员变量1;数据类型 成员变量2;数据类型 成员变量3;// ...// 示例int a;// 假设占4字节char c;// 假设占1字节float f;// 假设占4字节核心特征:内存共享:共用体的所有成员变量共享同一块内存。修改一个成员,会影响到其他成员的值(因为它们指向同一个内存地址)。大小取决于最大成员:共用体所占的内存大小等于其最大成员变量的大小。在上面的例子中,union DATA的大小是或,通常为 4 字节。c运行。

2025-11-25 17:32:40 323

原创 详解 C 语言 void * 万能指针与结构体核心用法

结构体用于封装多个不同类型的变量,形成自定义复合类型,定义格式:c运行struct 结构体名 {数据类型 成员变量1;数据类型 成员变量2;// 更多成员变量void*是通用指针,核心解决不同类型指针的统一处理,转换时需遵循 “任意→void* 直接转,void*→任意 强制转” 的规则,解引用前必须指定具体类型;结构体是 C 语言封装复合数据的核心方式,初始化支持完全 / 部分赋值,成员访问依赖->运算符,内存布局遵循字节对齐规则;结构体数组传参优先使用地址传递,结合void*

2025-11-24 18:48:47 985

原创 C 语言进阶】彻底搞懂指针数组与数组指针

c运行数据类型 *数组名[数组长度];比如:c运行// 指针数组:包含5个int*类型指针的数组int *a[5];// 指针数组:包含5个char*类型指针的数组(常用于存字符串)char *b[5];c运行数据类型 (*指针名)[数组长度];注意:括号不能省略!否则会被解析成 “指针数组”。比如:c运行// 数组指针:指向包含3个int元素的数组// 数组指针:指向包含100个char元素的数组(常用于二维数组传参)维度指针数组数组指针本质数组(存指针)

2025-11-21 22:19:56 624

原创 C 语言核心进阶:指针函数、函数指针与 const 指针

函数指针的核心是一个指针,只是这个指针不指向普通数据(int、char),而是指向一段函数代码的入口地址。C 语言中,函数名本身就是函数的入口地址(类似数组名是数组首地址),因此函数指针可直接指向函数名。c运行// 返回值类型 (*指针变量名)(参数类型列表)// 定义一个函数指针op,指向“返回int、参数为两个int”的函数是函数指针,是指针函数(优先级问题)。函数指针的 “参数类型列表” 必须与指向的函数完全匹配(返回值类型也需匹配)。函数指针的语法较繁琐,可通过typedef。

2025-11-20 19:06:26 596

原创 C 语言指针与数组深度解析:从函数传参到字符串操作

指针与数组是 C 语言的灵魂,理解它们的工作机制对于编写高效、简洁的代码至关重要。值传递与地址传递的选择取决于是否需要修改实参;数组名作为指针常量的特性简化了数组操作,但也需注意与指针变量的区别;而字符串函数的实现则充分体现了指针在字符处理中的灵活性。

2025-11-19 18:33:18 378

空空如也

空空如也

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

TA关注的人

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