自定义博客皮肤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)
  • 收藏
  • 关注

原创 驱动(二)Linux 系统移植、驱动开发框架

上电后,CPU 先执行芯片内部固化的 “启动代码”(如 i.MX 的 ROM Code),完成最基础的硬件检查(如内存是否存在),然后从指定启动介质(如 eMMC、SD 卡)加载 Bootloader。),不内置到内核,可在系统运行时动态加载 / 卸载。:将驱动代码直接编译进 Linux 内核镜像(如。:驱动代码编译为独立的内核模块文件(),内核启动时自动加载驱动。

2025-09-23 19:43:42 775

原创 驱动 (一) Linux 系统移植

初始化 i2c、DDR、EMMC、Serial、Net 等;进入人机交互环节:用户输入回车可进入 uboot 系统并输入命令交互;若用户不输入回车,uboot 会执行 bootcmd。IMX6uLL - Mini 平台分为核心板(系统启动必备资源)和底板(外设资源)。

2025-09-22 22:04:48 936

原创 硬件(十五)LCD

其分辨率指屏幕像素数量,如 1080P 对应 1920*1080 个像素点,像素点由 R(红)、G(绿)、B(蓝)三原色组成。以分辨率 1024*600 的 LCD 为例,存在 HBP(行同步信号后肩)、HFP(行同步信号前肩)、VBP(帧同步信号后肩)、VFP(帧同步信号前肩)这些时间参数,它们源于 CRT 显示器电子枪的反应延时,在 LCD 中则是为了给屏幕内部 IC 反应时间,锁定有效像素数据,这些参数需查看 LCD 数据手册获取,且在 LCD 驱动编写中会用到。

2025-09-19 19:05:57 851

原创 硬件(十四)SPI通信协议

的串行通信总线,广泛应用于 EEPROM、FLASH、实时时钟、AD 转换器、数字信号处理器与解码器等设备间的通信,仅需占用芯片四根管脚(四线制)。SPI(Serial Peripheral Interface,串行外设接口)是一种。I.MX6ULL 自带的 SPI 外设称为。:SPI 通信时,主机与从机必须工作在。,否则会因采样时机不匹配导致数据错误。决定数据在 SCLK 的。ADXL345 采用。

2025-09-18 18:34:52 869

原创 硬件(十三)模拟转数字ADC转换

ADC(Analog-to-Digital Converter,模数转换器)的本质功能,是将连续变化的模拟电压信号转换为离散的数字编码。这种转换能力使得自然界的物理量(如光照强度、声音波形)能够被数字电路识别、运算、存储和传输。举个典型应用场景:温湿度传感器检测环境后输出 0-3.3V 的模拟电压,ADC 可将该电压转换为对应的 8 位、12 位等数字码(例如 0-255、0-4095),微控制器接收数字码后,再通过校准公式反推出实际的温湿度值 —— 这一过程的核心就是 ADC 的 “翻译” 作用。

2025-09-17 20:26:51 963

原创 硬件(十二)I2C 通信协议:时序、操作

I²C 协议通过特定的电平变化定义通信的关键节点,其中 START(起始)和 STOP(停止)信号是划分通信周期的核心标识,而数据有效性则决定了信号的可采样时机。信号类型定义与实现方式作用START(起始)SCL 保持高电平时,SDA 由高电平跳变为低电平告知总线上所有设备:通信即将开始STOP(停止)SCL 保持高电平时,SDA 由低电平跳变为高电平告知总线上所有设备:通信已结束,释放总线数据有效性SCL 低电平时 SDA 可改变,高电平时 SDA 需稳定。

2025-09-17 20:16:19 865

原创 硬件(十一):EPIT、GPT、UART 外设配置

EPIT(Enhanced Periodic Interrupt Timer)是嵌入式处理器(如i.MX6ULL)内部的增强型周期性中断定时器,用于产生周期性中断、实现精准延时或对外部事件计数,可释放 CPU 资源,提升系统效率。GPT(General Purpose Timer)是通用定时器,可用于产生定时中断、实现延时功能,也能进行输入捕获(测量外部脉冲)和比较输出(控制引脚电平)等操作。

2025-09-15 20:09:51 1029

原创 硬件(十)IMX6ULL 中断与时钟配置

IMX6ULL 有多个 PLL 用于不同模块时钟供给,如 ARM PLL(PLL1)为 Cortex - A7 内核提供时钟,528 PLL(PLL2)作为系统 PLL,USB1 PLL(PLL3)用于 USB 模块等。对代码的修改是关闭的,尽量避免直接修改已有稳定运行的代码,以此保障代码的稳定性与可维护性。函数,实现中断源与处理函数的注册关联,遵循 OCP 原则,方便新增中断处理时,仅需注册而无需修改已有代码。函数通过中断号从向量表中调用对应的处理函数,完成中断响应。,存储不同中断源对应的处理函数。

2025-09-13 20:19:32 336

原创 硬件(九)寄存器、外设与中断机制

中断是一种硬件机制,当外设(如按键、定时器等)或内核内部发生特定事件时,会主动向 CPU 发送请求,使 CPU 暂停当前任务,转而去处理该事件(执行中断服务程序),处理完毕后再回到原任务继续执行。异常向量表存储各类异常(如中断、复位等)的处理入口地址。(Core Base Address Register)寄存器存储 GIC 的基地址。电源(上拉),另一端接地。常用,负责管理系统级功能(如内存管理、中断控制等)。寄存器,后续基于此地址访问 GIC 的各类寄存器。管理,需通过专门指令(

2025-09-12 22:20:09 622

原创 硬件(八)GUN工具链、Makefile 使用、SDK工具、内存段

bss 段:用于存放未初始化或初始化为 0 的数据,在运行时会被自动清零。例如(静态变量,全局或局部)、(显式初始化为 0 的全局变量)。COMMON 段:存放未初始化的非静态全局变量,链接时才确定最终大小和位置,允许多个目标文件定义同名符号。比如(未初始化的非静态全局变量)。.data 段:存放已初始化的全局变量和静态变量(非零值),需要在程序文件中保存实际的初始值。像(初始化为非零值)、(初始化为非零数组)。.rodata 段(只读数据段):存放程序的只读数据,运行时受保护不可修改。

2025-09-11 21:04:44 977

原创 硬件 (七) ARM 软中断, IMX6ULL 点灯

理解处理器架构(ARM 模式、异常、指令)→ 掌握外设控制(引脚复用、寄存器操作)→ 熟练工具链使用(编译、链接、烧写)。从软中断的 “权限切换”,到 IMX6ULL 点灯的 “外设控制”,每一步都是对底层原理的理解。

2025-09-10 21:23:32 845

原创 硬件(六)arm指令

通过 MRS(Move to Register from Special register)读取特殊寄存器的值到通用寄存器,再通过 MSR(Move to Special register from Register)将修改后的值写回特殊寄存器,从而实现模式切换。用于比较两个寄存器的值或一个寄存器与立即数的值,原理是对两个数求差,看结果是否为 0,会无条件修改。2、把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;

2025-09-09 21:57:32 819

原创 硬件(五) 存储、ARM 架构与指令系统

ARM 指令集为 32 位精简指令集(RISC),指令格式统一、执行效率高,核心指令包括数据传送、算术运算等,而 “立即数” 的合法性判断是指令使用的关键难点。ROM(只读存储器)断电后数据不丢失,主要用于存储永久或半永久数据(如启动程序、固件),其发展核心是 “可擦写性” 和 “易用性” 的提升。异常是 ARM 处理器响应外部事件(如中断)或内部错误(如内存访问失败)的机制,核心是 “异常向量表” 和 “固定处理流程”。不同的工作模式下,各自管理不同的栈(SP和LR);

2025-09-08 20:15:40 1128 1

原创 硬件(三) 通信方式、串口通信

其中 smod 是 PCON 的 B7 位(0 或 1,SMOD=1 时波特率翻倍),focs 是晶振频率(如 11.0592M),bps 是目标波特率(如 2400),2^8因用 8 位自动重装定时器工作方式。设备间除数据线(SDA),还有时钟线(SCL),发送方控制时钟线变化,每发一个比特,时钟线都按规则改变,就像合唱团靠指挥员控制节奏,大家按节奏唱歌,IIC、SPI 都用这种方式。通信双方能发也能收,不过不能同时干这两件事,好比和人交替说话、倾听,你说时对方听,对方说时你听,常用于对话类场景。

2025-09-05 20:46:02 1270

原创 硬件(二) 中断、定时器、PWM

单片机的定时器有两个16位的计数器(自增),每经过一个机器周期,计数器就会自动加一;如果当前CPU可以暂停处理该中断,转而去处理优先级更高的中断,处理结束后,再去处理当前处理的优先级较低的中断的话,这样的过程就叫中断嵌套。1.中断:CPU再执行当前事情的时候,外界发生了紧急事件的请求,然后要CPU暂停当前正在执行的事情而去执行这个紧急事件,处理完紧急事件,转而继续回到原来被打断的地方继续原来的工作;4.就是存储中断函数的指针的数组,中断函数共有八种,分别是四个外部中断,三个定时中断,还有1个串口中断。

2025-09-04 22:49:53 896

原创 硬件(一)51单片机

是MCU/MPU上的“通用引脚接口”,是一组可灵活配置的“多功能引脚”,能通过软件配置为输入、输出或复用功能,实现与外部设备的“简单交互”。// reg寄存器从第2位开始,连续4位清零(0x0F为4位1)#define P2 *((unsigned char *)(0xA0)) // 地址0xA0强转为指针。将 CPU、内存、I/O 接口等集成在单一芯片上的微型计算机系统,侧重于对外设的控制而非高效数据处理。//reg寄存器第m位和n位置1。

2025-09-03 21:16:10 911

原创 Linux 软件编程(十四)网络编程:数据存储与 SQLite 数据库

数据存储是程序开发的重要环节,内存存储适合临时数据,硬盘存储(文件、数据库)保障数据持久化。SQLite 作为轻量型关系数据库,凭借开源免费、跨平台、易嵌入等特性,成为众多场景的优选。

2025-08-29 18:13:00 966

原创 Linux 软件编程(十三)网络编程:TCP 并发服务器模型与 IO 多路复用机制、原理epoll

为监测的文件描述符数量。成功返回文件描述符,失败返回-1。为超时时间(-1表示阻塞)。创建文件描述符集合,操作文件描述符集合。

2025-08-28 19:40:50 442

原创 Linux 软件编程(十二)网络编程:TCP 并发服务器构建与 IO 多路复用

多进程模型资源开销大但安全;多线程模型轻量但需注意同步;线程池模型优化线程资源管理,适配高频任务场景;IO 多路复用(selectpollepoll)让单进程实现多fd监测,高效处理并发连接。

2025-08-27 20:07:04 1019

原创 Linux 软件编程(十一)网络编程:TCP 机制与 HTTP 协议

TCP 核心:通过 “三次握手建连接、四次挥手断连接、序列号 + 确认号应答、滑动窗口控速率”,实现可靠且高效的传输。HTTP 核心:基于 TCP 传输,用请求 - 响应模式交互,通过 URL 定位资源,用状态码反馈结果,是万维网的 “通信语言”。爬虫本质:自动化的 HTTP 请求 - 解析工具。

2025-08-25 21:14:40 1189

原创 Linux 软件编程(十)网络编程:网络协议,UDP 与 TCP 知识点

UDP 和 TCP 的核心区别连接性:UDP 无连接,TCP 有连接可靠性:UDP 不可靠,TCP 可靠数据形式:UDP 面向数据包,TCP 面向数据流开销:UDP 开销小,TCP 开销大适用场景:UDP 适用于实时通信,TCP 适用于可靠传输TCP 三次握手和四次挥手的意义三次握手:确保双方收发能力正常,避免无效连接四次挥手:保证双方都已完成数据传输,避免数据丢失TCP 粘包问题的本质源于 TCP 的流式传输特性,没有数据包边界,需在应用层解决TCP 编程的核心要点。

2025-08-24 13:17:53 980

原创 Linux 软件编程(九)网络编程:IP、端口与 UDP 套接字

在 Linux 下,进程间通信(IPC)不仅可以发生在同一台主机上,也可以通过网络实现不同主机之间的通信。IP地址网络位不变,主机位全为0,则为该IP地址的网段号。IP地址网络位不变,主机位全为1,则为该IP地址的广播号。

2025-08-22 22:52:38 1268

原创 Linux软件编程(八)进程间通信(信号、共享内存、信号量、消息队列)

函数类型应为 sighandler_t handler 型,即typedef void (*sighandler_t)(int);类型的函数, 此函数返回值类型为void型,形参类型为int型,eg: void handler(int signum);:此处填要处理的信号的编号或名字(eg: 10 或者 SIGUSR1 代表用户自定义的信号 )(3)函数的地址:以捕获方式处理(自定义)(传入自定义的函数名即可即为函数的首元素地址)seconds:设置的闹钟的定时时间。

2025-08-19 22:03:49 843

原创 Linux软件编程(七)线程间同步与进程间通信

让多个线程在执行某个任务时,具有先后顺序的执行。

2025-08-18 22:06:25 288

原创 Linux软件编程(六)(exec 函数族、system 实现、进程回收与线程通信)

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

2025-08-16 20:42:00 176

原创 Linux软件编程(五)(exec 函数族、system、线程)

通过fork()execvp()手动实现system功能:int i = 0;} return 0;return 0;

2025-08-15 20:15:35 580

原创 Linux软件编程(四)多任务与多进程管理

多任务指系统能够同时处理多个任务的能力。多进程多线程进程间通信(IPC)

2025-08-14 21:18:35 635

原创 Linux Framebuffer(帧缓冲)与基本 UI 绘制技术

用户界面技术,用于实现图形化交互。在 Linux 中,**framebuffer(帧缓冲/帧缓存)**是内核提供的一套图形显示接口,使用户程序可以直接操作显存实现显示效果。

2025-08-13 21:24:00 327

原创 Linux软件编程(三)文件操作-文件 I/O

该代码是一个简单的C语言程序,用于读取指定文件内容并输出到标准输出(屏幕)。程序通过命令行参数接收文件路径,以只读方式打开文件并逐块读取内容。提供给应用层的一套文件操作方法,直接通过系统调用实现,移植性相对较弱,但能精确控制文件和硬件的读写。是内核为已打开文件分配的标识符,类型为小的非负整数。(Linux 默认支持 1024 个打开文件):打开文件并获得文件描述符(fd)封装了系统调用,带缓冲区(效率高)成功:文件描述符(非负整数):关闭文件,释放文件描述符。用文件 I/O 实现。、文件关闭、程序结束。

2025-08-12 22:01:32 372

原创 Linux软件编程(二)文件操作-标准 I/O (补齐)

BMP(bitmap)是未压缩的位图格式,文件头中包含尺寸、色深等信息。标准 I/O 以流的形式进行数据传输,支持文本和二进制数据。:获取文件位置指针相对于文件开头的偏移量(字节数)。:要分割的字符串(第一次调用时传原字符串,之后传。定位到指定位置写入数据,可预分配磁盘空间。:将文件位置指针移动到开头(等价于。字节的数据从内存写入到文件中。成功:实际读取到的元素个数。(块拷贝,适合二进制文件)成功:实际写入的元素个数。字节的数据到内存中。读到文件末尾:返回 0。文件的文件头,打印其。:要写入数据的首地址。

2025-08-11 21:39:39 352

原创 Linux软件编程(一)文件操作-标准IO

以字符流形式存储,可用文本编辑器查看(内容是可读字符,如。)存为二进制数据,不按可打印字符展示(查看会有不可见字节)。:传递给主函数的实参个数(包括程序名)。常见有两套接口:C 标准库(标准 I/O,流)和内核提供的系统调用(文件 I/O)。表示文件流(字节流),通过它进行读写操作。第 1 章:用户命令(Shell 命令)第 3 章:库函数(C 标准库函数):只写,存在则清空,不存在则创建。:读写,存在则清空,不存在则创建。的功能(逐字符读取并输出)。返回类型在内存占用(字节),

2025-08-09 18:54:41 377

原创 数据结构(六):树与二叉树

树(Tree)是由 n(n ≥ 0)个节点组成的有限集合,当 n = 0 时称为空树。非空树中:有且仅有一个根节点(Root);其余节点可以划分为若干个。

2025-08-08 21:54:59 464

原创 数据结构(五):顺序循环队列与哈希表

哈希表(又称散列表)是一种以查找效率高为特点的数据结构。它通过一个称为“哈希函数”的映射,将关键字(key)转换为一个地址,从而将数据直接存储在对应位置。这个映射函数f(key)就是哈希函数。散列技术既是一种存储方式,也是一种查找策略。顺序循环队列:掌握其基本结构、判空/判满逻辑及基本操作哈希表:理解散列函数设计思路、冲突处理机制以及应用场景。

2025-08-07 22:11:31 972

原创 数据结构(四)内核链表、栈与队列

Linux 内核链表是一种高效的双向循环链表,广泛应用于内核模块开发中,用于管理数据结构。每个节点通过指针连接前一个和后一个元素,实现插入和删除的高性能。在 Linux 内核中,链表的实现依赖于结构体,定义在头文件为了在自定义结构体中集成链表,只需在结构体中包含list_headint value;链表初始化使用如下宏:// 静态初始化// 或者// 动态初始化这两种方式都将list.next和list.prev指向自身,构成一个空的循环链表。

2025-08-06 22:47:31 908

原创 数据结构(三)双向链表

make是一个自动化构建工具,主要用于管理 C/C++ 项目的编译和链接过程。它通过读取Makefile文件中定义的规则,自动判断哪些文件被修改,并仅重新编译这些部分,从而大幅提高构建效率。Makefile是make构建目标(如:最终生成的可执行文件)依赖关系(如:源代码、头文件)构建命令(如:gcc 编译命令)通过Makefile,我们可以实现对大型项目的自动化编译管理。CC = gcc$(变量名。

2025-08-05 22:09:24 429

原创 数据结构(二)

核心逻辑:每过三个结点就需要进行一次结点的删除,因此同样需要快慢指针,快指针定位需要删除的结点,慢指针保证链表任然是一个环。核心逻辑:定义两个指针,一个块指针和一个慢指针,快指针一次的跨度为慢指针的n倍,当快指针为空,慢指针刚好到倒数第n个结点。核心逻辑:定义两个指针,一个块指针和一个慢指针,快指针一次的跨度为慢指针的2倍,当快指针为空,慢指针刚好到中间。核心逻辑:定义两个指针,一个块指针和一个慢指针,快指针一次的跨度为慢指针的n倍,打开 VMware → 选择你的虚拟机 → 设置 → 网络适配器。

2025-08-04 22:05:46 814

原创 C语言(十)

函数是面向过程编程思想的具体体现,主要作用:降低程序之间的耦合性提高代码的复用性和可维护性一个完整的 C 程序由**一个或多个程序模块(源文件)**组成。为便于开发与调试,通常会将代码拆分为多个源文件,并组合成一个整体程序。每个源文件是一个编译单位,即 C 编译器以“源文件”为单位进行编译。程序从main()函数开始执行,调用其他函数后,执行完再返回到main(),最终在main()结束程序运行。用户根据需要自定义提高模块化和代码复用能力。

2025-07-24 20:33:53 476

原创 C语言(九)

类型说明符 数组名[常量表达式1][常量表达式2];常量表达式1:表示行数;常量表达式2:表示列数。表示一个3行4列的二维整型数组,共有3 × 4 = 12个元素。本质上,二维数组是多个一维数组组成的线性结构。表示有 3 个字符串,每个字符串最多 99 个字符 + 1 个\0结束符。每行是一个字符串(自动添加\0结束符)。

2025-07-23 21:02:12 335

原创 C语言(八)

char 数组名[元素个数];说明:方括号[]是类型说明符的一部分,数组容量应满足字符串加结束符\0的需求。

2025-07-22 19:40:22 892

原创 C语言(七)

理解的过程为:a[0]与先与a[1]进行比较,如果a[0]比a[1]的大,则a[0]与a[1]里面的数值交换,如果不大,则不变,然后a[0]再与a[2]进行比较,重复与a[1]的比较操作,一直到与a[7]做完比较,此时a[0]内的数是这组数的最小值,放最前面,之后再用a[1]与a[2]进行比较,重复之前的比较过程,又可以找出这组数的第二个最小值放到a[1]中,然后a[3]再与之后位置的数进行比较,重复之前操作,一直到a[6]这个数与a[7]比较重复之前的比较操作,得到升序的数组并输出。

2025-07-21 21:19:21 632

空空如也

空空如也

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

TA关注的人

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