自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux内核驱动——DHT11温湿度传感器

定义设备名dht11,作为杂项设备和平台驱动的标识;全局变量dht11_gpio存储从设备树解析到的 DHT11 数据线对应的 GPIO 编号,实现 GPIO 资源的动态获取。

2026-02-11 18:51:24 1049

原创 Linux内核驱动--IIC子系统

Linux I2C 子系统是内核提供的分层式软件框架,核心作用是解耦 I2C 硬件与软件开发,屏蔽底层总线时序、控制器差异等细节,让开发者聚焦外设功能实现。该子系统分为应用层(文件 IO 操作设备节点)、内核核心层(管理驱动匹配 / 数据传输)、总线驱动层(实现硬件时序)、硬件层(控制器 + 外设)四层,通过标准化接口完成数据交互。基于该框架开发 I2C 外设驱动(如 LM75)时,核心是实现驱动匹配、probe 初始化、文件操作接口,应用层可通过标准文件 IO 与驱动交互,大幅降低开发复杂度。

2026-02-10 19:19:07 905

原创 Linux内核中--中断顶半部与底半部

底半部(Bottom Half):在安全、宽松的上下文中完成所有非紧急但必要的后续处理,可睡眠、可被抢占、中断已开启,不影响系统实时性。在执行期间,本地 CPU 的中断通常被屏蔽(至少是该 IRQ 线),以保证原子性。进程上下文:进程相关代码、open、read、write。中断上下文:中断处理相关代码、中断服务程序、软中断、tasklet 不能休眠、阻塞,不能被调度。上下文:内核线程(kworker)上下文 → 进程上下文。顶半部(Top Half):快进快出,绝不拖延。等),否则会导致内核崩溃或死锁。

2026-02-10 18:54:35 591

原创 Linux 中断驱动程序--按键中断驱动

非轮询机制:相比传统的 while 循环读取 GPIO 电平,这种 中断 + 等待队列 的方式更加高效,不占用 CPU 资源。设备树解耦:驱动代码不包含具体的硬件地址,而是通过设备树节点(/ptkey)动态获取 GPIO 和 IRQ,提高了驱动的通用性。阻塞 I/O:wait_event_interruptible 和 wake_up_interruptible 是成对使用的宏/函数,是实现阻塞型驱动的标准范式。

2026-02-09 19:03:59 590

原创 Linux Platform Driver 框架

寄存器功能设置引脚复用功能(选择为 GPIO)设置电气特性(上拉、速度等)GPIO1_GDIR方向寄存器(输入/输出)GPIO1_DR数据寄存器(读写电平)[0] = {},[1] = {},[2] = {},[3] = {.start, .end:物理地址范围(通常是 4 字节).name:便于调试识别.flags = IORESOURCE_REG:表示这是寄存器资源。

2026-02-09 18:34:29 794

原创 Linux 驱动开发:杂项设备驱动与自动设备号管理

misc 是 "miscellaneous" 的缩写,用于处理那些不归属于特定类别的小型、简单设备,如 LED、按键、蜂鸣器、ADC 等。自动分配设备号自动创建 /dev/xxx 节点无需手动执行 mknod轻量级、易于维护特性传统字符设备misc设备设备号手动分配自动分配设备节点需mknod自动生成管理复杂度高低适用场景复杂设备(如网卡、串口)简单设备(LED、按键、蜂鸣器)是否支持热插拔支持(配合 udev)支持(默认支持)

2026-02-05 19:46:27 621 1

原创 Linux内核驱动--设备驱动

open():设备打开时调用(如 fd = open("/dev/demo", O_RDWR))release():close(fd) 时调用,释放资源read() / write():核心数据传输函数字符设备驱动是 Linux 最基础的驱动类型,用于以字节流方式访问硬件(如 LED、串口、传感器等)。通过 file_operations 结构体将用户系统调用(open/read/write/ioctl)映射到内核函数。通过 cdev_add() 注册设备。

2026-02-04 19:10:40 645

原创 Linux内核驱动-内核编译

n");return 0;\n");环境准备:安装交叉编译工具链(如 arm-linux-gnueabihf-),获取并解压内核源码。配置内核:使用默认配置(如 imx_alientek_emmc_defconfig)生成 .config 文件,并通过 menuconfig 图形界面进行细粒度功能选择。编译内核:执行 make all -jN 生成 zImage、Image 等内核镜像文件。

