- 博客(200)
- 收藏
- 关注
原创 【GNU】addr2line
addr2line是 GNU Binutils 工具集中的一个命令行工具,用于将程序中的地址转换为源代码中的文件名和行号。它在调试和问题定位中非常有用,尤其是在处理崩溃或 core dump 时。
2024-11-17 21:28:09
397
原创 【GNU】反汇编工具objdump
objdump是 GNU Binutils 工具集中的一个命令行工具,用于分析和显示目标文件(如二进制文件、目标文件、静态库和可执行文件)的详细信息。它是开发调试、优化和逆向工程的利器。
2024-11-17 13:16:33
718
原创 【GNU】gcc -g编译选项 -g0 -g1 -g2 -g3 -gdwarf
GCC 的 -g 选项用于在编译时生成,这些信息会嵌入到生成的目标文件或可执行文件中,主要目的是为了支持调试器(如 gdb)对程序的调试工作。当你在编译代码时使用-g选项,GCC 会将额外的调试信息嵌入到生成的可执行文件或目标文件中。调试信息存储在符号表中,不会影响程序的实际执行逻辑。生成的调试信息可以被调试器(例如gdb使用-g选项时,GCC 不会对程序进行优化,确保调试时的代码行为和源代码的逻辑一致。如果需要同时优化代码并生成调试信息,可以结合使用-O选项(例如-g -O2。
2024-11-16 12:17:39
1167
原创 【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os
GCC 提供的-O系列选项用于优化代码。这些选项可以控制编译器对代码进行优化的程度和类型,从而提高代码的性能、减小代码体积或优化其他特性。
2024-11-16 12:16:08
1022
原创 【Linux】fessk()详细解析
fseek()是 C 语言标准库中的一个非常重要的文件操作函数,用于在打开的文件中。通过fseek(),可以在文件的任意位置读取或写入数据。它是随机访问文件的基础,与顺序读取相比,可以提高对文件操作的灵活性。fseek()FILEfopen()offsetwhencewhenceSEEK_SETSEEK_CURSEEK_ENDfseek()offsetoffsetwhenceoffsetoffsetoffsetwhencewhenceSEEK_SET:将文件指针设置为相对于文件开头的offset位置。
2024-10-24 22:40:32
1016
原创 【单片机】深入剖析USART与UART的区别
如果你的系统中不需要高精度的时钟同步,且通信速率要求不高,UART将是一个更简单且更实用的选择。如果你的应用需要更高的传输速率,并且系统能够支持时钟信号的额外硬件成本,那么USART的同步模式将为你提供更高效、更精确的数据传输。
2024-10-24 22:27:04
2479
原创 【Linux】统计当前目录及其所有子目录下的所有文件的个数 find . -type f -name “*.txt“ | wc -l
递归查找所有普通文件递归查找特定类型的文件**仅统计当前目录中的文件(不递归)
2024-10-24 22:17:05
723
原创 【Linux】wc命令详细解析
wc是 Linux 中的一个常用命令,它的全称是 “word count”(字数统计),用于计算文件中的和或。wc可以处理一个或多个文件,也可以通过管道接收其他命令的输出作为输入。
2024-10-20 19:42:36
1121
原创 【Linux】dd命令
dd命令是 UNIX 和类 UNIX 系统(如 Linux)中的一个非常强大的工具,专用于复制和转换文件。它特别适合操作原始设备,如磁盘、分区和 USB 驱动器等,能够以块为单位读取和写入数据,并支持数据转换,例如字节交换、大写转换、ASCII 与 EBCDIC 编码转换等。
2024-10-01 19:32:29
1923
原创 【FATFS】f_lseek函数详细解析
是 FatFs 文件系统库中的一个函数,用于移动文件指针到指定的位置。这个函数的主要作用是调整文件对象的读写位置,可以用于在文件中随机访问数据。,可以实现类似于文件跳转、追加写操作等功能。
2024-10-01 19:31:30
1246
原创 【Shell】if表达式
Shell 提供了丰富的文件测试选项来检测文件或目录的存在、类型及权限等。可以简化条件的书写并避免一些常见的错误。语法中可以使用字符串模式匹配,例如使用通配符或正则表达式。Shell 支持多个条件组合在一起进行判断,例如使用。命令中可以使用经典的 C 风格比较运算符,如。语句进行模式匹配,它在处理多种情况时非常有用。用于进行算术运算,常用于数值计算和逻辑判断。语句,shell 脚本中还可以使用。
2024-09-29 22:15:09
1106
原创 【FATFS】f_readdir函数详细解析
是 FatFs 文件系统库中用于读取目录条目的函数,它的作用是从一个打开的目录中逐个读取文件或子目录的条目信息。通过这个函数,可以遍历目录中的所有文件和子目录,通常用于列出目录内容。
2024-09-29 22:14:14
748
原创 【单片机】单片机map表详细解析
所以下载程序到FLASH/ROM时,空间大小为:程序运行的时,RAMRW Data:包含有初始值的全局和静态变量。因为这些初始值必须在程序启动时恢复,因此它们的初始值需要存储在 ROM 中,以便启动时能将这些初始值复制到 RAM 中。ZI Data:包含未初始化的全局和静态变量。由于它们的初始值始终是零,启动时只需清零 RAM 中相应的内存区域,因此它们的初始值不需要存储在 ROM 中。
2024-09-28 20:52:12
1282
原创 【C语言】__attribute__((packed))与#pragma pack
在 C 语言中,是指编译器会根据不同的数据类型自动调整它们在内存中的位置,确保它们按照特定的字节边界存储。这种做法可以让处理器更高效地读取和存储数据。举个例子,像int这样的 4 字节数据通常会被对齐到 4 字节的边界上。如果前面有一个较小的数据类型,比如 1 字节的char,编译器可能会在它后面插入一些,让接下来的int保持在 4 字节边界上。虽然这样可以加快处理器的访问速度,但同时也会增加结构体的总大小,浪费一些内存。
2024-09-28 17:18:41
569
原创 【C语言】__attribute__((constructor)) 和 __attribute__((destructor))详细解析
标记的函数在main()函数之前执行,适合用于程序初始化。可以通过设置优先级,控制多个初始化函数的执行顺序,优先级数值越小,函数执行得越早。:标记的函数在main()函数之后、程序终止时执行,适合用于清理资源。同样可以通过设置优先级,控制多个清理函数的执行顺序,优先级数值越小,函数执行得越早。
2024-09-17 11:40:08
1425
原创 【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
1792
原创 【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
1917
原创 【Shell】在shell脚本中$的使用方法
变量引用$var表示引用变量。命令替换$()或`command`。位置参数$0$1$#$@$*。特殊变量$$等。花括号操作:用于字符串操作、默认值、替换等。
2024-09-08 16:42:21
1732
原创 【单片机】详细解析完全重映射和部分重映射
单片机中的每个引脚通常都有多个功能,不仅仅是作为普通的输入或输出,还可以与某些外设(如定时器、串口、SPI、I2C等)关联。默认情况下,这些外设功能通常固定绑定到特定的GPIO引脚。但是,在某些情况下,默认的引脚配置可能不适合实际电路设计或项目需求,因此需要将外设功能重新映射到其他GPIO引脚,这就是GPIO重映射。单片机内部有一个或,通过设置该寄存器,可以改变外设功能与GPIO引脚之间的关联。通过特定的寄存器位,开发者可以选择某个外设功能是否重映射,以及重映射到哪个引脚。
2024-09-08 16:20:57
1338
原创 【gcc】gcc编译参数-fPIC、-fPIE、-pie
动态库的编译:使用-fPIC来生成位置无关的目标文件,以便构建动态库(.so文件)。这是标准的做法,保证库可以在不同的进程地址空间中正确加载和运行。可执行文件的编译如果不使用-pie选项来链接,生成的可执行文件不需要位置无关性,可以选择-fPIC-fPIE或者不使用任何这两个选项。如果使用-pie选项来链接,必须使用-fPIC或-fPIE编译目标文件,这样才能生成位置无关的可执行文件(PIE)。-fPIE的价值:虽然-fPIE可以被-fPIC覆盖,但在生成位置无关的可执行文件时,-fPIE。
2024-08-25 15:45:17
2357
原创 【Linux】动态库的制作与链接
首先,你需要编写包含你想要打包成动态库的函数或类的源代码。在编写程序时,你可以链接并使用这个动态库。在文件末尾添加一行,将动态库路径添加到。将生成的动态库文件(如。要使更改立即生效,可以运行以下命令。)拷贝到系统默认的动态库路径,如。文件,添加动态库所在的路径。一个完整的动态库文件名如。将动态库所在的目录添加到。
2024-08-25 15:15:18
1567
原创 【Linux】Linux下默认的include,include的默认搜索路径
目录中的头文件主要用于嵌入式平台或者特定硬件架构,定义了与特定机器相关的接口和实现。:这些头文件与 Linux 内核的视频子系统相关,定义了图形和显示设备的接口,包括 framebuffer 驱动程序等。目录中的头文件包含了大量的内核接口、数据结构和宏定义,用于编写与内核交互的代码,如驱动程序、内核模块等。:这些头文件与内核的跟踪和调试子系统相关,定义了跟踪点、事件和跟踪控制接口,用于内核性能分析和调试。目录中的头文件是与架构相关的接口定义,提供了特定处理器架构的低级接口和汇编相关的宏或函数。
2024-08-18 18:07:37
1699
原创 【Linux】详细解析Linux内核链表
LIST_POISON1 和 LIST_POISON2 是 Linux 内核用来标记已删除链表节点的特殊值。这是内核开发者采用的一种巧妙的防御性编程技术,有助于编写更安全、更健壮的内核代码。list_entry 利用了 C 语言的一个特性:结构体成员的偏移量是固定的。它计算出 struct list_head 成员在整个结构体中的偏移,然后从这个 list_head 指针反推出整个结构体的起始地址。在上面的函数原型中,有这两行代码,他们的含义是什么呢。
2024-08-18 17:39:39
1594
原创 【Linux】Linux shell 脚本 之 getopt
getopt是一个用于解析命令行选项的工具,常用于编写需要处理多个命令行参数的脚本。它支持短选项(如-v)和长选项(如--version),并能处理带有参数的选项。getopt是 GNU 库中的一个标准工具,大多数 Unix 和 Linux 系统上都提供了它的实现。
2024-08-06 23:44:41
585
原创 【Linux】统一设备模型(kobject、kset、kobj_type)
在之前学习设备驱动的时候,即字符设备驱动的注册与注销这篇文章的时候,在cdev_alloc()和cdev_init()中均出现了kobject_init()这个函数,在当时并不清楚是什么东西,因为当时在乎的是把设备驱动这个框架给学会,在昨天看到文章的时候,又想起来还有这么一个东西没有去搞懂,于是稍微学习了一下,做一个笔记在此。
2023-08-03 01:15:00
807
原创 【C语言】strcpy与strncpy存在的问题
strcpy的拷贝是把含有 '\0' 结束符的字符串复制到另一个地址空间,所有如果目标地址的地址空间不够大的话,就会导致缓存区溢出的问题。2、在复制完成后在最后一位加上 '\0'1、在复制前将目标地址清'0'
2023-07-31 01:00:00
450
原创 【Linux】mmap与ioremap
4、如果要操作设备的物理地址,有两种办法,一种是使用ioreamap(),然后用户调用read,write,ioctrl系统调用去访问那块物理地址,这里涉及到了。2、ioreamap()使用在内核里,将设备所在的物理地址映射到内核虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。3、mmap()用在用户空间,将将设备所在的物理地址映射到用户虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;1、两者都是内存映射的函数。
2023-07-22 10:11:51
2018
原创 【小知识】深入理解阻塞与非阻塞、同步与异步
阻塞与非阻塞、同步与异步,这几个概念虽然每次看都能看的懂,但是过一段时间又会忘掉,所以系统的整理一下他们的区别,也方便自己后面忘掉的时候快速记忆,虽然网上有很多的说明这些概念的帖子,但是每次去找到能让自己明白的帖子也是一件不容易的事。
2023-07-18 23:06:27
255
原创 【C语言】strtok()函数使用详解
头文件:#include 功能:分解字符串为一组字符串参数:@s:需要拆分的字符串,在之前strtok记住的分隔符的位置开始,查找下一个标记@delim:定义用作分隔符的字符集合返回值:成功返回分隔符之前字符串的首地址,失败返回NULL注意:strtok会被操作的字符串。
2023-07-17 22:06:53
646
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
2539
2
原创 【Linux】Linux内核内存分配函数kmalloc()、kzalloc()、vmalloc()与__get_free_page()
作为内存管理的基本单位,尽管处理器的最小寻址单位通常为字(或者为字节),但是MMU(内存管理单元)通常以页为单位进行处理。从虚拟内存的角度看,页就是最小单位。等类似函数,申请的内存位于DMA和常规区域的映射区,而且在。申请内存的过程中可以睡眠,因此不能用于中断上下文中。标志来申请内存,若不存在空闲页,直接返回。标志申请内存时,若暂时不能满足,则进程会。等待页,即会引起阻塞,因此。
2023-07-08 12:00:29
1023
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人