自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 总结 - 进程间通信、线程间通信

进程间空间是独立的,没有共享的用户空间,可以利用Linux内核实现多个进程间的通信进程间常见的通信方式有:传统Unix系统中的通信方式:管道、信号SYS V分支中的通信方式:消息队列、共享内存、信号灯。

2026-03-06 19:06:44 498

原创 总结 - 进程与线程

概念:进程是程序动态执行的过程,系统中最小的资源分配单位进程空间:在每个进程运行起来后,操作系统会为其开辟 0 - 4G 的虚拟内存空间,这个虚拟内存空间即为进程空间进程空间 = 用户空间 + 内核空间,用户空间 = 数据段 + 文本段 + 系统数据段(堆 + 栈),其文本段(.text):用于存放代码和指令数据段:.rodata 段用于存放字符串常量.data 段用于存储已经初始化的静态/全局变量,这些变量的初值在编译时就已经确定,并直接保存在最终的二进制文件中。

2026-03-06 19:06:32 397

原创 网络复习 - 概念、tcp与udp

--.---.---.1 代表路由器或解调器的默认网关和管理后台入口,---.---.---.255带包该网络的广播地址 ,---.---.---.0指代网络本身。粘包问题:由于TCP是一种面向字节流的、无消息边界的传输协议,应用程序下一次读取时,就可能一次性读到多个数据包的内容,造成粘包。UDP 是无连接、面向报文的广播式传输协议,它适用于实时性要求高于数据可靠性的场景,能够容忍少量的数据丢失。网关:主要负责数据路由和转发,根据目标IP地址,为数据包选择合适的路径,将其从一个网络发送到另一个网络。

2026-03-03 19:12:06 781 1

原创 ARM裸机总结

如上图所示为各工作模式下使用的寄存器其中 r0 - r14为通用寄存器,r15 为 pc 程序计数器,存储着下一条要执行指令的地址,sp 为栈顶指针寄存器, lr 为链接寄存器,主要用于存储程序执行流程中的关键控制信息,cpsr 为程序当前状态寄存器,spsr 为 cpsr 的备份。中断执行流程:中断源发出中断请求 --> Soc检查该中断是否被屏蔽 --> 查询中断优先级 --> 保护现场 --> 执行中断处理函数 --> 恢复现场。中断源指能够产生中断操作的事件。cpsr 寄存器的结构如下图所示。

2026-03-03 19:11:51 244

原创 Linux总结 - 驱动

i2c_hardware 层:具体硬件(I2C传感器)i2c_adapter:i2c适配器层,由驱动厂家实现i2c_core:提供i2c设备和驱动的注册、匹配及通信方法i2c_client/i2c_driver:遵循platform设备驱动分离思想,匹配成功之后执行probe函数。

2026-03-02 17:00:00 631

原创 Linux总结 - 系统移植

uboot是在操作系统之前运行的一段裸机程序,主要负责初始化硬件、引导内核启动、为Linux操作系统运行提供合适的环境。

2026-03-02 09:51:05 644

原创 Linux驱动--platform总线架构

本文介绍了Linux内核中的platform虚拟总线机制及其应用实现。platform通过总线-驱动-设备模型实现了片上外设的统一管理,支持三种匹配机制:设备树compatible匹配、设备名匹配和驱动名匹配。以LED驱动为例,详细展示了platform驱动的实现过程,包括设备树节点配置、驱动注册、probe/remove函数实现(GPIO初始化和资源释放)以及应用层交互接口(read/write操作)。该机制有效实现了驱动与设备的解耦,为嵌入式设备开发提供了标准化管理方案。

2026-01-19 14:02:49 83

原创 Linux驱动--基于驱动设备分离的按键中断驱动

摘要:本文介绍了设备树的基本概念和语法规则,包括.dts、.dtsi、.dtb等文件类型,以及节点、属性等语法结构。重点讲解了pinctrl子系统的引脚复用功能配置方法。在驱动实现部分,详细说明了按键中断驱动的开发流程:从设备树节点获取GPIO编号、申请GPIO、注册中断号,到实现中断处理函数和阻塞读取机制。最后给出了应用层通过设备节点读取按键状态的示例代码。整个流程涵盖了设备树配置到驱动开发的完整实现过程。

2026-01-17 16:09:50 821

原创 Linux驱动-- 二周目点灯--LED驱动

