自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【FATFS】f_write函数详细解析

函数用于将数据写入到已经打开的文件中。

2024-09-17 11:40:36 232

原创 【C语言】__attribute__((constructor)) 和 __attribute__((destructor))详细解析

标记的函数在main()函数之前执行,适合用于程序初始化。可以通过设置优先级,控制多个初始化函数的执行顺序,优先级数值越小,函数执行得越早。:标记的函数在main()函数之后、程序终止时执行,适合用于清理资源。同样可以通过设置优先级,控制多个清理函数的执行顺序,优先级数值越小,函数执行得越早。

2024-09-17 11:40:08 663

原创 【Linux】Image、zImage与uImage的区别

zImage是一种经过压缩的 Linux 内核镜像格式,它通过gzip压缩内核代码和数据,使文件大小大大减小。zImage也称为 “compressed kernel image”,在加载时会自解压缩到内存中然后执行。uImage是 U-Boot 引导加载程序专用的内核镜像格式。它是在zImage或Image的基础上加上一个 U-Boot 头部信息(U-Boot Header),使 U-Boot 能够识别并加载内核镜像。

2024-09-16 11:20:46 783

原创 【Linux】uImage头部信息详细解析

【代码】【Linux】uImage头部信息详细解析。

2024-09-16 11:19:03 1572

原创 【FATFS】f_read函数详细解析

函数用于从打开的文件中读取数据,将读取到的数据存储在提供的缓冲区中。

2024-09-15 12:51:36 185

原创 【Shell】getopt、set

【Shell】getopt

2024-09-15 12:51:15 697

原创 【FATFS】f_mount函数详细解析

【FATFS】f_mount

2024-09-14 23:51:58 216

原创 【FATFS】FATFS简介及下载

ff.c: FatFs 模块的核心实现ff.c是 FatFs 文件系统模块的核心源文件,负责处理与 FAT 文件系统相关的所有具体操作。文件和目录的创建、打开、关闭、读取、写入、删除等操作:例如函数f_open()f_read()f_write()f_close()等实现了文件系统的基本文件操作。文件系统管理功能:包括f_mkdir()(创建目录)、f_rename()(重命名文件/目录)和f_unlink()(删除文件/目录),这些函数处理文件系统中对象的创建、重命名和删除。文件指针管理:如。

2024-09-14 23:08:44 1185

原创 【Shell】在shell脚本中$的使用方法

变量引用$var表示引用变量。命令替换$()或`command`。位置参数$0$1$#$@$*。特殊变量$$等。花括号操作:用于字符串操作、默认值、替换等。

2024-09-08 16:42:21 897

原创 【单片机】详细解析完全重映射和部分重映射

单片机中的每个引脚通常都有多个功能,不仅仅是作为普通的输入或输出,还可以与某些外设(如定时器、串口、SPI、I2C等)关联。默认情况下,这些外设功能通常固定绑定到特定的GPIO引脚。但是,在某些情况下,默认的引脚配置可能不适合实际电路设计或项目需求,因此需要将外设功能重新映射到其他GPIO引脚,这就是GPIO重映射。单片机内部有一个或,通过设置该寄存器,可以改变外设功能与GPIO引脚之间的关联。通过特定的寄存器位,开发者可以选择某个外设功能是否重映射,以及重映射到哪个引脚。

2024-09-08 16:20:57 621

原创 【Linux】gcc编译参数-fPIC、-fPIE、-pie

动态库的编译:使用-fPIC来生成位置无关的目标文件,以便构建动态库(.so文件)。这是标准的做法,保证库可以在不同的进程地址空间中正确加载和运行。可执行文件的编译如果不使用-pie选项来链接,生成的可执行文件不需要位置无关性,可以选择-fPIC-fPIE或者不使用任何这两个选项。如果使用-pie选项来链接,必须使用-fPIC或-fPIE编译目标文件,这样才能生成位置无关的可执行文件(PIE)。-fPIE的价值:虽然-fPIE可以被-fPIC覆盖,但在生成位置无关的可执行文件时,-fPIE。

2024-08-25 15:45:17 643

原创 【Linux】动态库的制作与链接