2026-02-03 18:48:30 554

原创 Linux内核驱动--U-Boot、内核加载与 rootfs 挂载

类别变量功能网络ipaddrserveripethaddr配置网络连接TFTP下载内核镜像启动参数bootargs传给内核的启动选项根文件系统指定 NFS 根目录初始化指定第一个用户进程。

2026-02-02 18:38:10 705

原创 SPI通信协议详解:从基础概念到硬件配置与编程实现

SPI(Serial Peripheral Interface,串行外设接口)是一种的串行通信总线协议,广泛用于微控制器(MCU)与各种外围设备(如传感器、存储器、显示屏、ADC/DAC 等)之间的短距离通信。

2026-01-29 19:28:27 1151

原创 LCD驱动开发:行场扫描与时序

分辨率与像素分辨率:800 × 480,表示屏幕由 800 列 × 480 行的像素点组成。每个像素点由 红(R)、绿(G)、蓝(B) 三个子像素构成,通常采用 RGB888 格式(每通道 8 位),共 24 位颜色深度。

2026-01-28 19:40:53 1108

原创 ADC--模数转换器

四、代码讲解//复用功能配置//电气特性//ADC配置 ADC 使用的 GPIO 引脚(复用功能和电气参数)。设置 ADC 控制寄存器(如采样时间、分辨率等)。执行 ADC 校准并验证是否成功。触发一次 ADC 转换。等待转换完成,并读取 12 位原始数字结果。调用 get_adc_value() 获取数字值。按公式 电压 = 数字值 × 3.3V / 4096 转换为实际电压(假设参考电压为 3.3V,12 位精度)。

2026-01-27 18:30:58 1232

原创 I2C(IIC)通信协议

I²C(Inter-Integrated Circuit),中文名为“集成电路总线”,是一种由 Philips 公司(现 NXP)在 1980 年代推出的串行通信总线协议。它广泛应用于嵌入式系统中,用于连接低速外设,比如 EEPROM、实时时钟(RTC)、传感器、OLED 显示屏等。

2026-01-26 18:49:25 1814

原创 ARM——UART串口通信

在嵌入式系统中,通信是指两个或两个以上的主机之间的数据互交,这里的主机可以是计算机也可以是嵌入式主机,甚至可以是芯片。

2026-01-23 19:28:33 1209 1

原创 ARM——定时器(EPIT GPT)

定时器是嵌入式系统中的重要组件,用于产生精确的时间延迟、测量时间间隔、执行周期性任务以及提供系统时基。在i.MX6ULL处理器中,定时器模块通过内部时钟信号进行计数,当达到预设值时可触发中断或执行特定操作。

2026-01-22 20:22:13 595

原创 ARM——时钟系统

定义:时钟系统是整个系统的心脏,它决定了处理器、外设以及总线的运行速度。

2026-01-22 19:58:24 489

原创 ARM架构—— IMX6ULL芯片

IMX6ULL 的 GPIO 属于 IOMUXC(输入输出复用控制器)和 GPIO 模块共同管理,点灯本质是将指定引脚配置为 GPIO 输出模式,并控制其高低电平。和。

2026-01-20 20:09:22 498

原创 ARM基础知识2

ARM 汇编中的立即数特指12 位立即数(imm12),是指令中直接包含的常量数值,无需从寄存器或内存读取,可直接参与 ADD、SUB、MOV 等指令的运算。

2026-01-18 22:13:22 423

原创 ARM基础知识