Linux字符设备驱动开发主要包括三个关键步骤:1)设备注册,通过alloc_chrdev_region()或register_chrdev_region()获取设备号,使用cdev_alloc()和cdev_add()构建设备类型;2)硬件资源映射,使用ioremap()将物理地址映射到内核虚拟地址空间;3)创建设备节点,通过class_create()和device_create()在sysfs中建立设备信息并自动生成/dev节点。开发过程需构建cdev结构体,关联设备号和file_operations

2026-01-16 14:50:42 951

原创 Linux驱动--驱动编译

本文摘要: Linux设备驱动主要分为字符设备(如键盘、串口)、块设备(如硬盘)和网络设备三类。驱动编译方式包括静态编译(集成到内核)和动态编译(模块化加载)。静态编译需修改Kconfig和Makefile,动态编译则生成.ko模块文件。文章提供了动态编译的VSCode编程框架示例,包括模块初始化/退出函数、许可证声明等核心结构,并给出了Makefile模板,说明如何指定内核路径、模块名称等关键参数。两种编译方式都需要正确配置Kconfig选项并通过menuconfig工具进行选择。

2026-01-14 20:03:41 660

原创 Linux内核--基于正点原子IMX6ULL开发板的内核移植

本文介绍了Linux内核移植所需的文件(bootloader、内核镜像、设备树文件、文件系统)及IMX6ULL开发板的硬件资源。重点分析了IMX6ULL启动流程:从上电执行BotROM代码开始,到uboot初始化硬件、加载内核,最终引导文件系统完成启动。文章详细说明了各阶段的任务,包括DDR初始化、uboot自搬移、内核参数传递等关键步骤,展示了从硬件初始化到系统交互的完整启动过程。

2026-01-14 18:00:00 691

原创 线程管理--线程邮箱

1、定义:线程邮箱是一种高效的线程间通信机制资源消耗低:避免了频繁的加锁与解锁操作,减少了系统开销响应速度快:线程只需要检查自己的邮箱即可获取需要的数据,无需主动抢占资源线程易管理:通过链表形式组织,便于线程的分配、调度与监控。

2025-10-21 12:59:12 251

原创 I2C通信协议

I2C是一种串行半双工同步通信协议,使用SCL时钟线和SDA数据线完成主从设备间的数据传输。其特点包括:通过设备地址实现多设备共享总线;利用开漏输出的线与特性实现冲突检测与仲裁;采用严格的时序规范,包括起始/停止信号、应答机制等。数据传输时MSB先行,时钟线高低电平分别控制数据采样和发送。读写时序包含地址选择、数据传送和应答反馈等步骤,支持单字节和页式读写操作。

2025-09-28 17:27:05 1311

原创 串口通信--UART

本文介绍了数据传输模式及UART通信协议。主要内容包括:1.数据传输模式对比,包括串行/并行通信、单工/半双工/全双工工作模式以及同步/异步通信;2.UART协议详解,说明其作为全双工异步串行通信的特点、波特率计算及数据传输过程;3.提供UART初始化、数据收发等C语言实现示例代码。文章重点阐述了UART在硬件资源占用、通信距离和灵活性等方面的优缺点,并给出具体寄存器配置和收发函数实现方法。

2025-09-26 17:24:28 639

原创 ARM裸机--中断

中断:中断是计算机系统中一种异步事件处理机制,允许CPU打断当前任务,转而执行优先级更高的任务,完成后回到原先的位置继续工作中断源:引发CPU中断的事件或设备,即能够向CPU发出中断的信号源中断按中断的来源可分为外部中断源(硬件中断)、内部中断源(软件中断)GIC是ARM架构中用于集中管理中断的硬件模块,负责接收、分类、优先级排序,并将中断路由到合适的处理器核心Distributor(分发器):全局管理中断优先级、路由和使能状态、决定将中断发送至哪个端口。

2025-09-24 17:41:09 914

原创 ARM裸机--时钟管理单元与定时器

时钟管理单元是嵌入式系统(如ARM架构芯片)中负责生成、分配和调控时钟信号的核心模块主要功能倍频/分频:通过锁相环、分频器组合生成不同频率的信号时钟分配:为CPU、总线、外设等提供独立时钟EPIT是专为周期性中断定时设计的32位向下计数定时器EPIO 定时器通常支持三种时钟源选择EPIO仅支持定时中断功能,不具备输入捕获、PWM输出等特性,适用于精准时间控制。

2025-09-22 19:03:26 1435

原创 嵌入式 - GPIO

GPIO 是嵌入式系统中用于与外部设备交互的通用接口。

2025-09-19 17:32:40 1117

原创 ARM裸机--启动代码