首先,你需要编写包含你想要打包成动态库的函数或类的源代码。在编写程序时,你可以链接并使用这个动态库。在文件末尾添加一行,将动态库路径添加到。将生成的动态库文件(如。要使更改立即生效,可以运行以下命令。)拷贝到系统默认的动态库路径,如。文件,添加动态库所在的路径。一个完整的动态库文件名如。将动态库所在的目录添加到。

2024-08-25 15:15:18 1196

原创 【Linux】Linux下默认的include,include的默认搜索路径

目录中的头文件主要用于嵌入式平台或者特定硬件架构,定义了与特定机器相关的接口和实现。:这些头文件与 Linux 内核的视频子系统相关,定义了图形和显示设备的接口,包括 framebuffer 驱动程序等。目录中的头文件包含了大量的内核接口、数据结构和宏定义,用于编写与内核交互的代码,如驱动程序、内核模块等。:这些头文件与内核的跟踪和调试子系统相关,定义了跟踪点、事件和跟踪控制接口,用于内核性能分析和调试。目录中的头文件是与架构相关的接口定义,提供了特定处理器架构的低级接口和汇编相关的宏或函数。

2024-08-18 18:07:37 1111

原创 【Linux】详细解析Linux内核链表

LIST_POISON1 和 LIST_POISON2 是 Linux 内核用来标记已删除链表节点的特殊值。这是内核开发者采用的一种巧妙的防御性编程技术,有助于编写更安全、更健壮的内核代码。list_entry 利用了 C 语言的一个特性:结构体成员的偏移量是固定的。它计算出 struct list_head 成员在整个结构体中的偏移,然后从这个 list_head 指针反推出整个结构体的起始地址。在上面的函数原型中,有这两行代码,他们的含义是什么呢。

2024-08-18 17:39:39 1054

原创 【Linux】Linux shell 脚本 之 getopt

getopt是一个用于解析命令行选项的工具,常用于编写需要处理多个命令行参数的脚本。它支持短选项(如-v)和长选项(如--version),并能处理带有参数的选项。getopt是 GNU 库中的一个标准工具,大多数 Unix 和 Linux 系统上都提供了它的实现。

2024-08-06 23:44:41 350

原创 【Linux】统一设备模型(kobject、kset、kobj_type)

在之前学习设备驱动的时候,即字符设备驱动的注册与注销这篇文章的时候,在cdev_alloc()和cdev_init()中均出现了kobject_init()这个函数,在当时并不清楚是什么东西,因为当时在乎的是把设备驱动这个框架给学会,在昨天看到文章的时候,又想起来还有这么一个东西没有去搞懂,于是稍微学习了一下,做一个笔记在此。

2023-08-03 01:15:00 687

原创 【C语言】strcpy与strncpy存在的问题

strcpy的拷贝是把含有 '\0' 结束符的字符串复制到另一个地址空间,所有如果目标地址的地址空间不够大的话,就会导致缓存区溢出的问题。2、在复制完成后在最后一位加上 '\0'1、在复制前将目标地址清'0'

2023-07-31 01:00:00 347

原创 【Linux】mmap与ioremap

4、如果要操作设备的物理地址,有两种办法,一种是使用ioreamap(),然后用户调用read,write,ioctrl系统调用去访问那块物理地址,这里涉及到了。2、ioreamap()使用在内核里,将设备所在的物理地址映射到内核虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。3、mmap()用在用户空间,将将设备所在的物理地址映射到用户虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;1、两者都是内存映射的函数。

2023-07-22 10:11:51 1578

原创 【小知识】深入理解阻塞与非阻塞、同步与异步

阻塞与非阻塞、同步与异步,这几个概念虽然每次看都能看的懂,但是过一段时间又会忘掉,所以系统的整理一下他们的区别,也方便自己后面忘掉的时候快速记忆,虽然网上有很多的说明这些概念的帖子,但是每次去找到能让自己明白的帖子也是一件不容易的事。

2023-07-18 23:06:27 211

原创 【C语言】strtok()函数使用详解

头文件:#include 功能:分解字符串为一组字符串参数:@s:需要拆分的字符串,在之前strtok记住的分隔符的位置开始,查找下一个标记@delim:定义用作分隔符的字符集合返回值:成功返回分隔符之前字符串的首地址,失败返回NULL注意:strtok会被操作的字符串。

2023-07-17 22:06:53 537 1

原创 【C语言】sscanf()的详细使用方法