处理器指令集架构:x86(CISC),ARM(RISC),MIPS(RISC),RISC-V(RISC)当前程序状态寄存器 CPSR 的内容,复制到对应异常模式的保存状态寄存器 SPSR_<mode>CISC(Complex Instruction Set Computer):复杂指令集。恢复CPSR,将处理器状态、中断使能位等恢复到异常发生前的状态。恢复PC的值,跳转到异常发生前的代码继续执行。设置中断禁止位屏蔽同级或更低优先级的中断 (改变处理器模式进入相应的异常模式。禁止不精确的数据异常。

2026-01-16 20:08:49 777

原创 51单片机——DS18B20

二、DS18B20温度采集流程。三、DS18B20操作时序。

2026-01-15 15:32:15 341

原创 51单片机——UART

奇校验的校验位为'1',若数据位中'1'的个数加上校验位的'1',保持'1‘的总。偶校验的校验位为'0',若数据位中'1'的个数加上校验位的'0',保持'1'的总。从机:从机不能直接发起通信,根据主机下发的指令完成对应的控制,并回复给主机应答。遵循LSB优先原则,低位先行。主机:主机拥有对通信的绝对控制权,通信都是由主机发起。不足:无法判断偶数个bit出错的问题。个数是奇数个,代表奇校验通过。个数是偶数个,代表偶校验通过。

2026-01-14 18:59:21 620

原创 51单片机——GPIO 中断 定时器 PWM

当CPU正在执行某个任务的时候,此时外界发生了一个紧急的事件,要求CPU能够暂停当前的任务,转而去执行这个更为紧急的事件,执行完这个紧急事件再回到刚才被打断的地方,继续执行,这个过程叫做中断。定时器内部有个16位的计数器,给定计数器一个初值,会按照1us的速率进行自增,加到65535溢出时向CPU发起中断请求,CPU响应定时器中断并执行中断处理函数。采用上拉输入模式的按键电路,按键未按下时引脚默认高电平,按下时引脚与 GND 短路变为低电平,程序只需检测引脚是否为低电平即可判断按键是否按下。

2026-01-13 18:16:03 627

原创 嵌入式——51单片机的基本知识

将所有发光二极管的阳极连接到VCC,发光二级的阴极接到单片机的引脚,此时阳极输出高电平,给对应单片机引脚低电平,满足发光二极管的单向导通性,电流会从阳极流向阴极,LED被点亮。2. Atmel -> AT89C51、Philip(P89V51 增强型单片机,支持单片机ISP在线编程)、STC(宏晶。51单片机上搭载了4位共阴极数码管,每一个数码管可以独立显示一个数值,但在同。数码管在同一时刻只能显示一位,但利用人的肉眼视觉暂留效应(余晖效应),在某。1.阳极:是 P 型半导体引出端(电流流入端)

2026-01-12 19:14:53 652

原创 综合项目实战--电子商城项目

本研究设计并实现了一款基于 Linux 平台的轻量级商品展示与查询 Web 系统。系统采用 C 语言开发,通过 Socket 网络编程构建 Web 服务器,集成 SQLite 嵌入式数据库实现数据存储与查询,核心功能涵盖用户登录验证、商品列表展示、关键字搜索及商品详情查看。该系统基于 Linux,以 C 语言 + Socket+SQLite 开发,实现登录验证、商品展示、搜索及详情查看功能,适用于网络编程课程设计,助力理解底层通信与数据库集成技术。

2026-01-08 20:22:37 769

原创 数据库管理

数据库---->数据表(行,列)---->一条记录(行)---->字段(列)。2.名词:DB 数据库 select update database。数据库可以存储数据,提供对数据的统计,数据的相关管理(增删改查)。指令:.database 查看数据库关联的文件。3.关闭数据库 sqlite3_close。.q .quit .exit 退出数据库。1.打开数据库sqlite3_open。.table 查看数据库中的表。定义:数据库就是数据的集合。4、文件型数据库,可以移动。DBMS 数据库管理系统。

2025-12-29 20:22:41 214

原创 IO多路复用

定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力作用:1.在tcp server中使用,处理多个客户端的请求。2.对多个会阻塞的设备,进行io操作。那个设备数据先就绪(可读或刻写),就及时处理。

2025-12-28 20:54:41 309

原创 HTTP协议

2.选择网络设备 ,本机通信,loopback. 外网通信, ens33. 如果不确定,选择any . (适用linux)HTTP(超文本传输协议):运行在 TCP 之上的应用层协议,负责将服务器的网页数据准确、可靠地传输到客户端浏览器。HTTP的URL格式:http://主机名:端口号/路径,默认端口 80 可省略,HTTPS 默认端口 443 同理。TTL:表示生存周期(64) ,数据每过一个网络节点,计数减一.如果计数为0 ,当前网络节点,放弃转发数据。F 终止连接,标识发送方无数据再发送。

2025-12-25 20:50:47 383

原创 TCP传输控制协议

当下载进度达到 90% 时,自身会向新接入的客户端上传已获取的数据,整个过程中,自身兼具下载者与上传者的双重身份,既是客户端,也是服务器。2. 服务器接收后,回复SYN+ACK 报文,确认客户端请求,同时携带自身初始序列号。3. 被动关闭方数据发送完毕后,向主动关闭方发送FIN 报文,关闭自身发送通道。3. 客户端接收服务器的 SYN 报文后,发送ACK 报文确认,连接正式建立。2. 被动关闭方回复ACK 报文,确认收到关闭请求。四次挥手:1.主动关闭方向被动关闭方发送FIN 报文,关闭自身发送通道。

2025-12-24 20:58:49 436 1

原创 系统网络编程

负责物理相邻的主机间的数据传输,主要作用包括物理地址寻址、数据帧封 装、差错控制等。负责把主机中的数据转换成电信号,再通过网络介质(双绞线、光纤、无线信道等)来传输。server:socket()---bind()---recvfrom()---close() 一个。网络层:IP(互联网协议) ICMP(互联网控制管理协议) RIP OSPE(路由协议)client:socket()---sendto() -----close() 多个。//虚拟机网络配置文件 ,设置ip(手动分配,或自动分配)。

2025-12-23 21:37:32 338

原创 系统编程中线程

线程是轻量级的进程,线程属于某个进程。并发,和进程相同。相对比较耗时的任务。1.进程是系统中最小的资源分配单位。2.线程是系统最小的执行单位。3.进程中,线程与线程是平级关系。4.在进程中,默认有一个线程,即主线程。

2025-12-16 20:22:33 269

原创 系统编程—进程2

写时复制:Linux2.6及后续版本中,子进程通过fork创建时采用写时复制机制:fork刚完成时,子进程并不单独开辟空间,而是与父进程共享全部内存;1.僵尸进程:父进程创建子进程后,子进程先消亡。2.exit() c库函数,会执行io库的清理工作,关闭所有的流,以及所有打开的文件。1.main中return :触发进程退出,return 的值作为进程退出码。2.孤儿进程:父进程创建子进程后,父进程先消亡。子进程会寻找新的父进程。WTERMSIG(status):如果是信号终止的,那么是几号信号。

2025-12-14 22:17:40 170

原创 系统编程-进程

a.out 需把自身状态信息(PCB、硬件寄存器、PC、内存相关数据)缓存到硬盘,释放内存后,b.out 将缓存的自身数据读入内存,开始运行。3、 守护进程 进程会自动运行,默认不需要输入,处于休眠状态。1.Linux 系统中有多个需运行的任务(进程),但 CPU 仅有一个,因此需合理安排下一时刻运行的进程。1、交互式进程 进程运行后需要用户的输入,在给出对应的输出。3.子进复制父进程的0到3g空间和父进程内核中的PCB,但pid号不同。定义:进程时一个程序执行的过程,回去分配内存资源,cpu资源。

2025-12-11 21:00:00 283

原创 系统编程(Linux系统编程)

/s:表示一个字符数组 size:最多读多少个字符 stream:需要读数据的文件流指针。// c:写入文件的字符 stream:写入数据的文件流指针 返回值EOF为失败。// stream:需要操作的文件流指针,fopen为申请资源,fclose为释放资源。//s:需要写入文件的字符串 stream:需要写入数据的文件流指针。//pathname:需要被操作的目录+文件名 mode:操作模式。// stream:需要读数据的文件流指针。man man 所有man的帮助。

2025-12-08 20:38:08 422

原创 数据结构中的队列

定义:队列是只允许在一端进行插入,而在另一端进行删除操作的线性表。特性:先进先出(FIFO)。常用操作及概念1.入队:添加队列元素。2.出队:删除队列元素。3.队尾:允许插入的。4.队头:允许删除的。

2025-12-04 19:49:14 282

原创 数据结构中的栈

系统栈,是0~3G内存中的一段(8M), 存储 函数的调用关系, 局部变量,参数,返回地址。满栈, top指针指向的地址,是最后入栈的元素的位置。定义:栈是限定仅在表尾进行插入和删除操作的线性表。增栈,新增元素元素后。Top指向的内存地址慢慢变大。减栈,新增元素元素后。Top指向的内存地址慢慢变小。空栈, top指针指向的地址,是新元素待插入的位置。数据结构栈,内存空间在堆空间中开辟。应用:递归,回溯问题。和 优先级有关的问题。区别: 数据结构中的栈 和 系统中栈的关系。工作原来,一样,先进后出。

2025-12-03 19:05:07 190

原创 数据结构与算法

线性表,本质的是一个容器。存储什么类型的数据,都是可以的。需要的时候 malloc,不需要的时候free。,线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续。1 假设数据元素本身是多个(大量的),需要的内存相对就要大小。2,无法动态存储(容器,在程序运行的时候,才确定内存空间的大小。解决顺序存储的缺点,插入和删除,动态存储问题。1,无需为表中的逻辑关系增加额外的存储空间,1,插入,删除元素需要移动元素o(n)线性表的内存空间都在 堆空间。线性表顺序存储的优点,缺点。

2025-12-01 21:07:41 219

原创 数据结构与算法

数据元素:描述一个相对完整的一个事物,就会很多的属性,这里的属性被称为 数据项。数据存放的存储单位是随机或任意的,可以连续也可以不连续。广义: 如何把数据高效储存在计算机的内存中,方便后续使用(增,删,改,查)。2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。1.线性存储 ,在内存连续存储,数据存放在连续的存储单位中。数据:输入,输出,还提供基本的操作。1,输入,输出特性,输入时可选的,输出时必须的。数据对象:是数据元素的集合。3,确定性,同一个输入,会得到唯一的输出。

2025-11-30 19:40:03 188

原创 c语言中指针2

这里的add,sub,会在程序运行起来后,根据不同情况会被调用。一维数组的数组名是,指向第一个元素的指针。对一维数组的数组名 & :值不变,类型就升级为 数组 指针 , 第一行元素的指针。二级指针变量中存储是一个地址,在解引用后,存储的还是一个地址。a是数组名字,也是一个指针常量, a指向的a[0]元素的地址。*,地址值不变 , 类型就会降级,指向数组中第一个元素的指针。指针函数返回的地址,可以作为下一个函数的参数,传递。应用,在被调函数中,需要修改指针的指向。本质,是一个指针,指针指向的了一个函数。

2025-11-23 20:04:09 130

原创 C语言中指针

实参(主调方传入)将值传递(复制)形参(被调方接收)。如果在被调函数内部修改形参,实参不会改。如果传递的是一个字符串数组的,那边被调函数在设计时候,就只需要一个指针接收实参传递的数组名.实参将自己的地址给形参,形参是一个指向实参的指针,可以通过间接访问的方式,访问到实参的。不需要第二参数(长度)。原因是 c语言字符串都是以'\0'结尾。数组的数组名是指向第一个元素的指针常量。数组名的类型可理解为 int *形参是实参的一个复制品。内容(可以读写实参的内容)。一、指针作为函数的参数。字符数组和字符串的传递。

2025-11-19 21:40:34 218

原创 C语言中指针

在解引用操作过程中,和指针的类型有关。从首地址开始,加上 sizeof(基类型)大小后,在取出内存。1.小端字节序:数据的低数据位,在内存的低地址,数据的高数据位,在内存的高地址。2.大端字节序:数据的低数据位,在内存的高地址,数据的高数据位,在内存的低地址。2.根据类型 ,从首地址开始,加上 基类型大小后,在取出内存中的数据。2.*解引用 ,获得指针变量指向空间的内容。操作对象是指针,或地址。注意:取地址操作只能操作变量,不能操作表达式,常量。1.&取地址运算符,获得对应变量的内存的首地址。

2025-11-18 20:34:52 189

空空如也

空空如也

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

TA关注的人

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