本文介绍了ARM启动代码的主要功能和实现方法。启动代码负责初始化异常向量表、配置工作模式栈指针、开启中断允许,并引导程序进入C语言主函数。详细说明了ARM的7种工作模式(用户/系统/管理/FIQ/IRQ/中止/未定义)及其应用场景,以及协处理器(如CP15)在系统控制中的作用。通过示例代码展示了启动代码的关键操作:包括伪操作定义段属性、协处理器配置、异常向量表初始化、工作模式切换和.bss段清零等。特别讲解了如何通过修改CPSR寄存器或使用CPS指令实现工作模式切换。这些操作共同确保ARM处理器正确初始化并

2025-09-18 10:13:37 1054

原创 ARM -- 汇编语言

本文摘要:ARM处理器基于RISC架构,具有7种工作模式和异常处理机制。汇编语言作为低级编程语言,具有硬件依赖性强、执行效率高的特点。文章详细介绍了ARM汇编指令的格式、伪操作、部分核心指令(如MOV、ADD、BIC等)及CPSR标志位。同时展示了如何用ARM汇编实现条件判断、循环结构和函数调用等C语言特性的方法,为嵌入式开发提供底层编程参考。

2025-09-08 19:55:49 1340

原创 Linux软件编程--网络操作

本文介绍了Linux系统中套接字文件的概念和TCP客户端/服务器模型。套接字文件是进程间通信的特殊文件,分为流式套接字(可靠有序)和数据报套接字(实时性强)。TCP C/S模型中,服务器通过socket()、bind()、listen()、accept()等函数建立连接,客户端通过connect()发起请求。详细解析了socket()、connect()、bind()、listen()、accept()等核心函数的功能参数和返回值。这些接口实现了基于TCP协议的网络通信机制,支持IPv4/IPv6地址,为进

2025-08-21 20:27:14 1068

原创 Linux软件编程--网络概述

本文摘要:计算机网络通过通信线路和网络设备连接计算机设备,在TCP/IP协议下实现数据通信和资源共享。核心概念包括:IP地址(32位二进制码,点分十进制表示)、子网掩码(划分网络/主机地址)、DNS(域名解析)和网关(网络协议转换)。网络通信需物理链路(硬件连接)和逻辑链路(协议控制)。OSI七层模型规范网络通信:物理层(比特流传输)、数据链路层(帧传输)、网络层(路由选择)、传输层(TCP/UDP协议)、会话层(会话管理)、表示层(数据格式转换)和应用层(用户程序接口)。

2025-08-21 19:34:58 1093

原创 Linux软件编程--IPC对象

摘要:IPC对象是Linux系统中用于进程间通信的内核数据结构,包括消息队列、共享内存和信号灯三种类型。它们存在于内核空间,生命周期独立于进程。系统提供ipcs/ipcrm命令查看和删除IPC对象。消息队列支持异步通信,接口包括msgget/msgsnd/msgrcv/msgctl;共享内存是最快的通信方式,通过shmget/shmat/shmdt/shmctl操作;信号灯用于进程同步,主要接口为semget/semop/semctl。每种IPC对象都有创建、操作和删除的系统调用,通过key值标识,支持多进

2025-08-19 19:45:58 905

原创 Linux软件编程--进程间通信

本文概述了Linux系统中进程间通信(IPC)的主要方式。首先介绍了进程空间隔离性及IPC的必要性,然后详细讲解了三类传统通信机制:1)管道通信,包括无名管道(pipe)用于父子进程通信和有名管道(mkfifo)支持任意进程通信;2)信号机制,包括常见信号类型(SIGINT、SIGKILL等)及其处理方式(缺省/忽略/捕捉),重点介绍了signal、alarm、kill等信号操作函数;3)其他IPC方式如消息队列、共享内存等。文章着重分析了各种通信方式的特点、适用场景及实现方法,特别指出管道操作的阻塞特性和

2025-08-18 18:15:29 908

原创 Linux软件编程--线程

本文系统介绍了线程的基本概念与应用。线程作为CPU调度的最小单元,共享进程资源但独享栈空间,相比多进程具有更高效率和更低资源开销。详细解析了线程创建(pthread_create)、回收(pthread_join)等核心API,以及线程属性设置方法。针对多线程共享资源导致的竞争问题,重点阐述了互斥锁(pthread_mutex)和信号量(semaphore)两种同步机制的原理及函数接口,并分析了死锁产生的四个必要条件。文章还对比了多线程与多进程在效率、通信、安全性等方面的差异,为开发者选择并发模型提供了理论

2025-08-16 18:35:37 1339

原创 Linux编程--进程

