自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式 Linux 开发与驱动

特性静态编译动态编译配置ym输出编进zImage.ko加载方式随内核启动卸载不支持rmmod适用场景必须随内核启动的驱动(存储控制器)可选外设、调试驱动5. 系统启动完整流程[上电]↓[BootROM] → SoC 内部固化代码↓[SPL/MLO] → 初始化 DDR,启动 U-Boot↓[U-Boot] → 加载内核 + dtb + rootfs↓[Linux 内核] → 驱动加载,挂载 rootfs↓。

2025-09-23 20:17:57 792

原创 系统移植

USB启动:驱动后,需要通过PC将系统文件通过USB传输给开发板完成启动在硬件平台没有系统的情况下,第一次启动使用USB启动。SD卡启动:将系统烧录到SD卡上,由SD卡启动平台代码开发调试时,或者检测硬件平台好坏的时候,使用SD卡。文件的管理(Linux系统一切皆是文件,可以实现对设备的操作和内核信息的查看)EMMC启动:将系统烧录到EMMC上,由EMMC启动平台代码随开发板完成自启动,使用EMMC。1. 上电启动,执行0x0处的代码(中断向量表 -> 复位异常 -> 跳转到对应函数实现启动)

2025-09-22 20:53:57 849

原创 SPI 通信协议