从这个例子中可以看到,必须要第一个开始是a-z或者A-Z才可以取到。前面使用数字修饰词表示这个字符串缓冲区的最大长度,防止缓存区溢出。从这个例子中可以看出,必须要第一个开始是1-9才可以跳过。@argument:存储解析出来的数据。头文件:#inlucde @format:字符串的格式。@buffer:存储的数据。读取到任意A-Z的字符就停止读入。读取所有1-9的字符。跳过a-z数据不读入。

2023-07-12 21:15:17 1347

原创 【Linux】Linux内核内存分配函数kmalloc()、kzalloc()、vmalloc()与__get_free_page()

作为内存管理的基本单位,尽管处理器的最小寻址单位通常为字(或者为字节),但是MMU(内存管理单元)通常以页为单位进行处理。从虚拟内存的角度看,页就是最小单位。等类似函数,申请的内存位于DMA和常规区域的映射区,而且在。申请内存的过程中可以睡眠,因此不能用于中断上下文中。标志来申请内存,若不存在空闲页,直接返回。标志申请内存时,若暂时不能满足,则进程会。等待页,即会引起阻塞,因此。

2023-07-08 12:00:29 917

原创 【Linux】基于IO多路复用的TCP、UDP

基于IO多路复用的TCP、UDP

2023-05-22 19:56:40 178

原创 【Linux】Linux 线程基础

8、一个进程中的多个线程共享的资源:可执行的指令、静态数据、进程中打开的文件描述符、信号处理函数、当前工作目录、用户 ID、用户组 ID。4、由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大,在同一个进程中创建的线程共享该进程的地址空间。4、由于进程之间相互独立,线程共享同一进程下的资源,所以多进程的稳定性比多线程高,且多进程的资源量比多线程高。3、创建子进程的时候需要克隆父进程的所有资源,而创建线程不需要克隆资源,因为本身就共享同一进程下的资源。线程和进程都参与统一的调度。

2023-05-20 17:19:46 849

原创 【算法】回溯算法套路总结

算法:回溯算法套路总结

2023-05-19 17:33:45 636

原创 【Linux】进程间通信:信号

2、信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来 通知 用户空间进程发生了哪些系统事件。5.2.3中,提到了可以用子进程在退出的时候,给父进程发送一个SIGCHLD信号,来回收僵尸进程。3、如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它。4、如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。自定义信号处理函数,当信号发生的时候,立即执行自定义信号处理函数。3、执行缺省操作(执行默认操作)

2023-05-18 22:31:31 684

原创 【Linux】Linux驱动开发:并发与竞态(原子操作、自旋锁、信号量、互斥体)

/配合 atomic_dec_and_test 使用//定义并初始化原子变量//配合 atomic_inc_and_test 使用//定义并初始化原子变量。

2023-05-14 15:29:12 1503

原创 【Linux】Linux驱动开发:块设备驱动

1、系统中能够随机访问固定大小(1block 512byte)数据片的设备被称之为块设备。块设备文件一般都是以安装文件系统的方式使用,这也是块设备通常的访问方式。块设备的方式访问方式是随机的。2、块设备中小的可寻址单位是扇区,扇区大小一般是2的整数倍。常见的大小是512字节。扇区的大小是块设备的物理属性,扇区是所有块设备的基本单元,块设备无法对比扇区更小的单位进行寻址和操作。3、块是文件系统的一种抽象,只能基于块来访问文件系统。

2023-05-13 23:57:59 1351

原创 【Linux】Linux应用开发:socket网络编程(TCP、UDP)

Linux应用开发:socket

2023-05-13 17:27:32 1153

原创 【Linux】setsockopt的常用选项

(4)在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步),系统默认的状态发送和接收一次为8688字节(约为8.5K);打开这个功能后,内核在val时间之类还没有收到数据,不会继续唤醒进程,而是直接丢弃连接。从三次握手上讲,就是设置这个状态之后,就算完成了三次握手,服务器socket状态也不是ESTABLISHED,而依然是 SYN_RCVD,不会去接收数据。注:此文原链接为,由于写的很好,我怕此文挂掉,所以抄了一份。

2023-05-13 15:37:36 672

原创 【Linux】Linux 进程基础