创建一个新的进程,新的进程称为子进程,调用fork的进程称为父进程。查看该时刻的所有进程信息(强调父子关系和完整的进程信息)查看该时刻所有的进程信息(强调资源占用和进程的状态)根据 CPU 占用率和内存占用率查看当前内存的信息。renice -n 优先级编号 进程PID。ps -ef | grep 进程名 查找与进程名对应的进程信息。示例:nice -n 优先级编号 进程名。示例:kill -编号 进程PID。父进程中返回子进程的PID。获得调用函数进程的PID号。2.获取 PID 号与 父进程 PID。

2025-08-14 20:08:24 926

原创 Linux编程--文件与目录 IO

* Length of this record 当前记录字节数 */off_t d_off;/* Null-terminated filename 文件名*/ino_t d_ino;/* Inode number 索引节点号 *//* Type of file 文件类型 */O_CREAT :文件不存在创建(注意要给定创建文件的权限)O_EXCL:文件存在报错。O_TRUNC 文件存在截断为0(清0)SEEK_SET:描述符初始位置。可以通过 | 添加以下功能。

2025-08-13 18:50:15 1125

原创 Linux软件编程--标准IO

本文介绍了Linux系统中的I/O操作和文件概念。主要内容包括:1)I/O操作以文件为对象,Linux将一切视为文件;2)文件分类(块设备、字符设备、目录、普通文件等)及其操作方式;3)标准I/O的特点(带缓存、效率高)和缓存类型(全缓存/行缓存/不缓存);4)ASCII码文件和二进制文件的区别;5)详细讲解标准I/O接口函数(fopen、fclose、fputc、fgetc等)及其参数和返回值。文章系统梳理了Linux文件系统和标准I/O操作的核心概念和API接口。

2025-08-11 20:06:13 1429

原创 数据结构--哈希表与排序、选择算法

将数据通过哈希算法映射成一个键值,存取都在同一位置实现数据的高效存储和查找,并通过这种方式来降低时间复杂度。在该板块中,我将构建一个存放0 - 100 熟知的哈希表,并以此为里说明哈希表的实现方法。思路:与哈希表的遍历思路相同,分别查找或删除每一个同上的链表。多个数据通过算法后得到简直相同的现象叫哈希碰撞。利用循环语句访问哈希表每一个桶区的链表。

2025-08-08 18:49:13 655

原创 数据结构--二叉树

本文系统介绍了树形结构和二叉树的原理与实现方法。主要内容包括:1.树形结构基本概念,如节点、前驱、后继、层数等;2.二叉树的定义及分类(完全二叉树、满二叉树);3.二叉树的遍历算法(前序、中序、后序的递归/非递归实现,层序遍历);4.二叉树的基本操作实现(创建、销毁、获取高度等)。重点阐述了递归思想在树结构操作中的应用,并提供了完整的C语言代码示例,包括节点定义、创建函数、各种遍历方式的实现等。文章还特别说明了完全二叉树与非完全二叉树在创建方法上的区别。

2025-08-07 20:54:13 900

原创 数据结构--栈和队列

本文介绍了栈和队列的基本概念及其操作实现。栈具有"后进先出"特性,分为顺序栈和链式栈;队列具有"先进先出"特性,分为循环队列和链式队列。文章详细讲解了顺序栈的创建、判空判满、压栈出栈等操作,以及链式栈的实现方法。对于队列,重点介绍了循环队列的空满判定条件(头尾相同时为空,尾+1等于头时为满)和基本操作。所有数据结构都通过C语言代码示例展示了具体实现过程,包括结构体定义、内存分配和指针操作等关键步骤。

2025-08-06 20:09:50 1521

原创 数据结构--链表

本文系统介绍了数据结构中的链表原理及操作实现。主要内容包括:1)数据结构基础概念与分类;2)链表的特点及与顺序表的对比;3)链表的基本操作(创建、插入、删除、显示、销毁);4)链表高级操作(查找中间/K节点、无头节点删除、倒置);5)链表排序算法(冒泡排序和选择排序)的具体实现。全文以C语言代码为例,详细讲解了单向链表的各类操作实现思路和方法,为理解和应用链表数据结构提供了完整的技术参考。

2025-08-04 00:15:00 854

原创 C语言--构造数据类型

本文介绍了C语言中结构体、共用体和枚举的基础知识。结构体部分包括定义与初始化方法、变量访问方式(通过.和->运算符)、内存存储规则(对齐原则)以及结构体数组和参数传递。共用体部分解释了其共享内存的特性及判别内存大小端的方法。枚举部分则说明了枚举常量的定义规则和实际应用场景,如用枚举实现限行逻辑。这些复合数据类型为C语言提供了更灵活的数据组织方式,是程序设计中的重要工具。