SPI (Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步的串行通信总线。主要应用于EEPROM、Flash、RTC(实时时钟)、AD/DA 转换器、DSP、传感器、显示屏驱动等芯片的数据传输。特点:接口简单,速度高(常见几十 MHz,部分可达上百 MHz)。全双工通信(主机和从机可以同时收发数据)。硬件资源占用少(一般只需 4 根线)。主从结构:一个主机(Master)可控制一个或多个从机(Slave)。通信速度高,远快于 I²C。全双工传输。

2025-09-18 18:58:57 526

原创 ADC 原理与关键参数

ADC 是模拟世界与数字世界的桥梁。例如,当传感器输出电压信号时,ADC 会将该电压转换为对应的数字码,从而实现后续数字电路的运算、存储和传输。

2025-09-17 20:11:31 458

原创 I²C 总线通信原理与时序

START 条件:SCL 高电平时,SDA 从高变低,边沿就是开始信号;STOP 条件:SCL 高电平时,SDA 从低变高;数据有效性:数据在 SCL 高电平时必须稳。

2025-09-17 19:56:03 945

原创 i.MX6ULL 时钟系统与配置

PLL用于倍频,得到高频时钟;Prescaler用于分频,降低频率;PFD在 PLL 基础上提供灵活的分数分频/倍频;时钟树配置需要先切换到安全时钟源,再逐步配置 PLL → PFD → 根时钟。通过合理的时钟配置,可以让 CPU、AHB、IPG 以及各个外设在满足性能的同时降低功耗。

2025-09-15 19:14:38 1074

原创 i.MX6ULL 外设初始化

UART(Universal Asynchronous Receiver/Transmitter)是最常用的异步串行通信接口之一,在嵌入式调试和外设通信中应用广泛。EPIT(Enhanced Periodic Interrupt Timer)是增强型周期定时器,常用于周期性任务,例如 LED 闪烁、系统心跳信号等。GPT(General Purpose Timer)是通用定时器,可用于计时、延时、PWM 输出等场景。:通过 TXD(发送)、RXD(接收)完成数据通信。配置工作模式(时钟源、重载方式)。

2025-09-15 19:03:07 566

原创 GNU 工具链与ARM 交叉编译工具链

GNU 工具链(GNU Toolchain)是由 GNU 项目提供的一套跨平台、功能完善的软件开发工具,主要应用于操作系统开发、嵌入式系统开发以及应用软件开发。它包含了从源代码编译到目标程序生成、再到调试和分析的完整流程。

2025-09-10 20:23:02 919

原创 ARM 汇编学习

嵌套调用时,LR 会丢失,无法回到正确位置。必须使用栈来保护现场、恢复现场。:可实现 ARM ↔ Thumb 状态切换(取决于地址最低位)。功能:比较两个寄存器或寄存器与立即数,本质是。:跳转并保存返回地址(下一条指令)到 LR。ARM 的立即数并非任意数,而是通过。凑够 8 位之后,其右边必须是。:无条件跳转,相当于 C 的。:B 指令也可用于函数调用。:先写入数据,再 SP++:先写入数据,再 SP--:先 SP++,再写入数据。:先 SP--,再写入数据。,只更新 N、Z、C、V。

2025-09-09 20:20:41 845 1

原创 ARM 体系结构与存储器

字节寻址,可直接执行(XIP, Execute In Place)。:存储密度高、成本低,但需要刷新电路,速度低于 SRAM。电擦写方式,速度较慢,但方便修改少量数据(如配置参数)。,直接集成在 SoC 内部,速度快、可直接被内核访问。:快速中断模式,高优先级,专用寄存器多,适合实时处理。:速度快、功耗低(静态保持),但成本高、容量小。:大小端标志(0 = 小端,1 = 大端)。:页寻址,容量大、寿命长,需控制器管理。:嵌入式 NAND,带控制器,简化接口。RISC(精简指令集)设计,流水线执行。

2025-09-08 20:09:27 1013

原创 硬件基础:串口通信

抗干扰强,传输距离≤1200米。通过多条数据线同时传输多个数据位,速度较快但成本高,抗干扰能力弱,适用于短距离通信,如早期的打印机接口。通过单条或少数数据线逐位传输数据,线路简单、成本低、抗干扰强,适用于中长距离通信,如UART、USB等。文本模式,数据以ASCII字符传输,帧结构包含起始符、地址码、功能码、数据区及LRC校验。依赖时钟信号同步,数据连续传输,无起始/停止位,效率高但需额外时钟线,如SPI或I2C。通过波特率和帧结构同步,数据以独立帧传输,硬件简单但效率较低,如UART或RS-232。

2025-09-05 21:05:23 924

原创 硬件基础:中断

(Clock Cycle)是CPU时钟信号的一个完整振荡周期,即时钟频率的倒数。当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个。作,这样的过程称为中断。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它。队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工。

2025-09-04 21:29:57 645

原创 裸机系统与硬件基础开发

16位系统中int类型固定占用2字节存储空间,无符号整型范围由以下公式确定:0~2^(16)-1, 十六进制常量0xFFFF对应十进制最大值65535,其二进制表示为全1的16位模式。RAM作为易失性存储器,在系统断电时将丢失所有临时数据,其访问速度显著快于持久存储设备。:片上系统,集成CPU、GPU、内存控制器及外设接口,适用于高性能嵌入式场景。:微控制器,内置存储与外设接口,典型应用于低功耗控制场景。:微处理器,需外部扩展存储,提供更强计算能力。:硬件定时器模块,提供精确时序控制。

2025-09-03 18:35:06 172

原创 Linux下的网络编程SQLITE3详解

插入数据时,主键值自动增长列给NULL,让其自动增长。从数据库中查询数据,查到几条,回调函数就会被执行几次。:指针数组,多个指针分别指向每一列数据的字符串。注意:回调函数成功的话必须要有返回值,返回0。功能:执行select语句时调用的回调函数。:sqlite3_exec传递的第四个参数。从数据库查询出来的数据,统统是字符串类型。文件型数据库,可以移动,跨平台移植性好。:执行select语句时使用的回调函数。:指针数组,多个指针指向每一列的列名。:给回调函数传递的参数(实参):保存数据库句柄的指针的地址。

2025-08-29 18:22:34 515

原创 Linux网络编程(epoll)

使用红黑树(二叉树)实现对文件描述符集合的保存,没有监测文件描述符个数的上限,提高查找效率。使用位图(数组)实现对文件描述符集合的保存,最多允许同时监测1024个文件描述符。只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)。只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)。边沿触发模式(高速模式):状态变化时触发事件(上升沿触发,下降沿触发)。可工作在水平触发模式(低速模式)和边沿触发模式(高速模式)。需要应用和内核层的反复数据(文件描述符集合表)拷贝。

