- 博客(45)
- 收藏
- 关注
原创 根文件系统篇 – 概念、挂载与启动收尾
本文介绍了嵌入式Linux根文件系统(rootfs)的概念、目录结构及NFS挂载方法。根文件系统是Linux启动的第一个文件系统,包含启动所需的关键文件和目录。文章详细讲解了根文件系统的典型目录结构,以及获取方式(厂商提供/Buildroot生成)。重点阐述了NFS挂载根文件系统的调试方法,包括参数配置和常见问题解决。最后总结了嵌入式Linux系统移植的四个关键环节:环境准备、U-Boot、内核和根文件系统,强调三者协同工作的重要性。该系列为嵌入式Linux系统移植提供了完整知识框架。
2026-04-29 16:35:37
355
原创 内核篇 – Linux内核编译、裁剪、启动与交互
本文详细介绍了Linux内核的编译、裁剪与启动流程。主要内容包括:1. 内核概念与职责,包括进程管理、内存管理等功能;2. 内核编译流程详解,从获取源码到生成镜像文件;3. 内核裁剪方法,通过menuconfig移除不需要的模块;4. 完整的启动流程分析,从uboot跳转到内核初始化;5. 内核与用户空间的交互方式;6. 内核调试技巧及常见问题解决方法。文章以I.MX6ULL开发板为例,提供了实用的操作指南和注意事项,适合嵌入式开发者参考。
2026-04-29 16:10:17
459
原创 Bootloader篇 – Uboot功能、移植与启动流程
本文深入解析了Uboot的工作流程与功能。作为嵌入式系统的Bootloader,Uboot负责硬件初始化、内核加载和启动管理。文章详细介绍了Uboot的两个关键阶段:SPL阶段完成DDR初始化和内存映射,完整Uboot阶段则实现外设初始化、环境变量管理和内核引导。重点讲解了Uboot如何通过bootargs环境变量配置内核启动参数,以及通过寄存器R0-R2向内核传递参数的标准流程。此外还涵盖了Uboot源码获取、交叉编译方法、烧录步骤以及常用调试命令,为理解嵌入式系统启动过程提供了全面指导。
2026-04-29 12:05:45
462
原创 基础环境篇 – 交叉编译环境搭建与NFS服务配置
本文介绍了嵌入式开发中交叉编译环境的搭建方法。首先解释了交叉开发环境的概念,即在PC上编译程序、在目标开发板上运行的开发模式,并分析了其必要性。然后详细说明了交叉编译工具链arm-linux-gnueabihf-gcc的组成、下载安装步骤及环境变量配置方法。最后重点讲解了NFS网络文件系统的搭建过程,包括NFS服务器的安装、共享目录配置和本地测试方法,以实现在开发阶段避免频繁烧写存储设备的目的。这些内容是嵌入式系统开发的基础环境配置,为后续开发工作奠定基础。
2026-04-29 11:33:25
619
原创 ARM体系概述
ARM是全球领先的半导体IP供应商,提供RISC架构处理器设计授权。其核心产品线包括面向应用的Cortex-A、实时处理的Cortex-R和微控制器Cortex-M系列。ARM处理器采用精简指令集(RISC),具有固定指令长度、多寄存器、条件执行等特性。典型ARM系统包含处理器核心、电源、时钟、存储器(Flash/RAM)及外设等基本组件。处理器内部架构由ALU、寄存器组、程序状态寄存器(CPSR/SPSR)、存储管理单元(MMU)和缓存等模块构成。片上系统(SoC)通过AHB/APB总线集成CPU、存储控
2026-03-19 21:51:22
906
原创 【单片机】—— 中断
在单片机编程中,位运算是指对二进制位(bit)进行操作的运算。由于单片机内部的所有数据本质上都是由二进制位组成的,位运算提供了一种精确、高效的方式来控制和检测这些硬件资源。
2026-03-17 23:55:47
610
原创 【SQLite数据库】—— 概念及基本操作
本文摘要:本文系统介绍了数据库基础知识与应用操作。主要内容包括:1)数据库分类与核心概念,重点解析了SQLite嵌入式数据库的特点;2)SQLite常用指令与基本操作,涵盖表创建、增删改查、排序等语法;3)数据库维护命令(导入导出)与可视化工具;4)C语言操作SQLite的编程接口,包括打开/关闭数据库和执行SQL语句的函数使用示例。全文以SQLite为例,详细说明了轻量级数据库的实际应用方法,适合开发者快速掌握数据库基础操作。
2026-03-09 20:25:28
720
原创 【网络编程】—— IO多路复用
IO多路复用是一种单线程同时监测多个文件描述符IO状态的机制,主要包括select和epoll两种实现方式。select使用fd_set集合管理文件描述符,通过轮询方式检测就绪状态,但受限于1024个文件描述符且效率随数量增加下降。epoll则采用红黑树存储文件描述符,就绪事件主动上报,支持高并发且效率稳定。两者主要区别在于:select需要每次重置集合并轮询所有文件描述符,而epoll仅需处理就绪事件;select有1024的文件描述符限制,epoll则无此限制;select每次调用都需数据拷贝,epol
2026-03-09 02:59:31
724
原创 【网络编程】—— HTTP超文本传输协议
HTML:超文本标记语言,编写网页的一类编程语言。经过浏览器的解析,最终显示在浏览器中。网络抓包工具,网络调试,协议分析。可以看到网络设备,底层收发的字节。是一个应用层协议,主要用于浏览器和服务器之间的交互。HTTP:超文本传输协议,是基于TCP的,默认端口号。HTTPS(加密版本的HTTP)默认端口号。3.接收HTTP响应报文和数据。各种头格式的默认模式下大小?2.发送HTTP请求报文。
2026-03-05 23:57:24
347
原创 【网络编程】—— TCP传输控制协议
本文摘要:文章首先介绍了互联网的组成结构,分为核心部分(网络和路由器)和边缘部分(用户主机),并比较了C/S、B/S和P2P三种架构的特点。重点分析了TCP协议的特性,包括面向连接、可靠传输、全双工通信等机制,详细对比了TCP流式套接字和UDP数据报套接字的区别。文章还阐述了TCP通信流程及相关函数(listen、accept、send/recv等)的使用方法,说明了监听套接字与通信套接字的关系。最后讨论了TCP粘包问题的定义及三种解决方案:设置结束标识、发送固定大小数据和自定义协议。
2026-03-05 09:26:00
597
原创 【UDP用户数据报练习题】
注意:在这个程序当中,采用的是逻辑根据客户端每次读取到的数据字节数,来发送对应大小的缓存区数据给服务端,再根据每次读取到的不同字节数来分析不同情况。在UDP协议中,可以发送大小为0的UDP数据报,程序正常运行。但是TCP就不允许发送大小为0的TCP数据报,所以这个判断逻辑在TCP中是不可取的。
2026-03-05 01:47:00
363
原创 【网络编程】—— UDP用户数据报
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
2026-03-03 21:34:48
706
2
原创 【嵌入式修炼——Linux系统编程篇】——线程的编程
互斥锁(Mutex,全称 Mutual Exclusion)是多线程编程中常用的一种同步机制,用于保护共享资源,防止多个线程同时访问造成数据不一致或竞争条件。1)功能:通过该函数可以将指定线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞。注意:返回的retval不能是局部变量,否则为NULL,考虑增大生命周期,static和把变量放在堆区。加锁后的代码到解锁部分的代码属于原子操作,功能:用指定的互斥锁开始加锁代码。互斥锁的属性,初始化的值,一般是。功能:将指定的互斥锁解锁。
2026-02-27 08:58:40
403
原创 【Linux系统编程】——线程的基本概念
线程是进程内部的控制序列,一个进程至少有一个线程(主线程),也可以包含多个线程,这些线程共享进程的资源。
2026-02-25 09:01:39
256
原创 【嵌入式修炼:Linux系统编程篇】——进程
本文系统介绍了Linux进程管理的核心概念。主要内容包括:1)进程定义与特性:进程是程序的动态执行实例,具有独立性、并发性、动态性和异步性等特征;2)进程组成结构:详细解析了进程控制块(PCB)和虚拟地址空间的内存分布;3)进程状态转换:阐述从创建到终止的生命周期及状态转换关系;4)进程操作命令:介绍top、ps、kill等常用进程管理工具;5)进程创建与控制:深入讲解fork()、exec族函数的使用及区别;6)进程资源回收:分析wait和waitpid函数的应用场景及差异。文章全面覆盖了Linux进程管
2026-02-10 22:41:09
742
原创 【嵌入式修炼:Linux系统编程篇】——目录编程
本文介绍了Linux系统下操作目录的基本函数:1. opendir()函数用于打开目录流,需注意目录名格式和特殊字符处理;2. readdir()函数读取目录项信息,可获取文件名和类型;3. closedir()函数关闭目录流。文中提供了两个实用示例:列出目录下所有文件名(排除"."和".."),以及统计目录下子目录和普通文件的数量。这些函数需要包含<dirent.h>头文件,操作时需处理错误情况,并通过命令行参数或硬编码方式指定目录路径。
2026-02-10 21:03:21
381
原创 【嵌入式修炼:Linux系统编程篇】——文件编程
流是对数据读写过程的抽象。FILE *:文件指针,代表打开的文件;流指针,代表打开的文件(关联一个流)以上是铺垫的知识点,接下来我们正式开始Linux系统编程中的文件编程部分的知识点!
2026-02-06 20:17:44
1080
原创 【嵌入式修炼:数据结构篇】——数据结构总结
<think>我们只需要根据内容生成摘要,不超过150字。内容是关于数据结构和排序查找的要点。摘要应简洁概括主要知识点。注意字数。</think>本文概述数据结构核心内容:线性表(数组、链表、栈、队列)及链表操作(找中间节点、倒数第K个、判环、逆序);非线性结构(树、散列表)及二叉树遍历;并提及排序与查找算法的时间、空间复杂度分析。
2026-02-06 19:18:23
151
原创 【嵌入式修炼:数据结构篇】——树和二叉树
树是n(n > = 0)个结点的有限集合n = 0时:称为空树。有且仅有一个根结点(root)其余结点可分为m(m>0)个互不相交的有限集合,每个集合本身也是一棵树,称为根的子树是n(n≥0)个结点的有限集合,或为空树(n=0);或由一个根结点和两棵互不相交的子树组成,分别称为左子树和右子树,且二者有严格顺序。
2026-02-05 23:57:48
1115
原创 【嵌入式修炼:数据结构篇】——双向链表的基本操作
随着代码量的增加,我们引入Makefile,整型数据类型和节点结构体的说明,以及函数的声明放在.h文件中。双向链表是在单链表的每个节点中,再设置一个指向其前驱节点的指针域。
2026-02-02 20:53:56
287
原创 【嵌入式修炼:数据结构篇】——单向链表的进阶操作
这期全是干货!在对单向链表进行一些复杂的进阶操作时,首先,要仔细思量在解决问题的过程中每一个可以提前预防的情况,链表为空、链表头节点为空、链表只有一个有效节点等等;其次,在使用双指针的时候,要根据实际问题的情况,决定指针的起点;最后,在while语句中用到逻辑与和逻辑或时要充分考虑短路特性带来的影响,解决问题的前提是在链表内,所以一般来说都先写判断节点不为空,如果超出链表范围很容易段错误。(在今天的学习中,对于销毁链表时二级指针的使用没有掌握)
2026-01-30 23:23:34
871
原创 【嵌入式修炼:C语言篇】——结构体、共用体、枚举类型、位运算
可以把相关的数据集合到一起来描述的特定数据类型先定义结构体再定义变量:…… //成员变量//定义变量定义类型的同时定义变量:…… //成员变量}s = { 初始化 };//定义变量定义类型的同时定义变量,但省略结构体类型名struct //如果这个结构体只用一次…… //成员变量}s = { 初始化 };//定义变量注意:结构体的定义也可以在局部,但是作用域也只在局部。
2026-01-27 00:04:44
679
原创 【嵌入式修炼:C语言篇】——指针操作普通变量和一维整型数组
基类型:代表的是一种数据类型,指的是指针指向的目标空间上存放的数据类型* :在定义时标识,定义的是一个指针类型的变量指针变量名:标识符,取名规则和变量命名规则一致eg:int * p;//定义了一个int 型指针变量p;变量 p 中要存放的是地址这种数据,存放的是一块 int 型空间的地址;指向的空间中存放的数据的类型是int。p的数据类型是 int *;int *是指向int 的指针类型内存单元的地址编号由位数决定//位数指的是CPU上数据总线和地址总线的宽度。
2026-01-22 09:02:27
526
原创 【嵌入式修炼:C语言篇】——存储类别关键字和程序预处理
本文摘要:C语言存储类别关键字包括auto(自动变量)、static(静态变量)、extern(外部引用)和register(寄存器变量),分别控制变量的存储方式和作用域。编译过程分为预处理、编译、汇编和链接四个阶段。宏定义分为无参宏和带参宏,前者用于常量替换,后者实现类似函数的功能但本质是文本替换。文件包含使用#include指令,条件编译通过#ifdef等指令控制代码编译与否。这些特性共同构成了C语言强大的底层控制和代码组织能力,开发者需注意不同存储类别的生命周期和作用域差异,以及宏定义与函数的本质区别
2026-01-20 21:22:11
905
1
原创 【嵌入式修炼:C语言篇】——函数的递归以及数组作为函数参数的应用
1)形参在形式上写成数组形式,必须加方括号,数组长度可要可不要2)实参在形式上写成数组名,传数组的实际长度。
2026-01-19 21:41:15
895
1
原创 【嵌入式修炼:C语言篇】——二维字符数组和函数的概念
数据类型 数组名 [ 常量表达式1 ][ 常量表达式2 ];1)main函数之前:起到定义和声明的作用,使用时直接调用2)main函数之后:在函数调用前,作函数声明,即函数头 + 分号//函数声明。
2026-01-18 22:57:50
881
1
原创 【嵌入式修炼:C语言篇】——二维整型数组和一维字符数组的概念、常用函数
类型说明符 数组名 [常量表达式] [常量表达式]数据类型 数组名 [数组长度]双引号括起来的一组字符。(C语言中字符串是按照字符数组来处理的)
2026-01-18 21:15:52
847
原创 【嵌入式修炼:C语言篇】——选择、冒泡、插入排序和查找
今天学习了选择排序、冒泡排序、插入排序等三种排序方法,还学习了二分法查找。排序是将数据按从小到大或者从大到小的顺序排序,在目前的学习中只涉及到从小到大的排序。
2026-01-15 23:59:45
409
原创 【嵌入式修炼:C语言篇】——for、while、do-while循环语句和一维数组
今天学习 goto,for,while,do-while四种循环结构,还学习了一维数组的基本知识与运用。
2026-01-14 22:01:22
1187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