2025-07-30 19:54:18 630

原创 C语言--指针Part2

本文详细介绍了C语言中指针的相关概念及应用。主要内容包括:1)指针函数(返回指针的函数)和函数指针(指向函数的指针)的区别与使用场景;2)二级指针的定义及在修改外部指针变量和指针数组传参中的应用;3)指针数组(存放指针的数组)和数组指针(指向数组的指针)的区别,以及它们在字符串操作和二维数组访问中的具体应用;4)void*指针的特性及其在函数参数和返回值中的通用性。文中通过代码示例展示了指针在函数嵌套调用、计算器实现、字符串排序等场景中的实际应用。

2025-07-28 18:46:41 994

原创 C语言--指针Part1

本文概述了指针的核心概念及其应用。指针本质上是内存地址,指针变量用于存储地址(64位系统中占8字节)。关键操作包括取地址(&)和取值(*)运算符,指针类型决定了其算术运算的步长(如int型偏移4字节)。指针变量需注意野指针和空指针问题,可通过直接或间接方式访问数据。文章还介绍了指针的算术运算规则、基本使用方法,以及在函数参数传递中的两种方式:值传递(保护实参)和地址传递(允许修改实参)。这些概念为理解指针在内存管理和数据操作中的作用奠定了基础。

2025-07-25 20:21:25 660

原创 C语言--预处理命令

本质上是代码替换宏名可以是小写,但为了与变量区分,通常用大写。

2025-07-24 19:26:13 357

原创 C语言--函数

本文摘要介绍了C语言函数相关概念:1)函数定义与调用格式,包括返回值类型、形参实参匹配;2)变量作用域与生命周期(局部/全局变量);3)内存存储区域(栈区、数据区等)及变量存储类型(auto/static等);4)递归函数的基本原理和使用注意事项。重点说明了static关键字对变量生命周期和存储位置的影响,以及不同存储区域的内存管理特点。

2025-07-23 18:54:12 7428

原创 C语言--数组

C语言数组知识摘要:数组是存储同类型数据的集合,分为一维/二维整型和字符型数组。一维整型数组定义时元素个数需为常量,只能操作单个元素,下标必须合法且为整型。数组支持三种初始化方式:全部、局部和默认初始化。数组具有连续存储特性,空间大小=元素大小×元素个数。介绍了冒泡排序(相邻比较交换)和选择排序(查找最值交换)两种排序算法及其实现代码。数组操作示例展示了元素的访问和修改方法。

2025-07-20 15:00:47 279

原创 C语言--流程控制

本文介绍了程序流程控制的三种基本结构:顺序结构、分支结构和循环结构。重点讲解了分支结构的if语句(包括单if、if-else和if-else if-else链)和switch语句的使用方法及注意事项。同时详细说明了循环结构中的while、do-while和for循环的执行流程及区别,并介绍了break、continue等辅助控制语句的功能。每种结构都配有具体的代码示例,如用if判断数值大小、使用switch进行多条件判断、以及各类循环的计数打印等。这些控制结构是编程中实现逻辑判断和重复操作的基础工具。

2025-07-18 19:34:32 708

原创 C语言--输入输出函数

C语言输入输出函数总结:1)字符I/O:putchar输出字符,getchar获取字符;2)格式化I/O:printf/scanf需对应格式符,scanf需取地址符;3)字符串I/O:puts自动换行,gets可接收空格字符串。格式控制符包括%d、%f等,支持精度(.mf)、对齐(%-nd)等格式设置。使用时需包含stdio.h头文件,注意数据类型的格式匹配。

2025-07-17 18:33:33 596

原创 C语言--数据类型转换与运算符

本文摘要: C语言数据类型转换包括混合运算转换和强制转换。混合运算时,低精度类型自动转为高精度类型,其中char/short转int,float转double。运算符分为算术、赋值、逻辑等类型,其中算术运算符包含自增自减运算,赋值运算符需注意类型匹配问题。其他运算符包括逗号、sizeof和三目运算符。运算符优先级遵循括号>单目>算术>关系>逻辑>赋值的规律,混合运算需特别注意类型转换和优先级关系。

2025-07-16 18:27:59 506

字符设备驱动-LED驱动

基于正电原子IMX6ULL led 驱动与应用程代码示例

2026-01-16

空空如也

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

TA关注的人

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