2025-08-28 19:41:24 257

原创 TCP 并发服务器构建

服务端同一时刻只能处理一个客户端的任务。:服务端同一时刻可以处理多个客户端的任务。

2025-08-27 18:43:35 669

原创 HTTP 协议与TCP 的其他机制

请求建立连接标志位:响应报文标志位:携带数据标志位,通知接收方该从缓冲区读数据:请求断开连接标志位:复位标志位:紧急数据标志位。

2025-08-25 19:24:42 1030

原创 网络编程:UDP与TCP

AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB。接收方处理速度较慢,多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出。:发送方应用层发送的多包数据,接收方可能一次读到多包数据,导致粘连。32bits平台《--》64位平台。

2025-08-24 15:50:43 1033 2

原创 Linux下的网络编程

16位整形数据(0-65535),标记同一主机上的不同网络进程。用户表示形式:192.168.1.140(点分十进制):传输层用户数据报协议(User Datagram Protocol)私有IP:192.168.0.0 - 192.168.255.255。私有IP:172.16.0.0 - 172.31.255.255。私有IP:10.0.0.0 - 10.255.255.255。范围:192.0.0.0 - 223.255.255.255。1024-49151:注册端口(IANA指定特殊服务使用)

2025-08-22 21:26:12 664

原创 信号、内存共享等实现

共享内存效率最高,多个进程可挂接同一。信号量本质是计数器,用于进程同步或互斥。操作(申请资源)使信号量减 1。操作(释放资源)使信号量加 1。建立映射后可直接读写。

2025-08-19 21:13:14 170

原创 Linux 进程间通信(IPC):信号、共享内存

6.删除共享内存:int shmctl(int shmid, int cmd, struct shmid ds *buf);1.创建IPC Key:key t ftok(const char *pathname, int proj_id)2.创建共享内存:int shmget(key_t key, size t size, int shmflg);注意:paues可以被一个可捕获的信号唤醒(9,19号信号不可被捕获)5.解除映射关系:int shmdt(const void *shmaddr);

2025-08-19 20:59:27 1032

原创 线程间同步机制与进程间通信

线程间同步机制用于协调多个线程的执行顺序,确保任务按预期顺序执行。异步执行是多线程和多进程的本质,CPU调度具有随机性。信号量是实现线程间同步的一种机制。sem_t sem;PV操作::信号量对象地址pshared:0表示线程间共享,非0表示进程间共享value:信号量初始值。

2025-08-18 21:09:36 895

原创 Linux 多线程:线程回收策略 & 线程间通信(互斥锁详解)

线程回收,不需要,由系统回收。非分离属性:默认,需要来回收,否则变僵尸线程。线程间通信(互斥锁)使用来保护临界资源。加锁()和解锁()必须成对出现。最后记得。

2025-08-16 20:14:52 677

原创 Linux 进程、线程与 exec/系统调用详解

1.wait与waitpid—— 子进程资源回收:阻塞等待,回收任意子进程的资源空间。wstatus:保存子进程退出状态的变量地址NULL:不保存退出状态成功:返回回收的子进程失败:返回:回收子进程的资源,功能比wait更灵活。< -1:回收指定进程组内的任意子进程例如-100表示等待的进程组-1:回收任意子进程(组内外)0:回收与当前调用者同一组的所有子进程> 0:回收指定的子进程保存子进程退出状态NULL:不关心退出状态0:阻塞等待WNOHANG:非阻塞等待成功:返回回收的子进程-1。

2025-08-15 19:43:10 900

原创 Linux 进程与内存布局详解