exec 函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后原调用进程的内容除了进程号外其他全部都被替换了。可执行文件既可以是二进制文件也可以是任何 Linux 下可执行的脚本文件。当进程认为自己不能再为系统和用户做出任何贡献了时就可以调用 exec 函数,让自己执行新的程序。如果某个进程想同时执行另一个程序,它就可以调用fork 函数创建子进程,然后在子进程中调用任何一个exec 函数。

2023-05-12 13:15:58 2909

原创 【Linux】Linux应用开发:线程间通信(同步互斥机制)(互斥锁、条件变量、信号量)

互斥锁主要用来保护临界资源,每个临界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两个动作,一个线程等待“条件变量的条件成立”而挂起,另一个线程使“条件成立” (给出条件成立信号 )并唤醒挂起线程。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。对条件的测试是在互斥锁(互斥)的保护下进行的。

2023-05-11 17:28:02 1172

原创 【Linux】Linux应用开发:进程间通信 System V

1、共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝2、为了在多个进程间交换信息, 内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间,进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。3、由于多个进程共享一段内存,因此也需要依靠某种同步机制,如 互斥锁 和 信号量 等。1、消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等。2、消息队列可以按照类型来发送接收消息。

2023-05-07 22:40:43 1242

原创 【Linux】Linux驱动开发:SPI子系统

SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC 的 SPI 控制器接口。样。和 I2C适配器驱动一样,SPI主机驱动一般都是 SOC 厂商去编写的,所以我们作为 SOC的使用者,这一部分的驱动就不用操心了。

2023-05-07 11:58:53 2938 2

原创 【Linux】Linux驱动开发:I2C子系统

I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。在Linux 内核中 I2C 的体系结构分为3 个部分:1、I2C 核心:I2C 核心提供了I2C 总线驱动和设备驱动的注册、注销方法等。2、I2C 总线驱动:I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现,适配器可由 CPU 控制,甚至可以直接集成在CPU 内部。一般SOC 的 I2C 总线驱动都是由半导体厂商编写的,不需要用户去编写。

2023-05-06 22:41:39 1887

原创 【Linux】Linux驱动开发:platform总线驱动

/定义在linux/module.h中使用时,参数如下:of:总线类型match_table:idtable数组首地址。

2023-05-06 14:20:42 2144

原创 【Linux】Linux驱动开发:中断子系统

参考文档内核目录如果中断控制器有级联关系,下级的中断控制器还需要表明它的“interrupt-parent”是谁,用了interrupt-parent”中的哪一个“interrupts”你要用哪一个中断控制器里的中断?interrupts你要用哪一个中断?Interrupts里要用几个cell,由 interrupt-parent 对应的中断控制器决定。在中断控制器里有“#interrupt-cells”属性,它指明了要用几个cell来描述中断。

2023-05-05 21:37:39 1519

原创 【Linux】Linux驱动开发:gpio子系统

在设备树中,“GPIO组”就是一个GPIO Controller,这通常都由芯片厂家设置好。我们要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪个引脚,比如。如果要操作GPIO引脚的话,需要先将所用引脚配置为GPIO功能,这需要通过Pinctrl子系统来实现。在Pinctrl子系统将引脚配置为GPIO功能后,就可以使用GPIO子系统来设置GPIO的方向等。表示这个节点是一个GPIO Controller,它下面有很多引脚。在根节点下写自己的节点。在根节点下写自己的节点。

2023-05-05 13:29:31 2747

原创 【Linux】Linux内核定时器(标准定时器)

其中expires的单位是节拍数,节拍数等于 1 / HZ,而HZ是内核中定义好的,比如说内核中定义的HZ为100, jiffies(jiffies记录了系统启动后的滴答数)就会增加100。

2023-04-19 20:23:19 265

原创 【Linux】Linux驱动开发:设备树节点与属性

目录1、设备节点(node)2、属性(property)3、节点的一些特性4、节点的一些标准属性4.1 compatible属性4.2 model属性4.3 status属性4.4 reg属性4.5 #address-cells和 #size-cells属性5、device_node结构体6、property结构体7、 找到节点(device_node)的API7.1 定义节点7.2 of_find_node_by_path7.3 of_find_node_by_name7.4 of_find_compat

2023-04-19 14:35:29 2666

空空如也

空空如也

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

TA关注的人

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