- 博客(32)
- 资源 (1)
- 收藏
- 关注
原创 CMake快速入门
使用现代 CMake:尽量使用目标相关的命令,如和,避免全局命令如。分层管理项目:对于大型项目,使用将不同模块分开管理。明确设置编译选项:为每个目标明确设置编译选项,避免全局设置带来的副作用。自动查找源文件:使用自动查找源文件,有助于简化文件。配置安装规则:如果项目需要发布,定义安装规则以方便用户安装和使用。处理依赖关系:使用查找并链接外部库,确保项目的依赖关系明确且易于管理。通过理解和应用这些规则,您可以更有效地使用 CMake 管理项目的构建过程,并应对日益复杂的项目需求。
2024-12-06 16:18:43
851
原创 环形缓冲区
与传统的数组或链表相比,环形缓冲区有以下优点:1.无需频繁移动数据。环形缓冲区的读写指针移动不会导致数据搬移,效率更高。2.自动处理缓冲区"满"和"空"的状态。通过读写指针的关系可以判断缓冲区状态,无需额外的计数器。3. 适用于生产者-消费者模型。一个线程写入数据,另一个线程读取数据,天然支持异步处理。
2024-11-22 20:49:25
1177
原创 lwIP 的 Raw API 使用指南
lwIP 是一个功能强大且灵活的轻量级 TCP/IP 协议栈,适用于各种嵌入式系统。通过正确的配置和集成,可以实现高效的网络通信功能。在 FreeRTOS 等 RTOS 环境中使用 lwIP,可以充分利用 RTOS 的任务调度能力,提高系统的实时性和响应速度。掌握 lwIP 的基本使用方法和关键配置选项,是开发网络嵌入式应用的基础。
2024-11-18 10:40:25
992
原创 软链接和硬链接
硬链接是指多个文件名指向同一个 inode(文件数据和元数据),所以它们共享相同的内容。软链接(Symbolic Link)是一个指向另一个文件或目录的符号链接。硬链接(Hard Link)是多个文件名指向同一个 inode 的链接。软链接是指一个文件名指向另一个文件的路径。硬链接和软链接在文件的详细信息中会有所不同。通过上述方法,您可以确定一个文件是硬链接还是软链接。要查看一个文件是硬链接还是软链接,可以使用。要创建软链接和硬链接,可以使用。例如,要创建一个名为。例如,要创建一个名为。
2024-04-23 23:42:32
407
原创 C程序的编译
经过预处理后的源文件,退去一切包装,注释被删除,各种预处理命令也基本上被处理掉,剩下的就是原汁原味的C代码了。接下来的第二步,就开始进入编译阶段。编译阶段主要分两步:第一步,编译器调用一系列解析工具,去分析这些C代码,将C源文件编译为汇编文件;第二步,通过汇编器将汇编文件汇编成可重定位的目标文件。
2024-04-13 22:03:36
839
原创 程序的预处理
编译器提供的这些预处理命令,大大方便了程序的编写:通过头文件包含可以实现模块化编程;通过#pragma预处理命令可以设定编译器的状态,指示编译器完成一些特定的动作。预处理过程,其实就是在编译源程序之前,先处理源文件中的各种预处理命令。编译器是不认识预处理指令的,在编译之前不先把这些预处理命令处理掉,编译器就会报错。我们写了一个测试程序,分别使用预处理命令去定义一些宏和条件编译。为了方便编程,编译器一般为开发人员提供一些预处理命令,使用#标识。自己可示例分析 查看example.i 文件.
2024-04-12 22:44:38
464
原创 从源程序到二进制
*BSS段比较特殊,**一般来讲,未初始化的全局变量和静态变量会放置在BSS段中,但是因为它们未初始化,默认值全部是0,其实没有必要再单独开辟空间存储,为了节省存储空间,所以在可执行文件中BSS段是不占用空间的。知道了可执行文件的基本构成,我们也就知道了程序编译的大概流程,如图所示,就是将C程序中定义的函数、变量,挑挑拣拣、加以分类,分别放置在可执行文件的代码段、数据段和BSS段中。每个section用一个section header来描述,包括段名、段的类型、段的起始地址、段的偏移和段的大小等。
2024-04-11 22:06:57
2369
原创 Cache机制
随着半导体工艺和芯片设计技术的发展,CPU的工作频率也越来越高,和CPU进行频繁数据交换的内存的运行速度却没有相应提升,于是两者之间就产生了带宽问题,进而影响计算机系统的整体性能。CPU执行一条指令需要零点几纳秒,而RAM则需要30纳秒左右,读写一次RAM的时间,CPU都可以执行几百条指令了。
2024-04-11 18:33:49
1054
原创 计算机体系架构
当CPU到RAM中读数据时,内存RAM不是一次只传输要读取的指定字节,而是一次缓存一批数据到Cache中,等下次CPU再去取指令和数据时,可以先到这两个Cache中看看要读取的数据是不是已经缓存到这里了,如果没有缓存命中,再到内存中读取。为了兼顾存储和效率,计算机系统一般会采用内存+外存的存储结构:程序指令保存在诸如磁盘、NAND Flash、SD卡等外部存储器中,当程序运行时,相应的程序会首先加载到内存,然后CPU从内存一条一条地取指令、翻译指令和运行指令。我们编写的程序,除了指令,还有各种各样的数据。
2024-04-10 23:43:12
1884
原创 leetcode2529-正整数和负整数的最大计数
题目要求我们找出正整数和负整数的数量,并返回这两个数中的最大值。:这意味着数组中的元素从左到右是不减的,即每个后续元素都不小于其前一个元素。这个特性对于解题不是直接必要的,但它告诉我们数组是有序的。:对于数组中的每个元素,如果它大于0,我们就增加正整数的计数;:由于数组是非递减顺序排列的,我们可以简单地遍历一遍数组,对正整数和负整数分别计数。,并返回数组中正整数和负整数的最大数量。:我们不需要关心具体的正数或负数是什么,只需要知道它们的数量。:遍历完成后,我们比较正整数和负整数的数量,返回较大的那个。
2024-04-09 23:53:25
411
原创 可重入函数
可重入函数(Reentrant Function)是指该函数能够被多个任务或线程安全地调用,即使这些调用是并发执行的。一个可重入函数在任何时刻都可以被中断,然后由另一个任务或线程安全地执行,执行完成后,原来的任务或线程可以继续执行,而不会出现数据错误或不一致的情况。可重入函数对于实时操作系统(RTOS)和多线程环境非常重要,因为它们有助于避免并发执行时的数据冲突和不一致性问题。编写一个可重入函数需要遵循一些基本原则,以确保函数的安全性和稳定性,特别是在多线程或中断驱动的环境中。
2024-04-09 23:35:36
390
原创 Linux虚拟内存简介
若进程欲访问的页面目前并未驻留在物理内存中,将会发生页面错误(page fault),内核即刻挂起进程的执行,同时从磁盘中将该页面载入内存。该页表描述了每页在进程虚拟地址空间(virtual address space)中的位置(可为进程所用的所有虚拟内存页面的集合)。虚拟内存管理的最后一个优点是:由于每个进程使用的RAM减少了,RAM中同时可以容纳的进程数量就增多了。PMMU把要访问的每个虚拟内存地址转换成相应的物理内存地址,当特定虚拟内存地址所对应的页没有驻留于RAM中时,将以页面错误通知内核。
2024-04-09 23:19:07
1668
原创 Linux系统调用-PREAD
在Linux系统中,pread()函数是一个用于从文件中读取数据的系统调用,它与read()函数相似,但提供了一个额外的功能:它允许你在指定的偏移量处读取数据,而不改变文件的当前偏移量(文件指针的位置)。这使得pread()特别适用于多线程环境,因为它避免了对文件偏移量的共享和潜在的竞争条件。
2024-04-08 14:19:49
1251
原创 原子操作和竞争条件
所有系统调用都是以原子操作方式执行的。之所以这么说,是指内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,其间不会为其他进程或线程所中断。原子性是某些操作得以圆满成功的关键所在。特别是它规避了竞争状态(race conditions)(有时也称为竞争冒险)。竞争状态是这样一种情形:操作共享资源的两个进程(或线程),其结果取决于一个无法预期的顺序,即这些进程1 获得 CPU 使用权的先后相对顺序。
2024-04-07 23:30:51
803
原创 linux系统调用-truncate 和ftruncate
truncate和ftruncate是两个用于修改文件大小的 POSIX 系统调用。它们允许你增大或减小一个文件的大小,如果文件被增大,新增的部分会被填充为零字节。这两个调用的主要区别在于它们指定操作文件的方式。
2024-04-06 17:12:52
750
原创 linux系统调用-PWRITE
pwrite()函数是一个系统调用,用于在指定偏移量处向文件写入数据。与write()函数相比,pwrite()的优势在于它可以直接在文件的指定位置写入数据,而不改变文件的当前偏移量。这对于多线程环境中的文件操作尤其有用,因为它避免了因修改共享的文件偏移量而导致的竞争条件。
2024-04-06 10:41:16
907
原创 linux系统临时文件-TMPFILE和MKSTEMP
在Linux中,使用临时文件是一种常见的做法,特别是当你需要存储大量数据或者不想影响文件系统的持久存储时。C语言提供了几种创建和使用临时文件的方法,包括使用tmpfile()函数和mkstemp()函数。
2024-04-05 16:41:20
705
原创 linux大文件IO
在Linux中处理大文件(通常指大小超过2GB的文件)时,需要使用特定的系统调用和标志,以确保程序能够正确地处理大文件的读写。这主要是因为在32位系统上,传统的文件偏移量和文件大小使用off_t类型表示,它通常是32位的,最大只能表示到2GB的文件大小。为了支持大文件,Linux提供了一套称为Large File Support(LFS)的接口。
2024-04-05 15:59:53
442
原创 linux系统调用-FCNTL
fcntl提供了对文件描述符的各种控制操作,比如改变已打开的文件的属性、复制文件描述符、设置文件锁等。fcntl的功能比较广泛,它可以用来实现多种不同的文件操作。
2024-04-05 15:32:54
757
原创 linux系统调用-IOCTL
在Linux系统中,ioctl函数是一种系统调用,用于对设备进行控制。它提供了一种执行设备特定操作的方法,这些操作通常无法通过标准输入/输出调用来完成。ioctl的名称来源于“输入/输出控制”(Input/Output Control)的缩写。
2024-04-05 13:51:14
579
原创 linux系统调用-LSEEK
lseek函数是Linux系统调用之一,用于重新定位文件内的读/写文件偏移量。这个函数允许文件的读写操作不必从文件开头开始,可以从文件的任意位置开始,这对于访问大文件或者进行文件内容的随机访问非常有用。
2024-04-05 13:37:55
726
原创 linux系统调用-CLOSE
Linux系统调用close函数用于关闭一个已经打开的文件描述符(file descriptor)。当一个文件描述符被关闭后,它将不再引用任何文件,且其值可以被后续的open系统调用重新使用。
2024-04-05 13:31:58
844
原创 linux系统调用-WRITE
Linux系统中的write函数是一个基本的系统调用,用于将数据写入文件或者其他输出流中。它是POSIX标准的一部分,因此在大多数类Unix操作系统中都可以找到它。write函数的原型定义在unistd.h头文件中。
2024-04-05 13:26:32
441
原创 linux系统调用--READ
read是Linux系统中用于从打开的文件、管道或者终端中读取数据的系统调用。它将数据从文件描述符指向的文件中读取到缓冲区中。
2024-04-04 20:04:22
581
原创 Linux系统调用–OPEN
open是Linux系统中用于打开和可能创建一个文件的系统调用。当你打开一个文件时,系统会返回一个文件描述符(file descriptor),这是一个非负整数,之后的读写操作都会使用这个文件描述符。
2024-04-04 19:48:11
633
原创 linux进程的相关基本概念
linux进程的相关基本概念1.1进程的定义进程是一个程序的一次执行过程,在这个过程中,伴随着资源的分配和释放。1.2操作系统的三个抽象文件:将所有的IO设备都抽象成文件进程:程序执行过程中的所有资源抽象成进程虚拟内存:隔离不同进程,操作系统会为每个进程分配独立的4G的虚拟空间1.3进程和程序的区别程序 program:可执行文件,存在硬盘,静态的概念进程 process:程序的...
2020-03-22 09:28:15
152
原创 Linux系统常用指令
Linux系统常用指令打开终端Terminal(快捷键ctrl + alt + t)Shell提供命令提示符表示该命令行的开始,用户在命令提示符后面输入命令,按下ENTER键表示提交命令。命令提示符的格式为:username@hostname:direction $/#其中:username:表示用户名,显示当前登陆用户的账号名hostname:表示主机名,显示当前登陆的主机名di...
2020-03-21 11:13:15
120
shell脚本编程 - A.pdf
2019-06-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人