1.正在运行的程序,其运行过程中需要消耗内存和CPU。gcc应用程序 可执行程序 内存硬盘 硬盘 cpu程序和进程有什么区别?程序:静态的数据集合,存储在硬盘空间程序运行起来可以产生进程;一个程序可以产生多个进程进程:是一个程序动态执行的过程,需要消耗内存和CPU,进程具备动态生命周期,从产生到调度再到消亡。

2025-08-14 21:18:00 1058

原创 Linux framebuffer 编程入门:直接操作显存画图

framebuffer 是 Linux 内核为图形显示提供的一套接口,允许用户空间程序直接访问显存数据。通过/dev/fb0这个设备文件,我们可以获取屏幕参数、映射显存,然后直接修改像素。

2025-08-13 21:28:26 281

原创 文件IO函数实现

的使用,以及如何随机访问文件位置进行修改。实现,分块读取,避免一次性读入过多内容。的基本用法,获取文件描述符并关闭文件。:一次性读取文件内容并输出,适合小文件。写文件和直接向标准输出设备写数据。

2025-08-12 22:04:34 249

原创 文件IO与系统调用详解(Linux环境)

Linux内核为应用层提供了一套底层的文件操作方法,这些方法属于系统调用,直接与内核交互,适用于硬件和普通文件的操作。文件IO常用系统调用包括:openreadwriteclose。

2025-08-12 21:56:17 553

原创 标准IO详解(fgets、gets、fread、fwrite、fseek 等应用)

将读取到的数据写入目标文件。获取当前文件指针相对于文件开头的字节偏移,赋值给。将文件指针移动到文件开头向后偏移11个字节的位置。在当前位置基础上向前移动3个字节。在新的文件指针位置写入字符。:要求程序运行时传入两个参数——源文件路径和目标文件路径。写入一个空字符,确保文件大小扩展到与源文件相同。中的5个结构体元素,以二进制形式写入文件。:从源文件循环读取最多200字节到缓冲区。,用于存放最多读取的10个学生结构体。将目标文件指针定位到大小减1的位置。):创建或清空该文件,准备写入数据。

2025-08-11 21:21:22 461

原创 标准IO详解(fgets、gets、fread、fwrite、fseek 等)

