自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SQLite 数据库移植到 ARM 开发板:从原理到完整流程

A[PC x86 Ubuntu] -->|sqlite3.c 源码| B[交叉编译C -->|复制| F[/usr/bin/sqlite3]D -->|复制| G[/lib/libsqlite3.so.0]E -->|复制| H[/usr/include/ 可选]F --> I[板子上运行 sqlite3]G --> IH --> I。

2026-10-20 19:13:06 265

原创 嵌入式Linux系统启动与内核驱动开发全解

上电U-Boot引导内核,内核解析设备树生成platform设备;我们写的Platform驱动加载后,内核匹配设备,执行probe,注册misc设备生成/dev节点;用户APP调用open/read/write系统调用进入内核驱动,控制LED/蜂鸣器/按键硬件。驱动本质:内核模块,给用户APP提供访问硬件的接口,硬件信息写到设备树,驱动代码里使用。主动查找DTS节点,读取GPIO。Platform总线分离。

2026-10-10 19:10:17 239

原创 嵌入式Linux驱动实验笔记:IMX6ULL Platform+Misc设备树驱动(Beep+LED+KEY)

本次基于正点原子IMX6ULL开发板,使用platform框架 + miscdevice + 设备树DTS完成字符设备驱动开发。整套代码复用同一套驱动骨架,仅少量修改就可以实现蜂鸣器、LED、按键驱动,掌握一套模板快速开发外设。环境:Ubuntu交叉编译环境,linux-imx-rel_imx_4.1.15_2.1.0_ga内核,nfs根文件系统,minicom串口。mykey0 {⚠坑:不要重复新建pinctrl节点,同一个PAD引脚不能同时在两组pinctrl,会报DTS语法错误。

2026-10-10 18:32:25 307

原创 i.MX6ULL LCD 驱动开发实战:从引脚到时钟的完整配置

最近在调试 i.MX6ULL 的 RGB LCD 驱动,从最基础的引脚复用开始,一步步配到时钟和 eLCDIF 寄存器。整个过程踩了不少坑,也把 IOMUXC 和 CCM 的机制搞清楚了。这篇文章把整个流程整理出来,希望能帮到同样在调试 LCD 的朋友。

2026-09-27 19:55:43 260

原创 I2C 裸机驱动学习笔记:从物理层到温度传感器

今天系统学习了 i.MX6ULL 的 I2C 裸机驱动,从最底层的物理层一路走到寄存器操作,最后到用逻辑分析仪抓包验证。如果 SCL 高时 SDA 变化,会被误判为 START/STOP。:多个开漏输出接一起,只要有一个拉低,线就是低;:0=ACK,1=NACK,必须在清 IIF 之后读。:1=总线忙,0=空闲,STOP 后等它清 0。:每发/收完一个字节,硬件自动置 1,软件。多个设备接一起不会短路,谁拉低谁赢。,防止编译器优化掉循环里的读操作。踩了不少坑,也解决了不少问题。,先发 D7,最后发 D0。

2026-09-24 17:38:40 157

原创 I2C 裸机驱动学习笔记:从物理层到寄存器到抓包

今天系统学习了 i.MX6ULL 的 I2C 裸机驱动,从最底层的物理层一路走到寄存器操作,最后到用逻辑分析仪抓包验证。如果 SCL 高时 SDA 变化,会被误判为 START/STOP。硬件自动把 8 位推到 SDA,SCL 自动翻转,第 9 位收 ACK,置 IIF。:0=ACK,1=NACK,必须在清 IIF 之后读。:1=总线忙,0=空闲,STOP 后等它清 0。:SCL 高时,SDA 从 1 变 0。:SCL 高时,SDA 从 0 变 1。:仲裁丢失,单主模式用不到,但要清残留。

2026-09-24 17:27:33 276

原创 I2C 裸机驱动学习笔记:从物理层到寄存器到抓包

I2C = 串行 + 同步 + 开漏 + 多主多从。i.MX6ULL 的 I2C 控制器把协议全部硬件化,软件只操作 4 个寄存器。核心流程:写 I2DR → 等 IIF → 查 RXAK。START/STOP 靠 MSTA 边沿触发。

2026-09-23 20:00:26 158

原创 IMX6ULL 裸机工程化改造:从手动 Makefile 到全自动编译

报错现象:文件明明存在,却提示找不到。根本原因是 gcc 不会自动遍历文件夹,只找 Makefile 里通过 -I 指定的目录。解决规范(最终标准):所有芯片寄存器头文件、底层头文件全部放入 bsp 目录。因为 Makefile 默认带 -Ibsp,永远能找到,无需修改 Makefile。

2026-09-18 18:55:24 161

原创 ARM 体系结构核心知识点详解:立即数、跳转指令、栈与状态标志位

在学习 ARM 架构(特别是经典的 ARMv7-A 或 ARM9 等)时,我们经常会遇到一些底层的概念,比如“12位立即数”、“B/BL/BX 的区别”、“满递减栈”以及“CPSR 标志位”。这些概念是理解汇编代码和底层程序运行的基石。本文将通过问答的形式,细致地梳理这些核心知识点,并重点辨析容易混淆的“置位”、“溢出”和“栈指针”概念。在汇编指令中,操作数可以是寄存器,也可以是立即数。立即数是指在指令编码中直接包含的常数,而不是存放在寄存器或内存中的值。例如,指令中的#0x12。

2026-09-18 09:35:47 107

原创 ARM体系结构深度解析:从内核器件到异常处理的完整指南

ARM Core(内核)是芯片的核心,负责指令的执行与系统控制,相当于计算机的"大脑"。其中通用寄存器根据工作模式的不同,部分寄存器存在物理备份。ARM的异常处理是一套由硬件和软件共同完成的机制,流程分为。,这些指令在恢复PC的同时会自动将SPSR恢复到CPSR。ARM处理器共有37个32位寄存器,分为。ARM处理器支持7种工作模式,分为。ARM提供了专用的返回指令,例如。(系统模式+5种异常模式)。(唯一的非特权模式)和。

2026-09-18 09:32:17 182

原创 【i.MX6ULL裸机开发】纯汇编LED点灯实验(超详细全过程 + 原理问答)

本次实验基于 i.MX6ULL 裸机平台,不依赖任何系统、不依赖库函数,纯手写 ARM32 汇编完成 LED 闪烁功能。从零实现:异常向量表搭建、系统栈初始化、GPIO 引脚完整配置、软件延时、循环点灯,并手动编写 Makefile 交叉编译工程,最终通过 SD 卡 / U-Boot 两种方式上板运行。本文同时解答裸机入门最核心的三个面试/考试问题:引脚配置流程、编译工具链原理、ARM 汇编与 C 函数相互调用规则。地址少写 0:led_off 寄存器地址写错,导致 LED 无法熄灭、常亮延时太短。

2026-09-18 09:20:17 151

原创 基于STC89C52的温度采集与监控系统设计与实现

本项目基于 STC89C52 单片机,实现了一个温度采集与监控系统。读取 DS18B20 采集的温度控制 LED 灯和蜂鸣器设置温度上下限阈值切换手动/自动工作模式自动模式下超限告警这个项目适合 51 单片机入门进阶,涉及单总线通信、串口协议、定时器中断、数码管动态扫描等知识点。

2026-09-15 19:15:54 173

原创 UART 串口通信详解

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种串行异步通信接口,用于实现设备之间的数据收发。时序说明:空闲时为高电平,发送时先拉低产生起始位,随后按位发送数据(LSB 在前),最后发送停止位恢复高电平。UART 主要用于单片机和单片机之间,或者单片机与其余主控(如 PC、传感器模块、蓝牙模块等)之间进行通信。串口发送一个字节的帧格式为:1 位起始位 + 8 位数据位 + 1 位奇偶校验位(可省略)+ 1 位停止位。

2026-09-14 09:45:28 85

原创 51单片机学习笔记|最小系统、中断、定时器+数码管动态扫描实现0~9999计数器

本篇覆盖单片机基础概念、中断原理、定时器配置流程,结合S8050三极管驱动四位共阴极数码管,完成0~9999秒计数器,是51单片机中断+动态数码管经典综合实验。

2026-09-11 19:03:46 219

原创 SQLite 数据库入门:从安装到 C 语言接口实战

数据库是能够对大批量数据进行增删改查管理的软件。关系型数据库:将数据存放在文件中,常见的有 Oracle、MySQL、SQLite。非关系型数据库:将数据存放在内存中,属于内存数据库,常见的有 Redis、NoSQL。

2026-09-08 14:05:13 190

原创 TCP并发服务器模型与常见IO模型详解

内核监测文件描述符是否有事件发生,当有事件发生时通知用户层,用户层可以捕捉SIGIO信号来处理该文件描述符的事件。当集合中至少有一个文件描述符产生事件时,select不再阻塞,它会将产生事件的文件描述符保留在集合中,把没有产生事件的文件描述符从集合中去除。epoll是Linux下高效的多路复用IO机制,主要涉及三个函数:epoll_create、epoll_ctl和epoll_wait。当没有数据时,CPU仍然会在任务中执行代码,通过轮询的方式不断检测数据是否到来,造成CPU资源的浪费。

2026-09-03 18:00:39 200

原创 TCP通信与HTTP协议学习笔记:粘包、三次握手、四次挥手与C/S、B/S模型

HTTP(HyperText Transfer Protocol,超文本传输协议)是基于 TCP 的一种应用层协议,用于规定超文本在网络中传输的流程。通过调节 TCP 包头中的窗口大小来设置发送窗口和接收窗口大小,完成对流量及发送速率的控制。TCP 在四次挥手之前,默认保持 TCP 通信连接的状态。TCP 三次握手建立后,四次挥手结束前,整个过程通信双方保持连接,可以通过掉线检测机制检测 TCP 连接是否保持。首部行:根据不同的场景使用不同的首部字段,格式为:首部字段: 值。

2026-09-02 18:37:27 169

原创 TCP通信:三次握手与核心函数接口详解

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在通信开始之前,通信双方需要先建立连接,通信结束后再释放连接。TCP通过三次握手建立连接,通过四次挥手释放连接,从而保证数据传输的可靠性。TCP通信通过三次握手建立可靠连接,客户端使用socket、connect、send、recv等函数进行通信,服务器端使用socket、bind、listen、accept、recv、send等函数进行通信。

2026-09-01 19:25:03 157

原创 4.4 网络:协议、IP 地址与 UDP 通信详解

子网掩码:搭配 IP 地址来使用,用来区分网络位和主机位的。子网掩码是 1 的部分对应 IP 地址的网络位,子网掩码是 0 的部分对应 IP 地址的主机位。如果以上方法均无法设置 IP 地址,可利用命令直接设置 IP 地址(注意:此命令过一段时间就无效了,所以需要隔一段时间就重新设置一次)。MAC 地址:每个网卡出厂都会有一个属于该网卡的唯一识别的地址,该地址不会冲突。注意:bind 只能绑定本机的 IP 地址,不能绑定别人的 IP 地址;功能:将字符串 IP 地址转换为网络的大端字节序二进制地址。

2026-08-31 19:51:42 354

原创 Linux 进程间通信(IPC)详解

信号是内核层与应用层通信的一种机制。缺省:按照默认方式处理信号。忽略:不处理信号。捕捉:按照指定的方式处理信号。

2026-08-28 19:33:54 217

原创 Linux 多线程编程:线程属性、互斥锁、信号量与线程间通信

多线程 > 多进程。线程位于进程空间内部,共享进程的文本段、数据段(全局变量、静态变量、字符串常量)、堆区,所以可以通过共享空间实现通信;进程空间是独立的,没有共享空间,无法通信。进程空间是独立的,一个进程异常结束,不会影响其余进程;线程位于进程空间内部,一个线程异常结束,会导致进程结束,其余线程也随之结束。多进程空间独立,没有共享空间,需要使用第三方机制来完成进程间通信。实现 3 个线程任务,线程 1 循环打印 A,线程 2 循环打印 B,线程 3 循环打印 C,但是要求打印出来的顺序总是 ABC。

2026-08-27 20:03:40 226

原创 Linux 进程与线程:环境变量、进程调度与线程基础

线程是一个轻量的进程,是一个任务创建、调度、消亡的过程。线程是操作系统任务调度的最小单元。

2026-08-26 21:24:33 214

原创 进程与线程:从概念到实践

什么是进程?与程序有什么区别?进程空间如何划分?每一个区域存放哪些东西?常见的进程调度算法有哪些?进程有哪些状态?僵尸进程如何产生?如何避免?

2026-08-25 20:24:08 187

原创 Linux 文件 IO 与目录 IO 学习笔记

标准 IO 是库函数,是对文件 IO 的封装,有缓存,不适合操作设备文件、通信相关文件。返回值:成功返回目录项信息空间首地址,失败返回 NULL,读到目录的末尾返回 NULL。返回值:成功返回实际读到的字节数,失败返回 -1,读到文件末尾返回 0。返回值:成功返回实际写入字节数,失败返回 -1。返回值:成功返回目录流指针,失败返回 NULL。返回值:成功返回文件描述符,失败返回 -1。返回值:成功返回偏移量,失败返回 -1。返回值:成功返回 0,失败返回 -1。返回值:成功返回 0,失败返回 -1。

2026-08-25 09:56:42 196

原创 C语言文件操作与标准IO详解

标准IO是有缓存的IO,用户调用标准IO函数后,数据先进入缓存区,满足刷新条件时才将数据传递给内核。:一种特殊的二进制文件,文件中的每个字符都是能够显示在终端的ASCII码字符。:存放在磁盘空间中的一段数据的集合,是操作系统管理数据的基本单位。:文件中包含一些不能在终端直接显示的ASCII码字符。:打开pathname对应的文件,并与之建立一个流。:有方向性、具有连续性的数据通道。:编写程序统计某个指定文件的行数。:从流中读取一个字符。:将字符c写入流中。

2026-08-20 21:06:59 185

原创 Linux软件编程基础:操作系统、Shell与脚本编程

操作系统是一款软件,其核心作用是屏蔽底层不同的硬件平台,为上层应用提供统一的接口,从而实现通用的软件代码。PC三大操作系统:Unix:世界上第一款操作系统Linux:GNU(GNU's Not Unix)项目的重要组成部分,使用C语言编写,广泛应用于服务器和嵌入式领域Windows:使用C/C++开发。

2026-08-19 20:29:52 235

原创 数据结构与算法核心概念梳理:树、哈希表与排序

选取第一个元素作为键值,从后面找比键值小的放前面,从前面找比键值大的放后面,最终键值放中间,如果左侧有元素递归快速排序,如果右侧有元素递归快速排序。假设前面的元素为最小值,将最小值与后续元素比较,最终获得当前最小值,与前面元素交换到对应的位置。一种算法,通过哈希算法将数据映射成键值,根据键值来存取数据,以降低查找数据时的时间复杂度。相邻两个元素比较,大的向后走,小的向前走,逐渐将最大值放入最末尾,循环将前面元素排序即可。二叉树所有的叶子节点都在同一层,每一层上的节点都是满的。:组成树形结构的基本元素。

2026-08-18 19:02:13 183

原创 数据结构:链式表与单向链表详解

(此处将展开单向链表的具体。

2026-08-13 22:06:56 189

原创 数据结构基础:概念、复杂度与顺序表

程序 = 数据结构 + 算法。在程序运行中,我们希望无论数据量是否增长,程序运行时间维持恒定。随着数据量的增长,程序运行时间增长,两者之间呈现的函数关系,称为时间渐进复杂度函数,简称为时间复杂度。随着数据的增长,程序所占空间与数据量增长所呈现的比例函数关系称为空间复杂度。:描述数据的组织、存储和操作方式。(待补充具体实现代码和说明)顺序存放的表状结构。

2026-08-12 18:35:20 215

原创 C语言内存管理与程序调试完全指南

core文件中包含段错误产生时的堆栈调用关系,根据这个core文件搭配gdb快速找到段错误出现的位置。程序代码中多加入一些打印,前一句能够打印出来,后一句打印不出来,两句代码中间就产生段错误。程序在链接时会将代码与系统中的库文件链接成一个可执行程序。库可以分为静态库和动态库。打印,运行时查看打印结果与设想结果是否一致,从而定位出错的位置。申请的空间在使用完毕后没有及时调用。分布调试,查看代码是否产生段错误。在可能出现逻辑错误的位置加入。,系统会自动查找当前目录下的。用户在工程目录下输入。

2026-08-10 11:15:32 176

原创 C语言结构体、共用体、枚举与位运算详解

共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。结构体是C语言中用于将不同类型的数据组合成一个整体的复合数据类型。枚举是一种用户定义的数据类型,用于定义一组命名的整数常量。

2026-08-05 18:02:35 200

原创 C 语言进阶:二维数组传参、指针与结构体详解

struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;...struct 结构体名 变量名;

2026-08-04 20:15:27 172

原创 C语言指针进阶:二级指针、指针数组与数组指针详解

定义数组 a,5个元素,占40个字节空间,每个元素都是 int * 指针。

2026-08-04 09:21:06 154

原创 day11:C语言指针详解:从概念到应用

数据类型 *变量名;int *p;char *p;float *p;double *p;int *p, *q;

2026-07-31 18:05:44 209

原创 day10:C语言函数与预处理命令详解

宏名一般为大写,与变量名做区分宏只是代码的替换,中间不会进行任何数据计算的操作。

2026-07-30 18:41:27 199

原创 day 8:C语言二维字符数组与函数详解

定义了一个包含5个字符串的数组,每个字符串最大长度为31个字符(加上结束符'\0')。函数类型 函数名(数据类型1 形参1, 数据类型2 形参2, ...)函数体;return 返回值;与变量名要求保持一致形式参数,用来展示函数对数据的处理方式函数运行结果的类型返回值类型与函数类型不一致时,以函数类型为准函数类型如果不写默认为int类型如果想设置为void类型返回值,必须将函数类型写成void函数的运行结果存储类型 数据类型 变量名;int a;auto int a;

2026-07-29 21:43:44 223

原创 C语言字符数组与字符串操作详解

行数、列数必须为常量。数据类型 数组名[行数][列数];

2026-07-28 22:37:39 229

原创 C 语言数组详解:从基础到常见算法

数组是一组相同类型数据的有限集合。for (A;B;C) {for (D;E;F) {G;1*1=1do {语句块;} while (表达式);单一性连续性有序性数组名:与变量名要求保持一致。元素个数必须为常量,不能是变量或变量表达式。

2026-07-27 22:07:57 234

原创 C语言循环结构详解

循环结构用于有规律地重复执行一段代码,是编程中控制流程的重要结构。C语言提供了多种循环结构,包括while循环、for循环、do..while循环以及goto语句。只能用于循环语句中,表示跳过该次循环的剩余部分,直接进入下一次循环。用在switch或者循环语句中,表示退出switch或者循环。do..while循环先执行一次语句块,再判断条件是否成立。鸡兔同笼共50只,140只脚,编写程序打印出鸡兔的个数。双层for循环:外层循环执行一次,里层循环执行一遍。只能用于函数中,表示函数结束并返回一个值。

2026-07-25 18:57:45 156

原创 C语言流程控制:顺序、分支与循环结构详解

从终端接收一个成绩,如果在 90-100 之间打印 A,80-89 打印 B,70-79 打印 C,60-69 打印 D,60 以下打印 E,用。判断逻辑表达式是否成立,如果成立执行表达式1,并将其结果作为整体表达式的结果;如果不成立则执行表达式2,并将其结果作为整体表达式的结果。判断两个数的大小,如果第一个数大于第二个数,直接打印第一个数;如果第一个小于第二个数,两个数交换后打印第一个数。从终端接收 2 个数,获得 2 个数中的最小值,并打印在终端。从终端获得一个字母,打印出该字母在字典中的下一个字母。

2026-07-24 17:16:21 173

空空如也

空空如也

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

TA关注的人

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