没有读取长度限制,可能导致缓冲区溢出(已在 C11 中被移除)从标准输入(键盘)读取数据会将输入中的。:返回当前文件位置距文件头的字节偏移量。空洞文件:文件内容为空,但占用磁盘空间。→ 标准错误输出(显示屏)成功 → 实际写入的元素个数。成功 → 实际读取的元素个数。:将文件指针复位到文件开头。从指定的已打开文件中读取。个字符,最后一位存放。→ 标准输出(显示屏)到文件末尾 → 返回 0。:将文件流定位到指定位置。按块拷贝数据到指定位置(→ 标准输入(键盘)→ 从文件头开始偏移。抢占目标文件的磁盘空间。

2025-08-11 21:02:08 405

原创 标准IO实现

用于打开或创建文件,返回一个文件流指针。模式:如果文件存在则清空,不存在则创建。:直接写入一个字符串(不自动添加换行符)(可能是路径不存在或权限不足):读取一行数据(包含换行符。适合快速写入字符串数据。

2025-08-09 18:39:36 144

原创 Linux文件操作详解:一切皆文件

Linux 一切皆文件:理解文件类型是基础文件操作流程:打开 → 读写 → 关闭标准IO:基于FILE *,适合文本和缓冲操作文件IO:基于文件描述符,适合底层系统编程。

2025-08-09 18:28:16 391

原创 二叉树实现

进行层序遍历,从上至下、从左至右访问每一个节点。队列中维护每层的节点顺序,每次出队一个节点,就将其左右子节点(如果存在)入队,直到队列为空。利用前序遍历方式,根据字符数组构造二叉树。(左-根-右):先访问左子树,再访问当前节点,最后访问右子树。(左-右-根):先访问左子树和右子树,最后访问当前节点。(根-左-右):先访问当前节点,再访问左子树和右子树。表示该节点为空(空子树)。定义了二叉树的基本结构。,每个节点包含一个字符型数据。,以及指向左右子树的指针。

2025-08-08 21:35:42 487

原创 数据结构(二叉树)

树是一种重要的非线性数据结构,用于表示层次关系。基本定义:树是由 n(n ≥ 0)个结点组成的有限集合。当 n = 0 时,称为空树;当 n > 0 时,树必须满足两个条件:有且仅有一个特定的根结点(root node);当 n > 1 时,其余结点可划分为 m(m > 0)个互不相交的子集 T1, T2, ..., Tm,每个子集本身又是一棵树,称为子树(subtree)。结点属性:结点的度(degree)是指一个结点拥有的子树个数。例如,一个结点有 3 个子树,则其度为 3。

2025-08-08 21:11:05 1375

原创 数据结构(循环顺序队列)

在数据结构中,是对顺序队列的一种优化,可以避免因出队而造成空间浪费。

2025-08-07 20:23:27 312

原创 数据结构学习(哈希函数)

在数据结构中,顺序查找的时间复杂度为O(n),当数据量增大时效率急剧下降。哈希存储:将要存储的数据的关键字和存储位置之间,建立起对应的关系,这个关系称之为哈希函数。存储数据时,通过对应的哈希函数可以将数据映射到指定的存储位置;当不同key通过哈希函数映射到相同位置时,发生冲突: key1 ≠ key2,但 hash(key1) = hash(key2)当发生哈希冲突(即不同关键字通过哈希函数得到相同的哈希地址)时,它会在哈希表中寻找其他空闲位置来存储冲突的记录。在每个桶中使用链表遍历,输出。

2025-08-07 19:36:18 574

原创 栈与队列的基本逻辑

/ 假设数据类型为int} SKNode;int clen;} SKTop;} QNode;int clen;} Quene;创建队列核心逻辑分配一个Quene结构体空间clen = 0检查队列空入队操作核心逻辑创建一个新结点QNode,保存传入的数据若队列为空:队头、队尾都指向新节点若队列非空:当前队尾的pnext指向新节点,更新ptail指向新节点,队列长度clen++return -1;return -1;} else {

2025-08-06 21:38:44 324

原创 数据结构学习(days04)

项目栈(Stack)队列(Queue)基本定义只允许从一端进行插入和删除的线性结构允许从一端插入、另一端删除的线性结构操作方式插入、删除都在栈顶进行插入在队尾,删除在队头数据特性先进后出(FILO)先进先出(FIFO)操作名称入栈(push)、出栈(pop)入队(enqueue)、出队(dequeue)特殊概念满栈、空栈;增栈、减栈(栈顶增长方向)队满、队空;循环队列常见实现满/空判断栈顶是否超出容量范围常见实现顺序栈、链栈顺序队列、链式队列、循环队列。

2025-08-06 21:15:39 365

原创 数据结构学习(days03)

支持。

2025-08-05 20:40:08 1088

原创 数据结构学习(days02)

核心逻辑:定义两个指针,一个指针指向待插结点,另一个指针保证表头与与链表断开之后仍然可以找到链表,以头插的方式将待插入节点插入链表中。核心逻辑:定义两个指针,一个块指针和一个慢指针,快指针一次的跨度为慢指针的n倍,当快指针为空,慢指针刚好到倒数第n个结点。核心逻辑:定义两个指针,一个块指针和一个慢指针,快指针一次的跨度为慢指针的2倍,当快指针为空,慢指针刚好到中间。核心逻辑:定义两个指针,一个块指针和一个慢指针,快指针一次的跨度为慢指针的n倍,如果为环,则快慢指针一定会相遇。在Linux下可以使用。

2025-08-04 20:40:39 208

空空如也

空空如也

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

TA关注的人

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