自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式学习(哈希表)

哈希表中元素是由哈希函数确定的,将数据元素的关键字key作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。哈希函数:指将哈希表中元素的关键键值映射为元素存储位置的函数。

2024-09-09 19:25:35 189

原创 嵌入式学习(二叉树)

2.完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。1.满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。

2024-09-07 17:43:59 245

原创 嵌入式学习(链式栈和链式队列)

队列是一种先进先出(FIFO)的线性表,它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。栈的主要特点:LIFO(last in first out) "后进先出"栈可以采用顺序存储结构(顺序栈) 和 链式存储结构(链式栈)栈只能在表尾插入或删除元素,表尾就是栈的栈顶,表头就是栈底。栈(stack)是一种只能在一端插入或删除操作的线性表。

2024-09-06 21:13:26 305

原创 嵌入式学习(内核链表)

内核链表和普通链表的区别:1. 普通链表当中数据域和指针域,没有做到区分,数据与指针形成了一个整体,而内核链表数据与指针是完全剥离的没有直接的关系。2. 在普通链表当中所有节点的数据都是一样的类型,而内核链表中每一个节点的类型都可以是不同的。3. 普通的链表每一个节点都只能出现在一个链表当中,因为它只有一对前驱 / 后继指针,而内核链表可以有多对前驱/ 后继指针。代码部分将会与普通链表结合起来一起理解。

2024-09-05 22:30:04 275

原创 嵌入式学习(双向链表)

在我们使用链表存储数据时,往往会从堆空间上申请空间。因此在使用完之后需要我们手动释放空间。valgrind工具可以帮助我们检测在一段进程中申请的空间是否被释放完全。在使用时:valgrind + 运行文件 :如 valgrind ./a.out主要结构是由,这三个结构组成,通过prev找到前一个节点,next指向下一个节点。结构:在双向链表中同样可以实现单向链表中的头插,尾插,头删等操作。此外,如用到结构体,结构体可以整体赋值。

2024-09-04 20:04:51 721

原创 嵌入式学习(数据结构:链表)

程序 = 数据结构 + 算法数据结构 :是相互之间存在一种或多种特定关系的数据元素的集合。通常有以下4类基本逻辑结构。1、集合,结构中的数据元素之间除了同属于一个集合的关系外,别无其他关系;2、线性结构,结构中的数据元素之间存在一个对一个的关系;3、树形结构,结构中的元素之间存在一个对多个的关系;4、图状结构或网状结构,结构中的数据元素之间存在多个对多个的关系。存储结构也有四种:1、顺序结构,2、链式结构,3、索引结构,4、散列结构空间复杂度。

2024-09-03 19:36:55 354

原创 嵌入式学习(数据库)

可以理解为数据库是用来存放数据的一个容器。有了数据库后,我们可以直接查找数据。或者可以对数据库进行读写删除等操作。Sqlite 小型数据库 . Sqlite特点: 可以实现大数据量的管理 读写速度慢RDRMS中的数据存储在被称为表(tables)的数据库对象中。表是相关的数据项的集合,它由列和行组成创建表:CREATE TABLE 表名称例如:插入数据:insert into 语句用于向表格中插入新的行。例如:INSERT INTO 表名称 VALUES (值1, 值2,....)

2024-08-29 21:47:17 882

原创 嵌入式学习(IO多路复用)

2024-08-28 22:40:11 272

原创 嵌入式学习(tcp udp 单循环,并发服务器)

2024-08-27 21:22:44 99

原创 嵌入式学习(TCP通信和抓包)

TCP协议在传输时,可能会遇到粘包的问题。造成这个问题的原因,是因为tcp流式套接字,数据之间没有边界造成的。导致了多次的数据,粘黏在一起。1、规定一些数据与数据之间的间隔符。2、自己指定要发送的数据的长度。3、自己将数据打包(结构体)

2024-08-23 19:59:52 230

原创 嵌入式学习(网络通信UDP\TCP)

TCP:面向连接的协议。在数据传输前,必须先建立一条从源到目的地的可靠连接。双方通过“三次握手”过程协商连接参数,建立连接后才能进行数据传输。数据传输结束后,通过“四次挥手”断开连接。UDP:无连接的协议。无需事先建立连接,发送方可以直接向接收方发送数据报文。每个数据报文独立传输,相互之间没有直接关联。在网络通信中,不同端对应的任务和作用也不一样。1,创建一个用于通信的套接字(fd)2,连接服务器:需要指定连接的服务器的IP 和 端口3,建立连接成功,客户端和服务器建立连接通道1>可以发送数据。

2024-08-22 20:23:11 1290

原创 嵌入式学习(共享内存和网络部分开始)

调用shmat后会返回一个地址,读端直接读取该地址数据,写端直接向该地址写入即可。在我们平时调试代码时,可以通过在代码中打印相关信息,来测试代码运行可以到何处。还有:p2p 点对点传输。编程实现:socket函数。TCP连接:1、可靠连接。UDP特点:1、不可靠。1、申请socket。

2024-08-21 17:43:13 176

原创 嵌入式学习(有名管道和信号signal)

无名管道:只能用于亲缘关系进程之间的通信有名管道:1、存在于内存中2、在系统中有一个对应名称3、文件大小 0bytesFIFO文件被打开,就可以使用与操作匿名管道和其它文件的系统调用一样的I/O系统调用,如使用read()读数据write()写数据等。与匿名管道一样,FIFO也有一个写入端和读取端,且从管道中读取数据的顺序与写入数据的顺序是一样的。先入先出,也是一个环形队列。

2024-08-18 12:57:32 863

原创 嵌入式学习(linux多线程管道通信部分)

将可能被多个执行流同时访问的资源叫做临界资源,临界资源需要进行保护否则会出现数据不一致等问题由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:1、P : 我们将申请信号量称为P操作,申请信号量的本质就是申请获得临界资源中某块资源的使用权限,当申请成功时临界资源中资源的数目应该减去一,因此P操作的本质就是让计数器减一,如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行。

2024-08-16 20:45:17 350

原创 嵌入式学习(linux多线程互斥锁)

在多线程环境中,当多个线程同时访问共享资源时,可能会导致数据的竞争和不一致问题。为了避免这种问题,需要确保在任何时候只有一个线程能够访问共享资源,而其他线程需要等待直到资源可用。发送终止信号给thread线程,如果成功则返回0,否则为非0值。//NULL 默认属性 --- 普通锁。@mutex //就是要初始化的 互斥锁变量。4.任一线程调用exit或主线程调用了return。对比线程和进程:在使用时要根据实际需求选择使用。@attr //属性。功能: 初始化互斥锁。

2024-08-15 20:27:35 325

原创 嵌入式学习(linux多线程部分)

1、获取子进程的退出状态2、回收资源(让僵尸态子进程销毁)status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。

2024-08-14 20:04:47 719

原创 嵌入式学习(linux多进程部分)

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。它可能有三种不同的返回值:1)在父进程中,fork返回新创建子进程的进程ID;

2024-08-13 21:07:13 252

原创 嵌入式学习(linux进程部分)

当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务。因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。,也叫做进程控制块(PCB),这个结构体在 sched.h 中,这个结构体包含进程运行时。pstree -sp pid号:查看父子进程(属性图,含pid号)当我们运行一个程序时,其需要相应的资源(堆 、栈、数据段),返回值:在父进程中返回子进程的pid号(int型数据)kill:给进程发送一个信号;

2024-08-12 21:08:49 239

原创 嵌入式学习(linux文件部分)

这个函数会先输出你传给他的实参 s 所指的字符串,后面再加上错误原因字符串。调用此函数不需要传入 errno ,函数内部会自己去获取 errno 变量的值,调用此函数会直接将错误提示字符 串打印出来,而不是返回字符串,除此之外还可以在输出的错误提示字符串之前加入自己的打印信息。可以是源代码、目标文件或可执行文件等文件类型。(Hard Link)和符号链接(Symbolic Link,也称为软链接)。ln 命令是 Linux 系统中用于创建链接(link)的命令。的硬链接,它们指向相同的文件内容。

2024-08-08 19:43:55 344

原创 嵌入式学习(linux目录操作)

返回:失败反null;返回的结构体中重要的部分有:d_type & d_name[256]其中:d_type 包括:DT_DIR;DT_UNKNOWN。返回:流指针,失败返回null;成功返回一个指向此目录整体的指针。成功返回包含路径空间的字符串首地址。buf:保存工作路径空间的首地址。pathname:目录文件的名字。buf: 属性存放空间的首地址。size:保存路径空间的长度。改变当前程序的工作路径。path:改变到的路径。pathname:路径。path: 文件的路径。

2024-08-07 19:44:44 293

原创 嵌入式学习(Linux文件io)

feof:int feof (FILE *stream)用来判断是否到达文件的结束位置fseek:FILE * 表示要移动的文件指针的目标文件流对象offset 表示偏移字节量(正数则向右偏移,负数则向左偏移)whence 表示参考点的位置:SEEK_SET 文件开头;SEEK_CUR 当前位置SEEK_END 文件末尾ftell :long ftell (FILE *stream):获取从文件开头到当前指针位置的文件的大小;返回值表示文件大小。

2024-08-06 20:25:20 675

原创 嵌入式学习

linux中:IO都是对文件的操作man xxx:使用man手册,查看xxx代码具体的使用规则linux中的最高权限时ROOT对文件的操作:1、打开2、读写3、关闭fopen:打开文件。后面加上 r:只读;r+ :读写;w:只写;w+:读写;w在打开文件时可以创建新文件例如:fopen("1.txt","w"):则会打开一个名叫1.txt的文本文件,若没有这个文件,则创建并打开一个新的名叫1.txt的文件;fputc:意思是向指定的文件中写入一个字符。

2024-08-05 20:33:47 321

原创 嵌入式学习(linux部分)

讲用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互。当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编辑成。Linux中的shell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互。使用man命令可以找到特定的联机帮助页,并且提供简短的命令说明。双引号(" "):保留其中的变量属性,不进行转义处理。单引号(' '):转义其中所有的变量为单纯的字符串。while 和 [有空格,条件判断式和[ ]也有空格。反引号(` `):把其中的命令执行后返回结果。

2024-08-03 19:21:35 129

原创 嵌入式学习

共用体:共用体(Union)是一种特殊的数据类型,它允许在同一个内存位置存储不同的数据类型。共用体的所有成员共享同一块内存空间,因此同一时间只能存储其中一个成员的值。共用体的定义和结构体类似,使用关键字union,后面跟着成员列表。每个成员可以是不同的数据类型,。共用体的成员可以通过点操作符(.)或箭头操作符(->)来访问共用体的主要特点如下:共用体的大小取决于最大的成员的大小。共用体的成员共享同一块内存空间,只能同时存储其中一个成员的值。

2024-08-02 19:54:47 420

原创 嵌入式学习第十六天

单向链表是由一个个节点组成,节点没有名字,链表中的每个节点都包含一个存储空间,用于存储数据,以及一个指针,指向下一个节点的位置 达到逻辑上连续。这些节点在内存中是分散存储的,而不是连续存储的。这里已经使用了 0 - 8个字节,也就是9个字节,所以需要继续向后开辟空间,直到结构体变量对应偏移量为 12 字节地址处的时候,为 4 的整数倍,所以最终这个代码开辟了 12 个字节的空间。不同的编译器有着不同的对齐数,例如Visual Studio Code的编译器的对齐数是8,Linux的编译器的对齐数是4。

2024-08-01 19:42:29 273

原创 嵌入式学习第十五天

而不管 p 指向了数组的第几个元素,p+1 总是指向下一个元素,p-1 也总是指向上一个元素。*++p 等价于 *(++p),会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。假设 p 是指向数组 arr 中第 n 个元素的指针,那么 *p++、*++p、(*p)++ 分别是什么意思呢?*p++ 等价于 *(p++),表示先取得第 n 个元素的值,再将 p 指向下一个元素,上面已经进行了详细讲解。2:先定义一个指向函数的指针。

2024-07-31 18:50:49 158

原创 嵌入式学习十四天

然后因为dest需要被写入数据,所以没有用const 修饰,最后面的n 是说:将src 中的前 n 个元素写入到dest 的位置中。计算机的堆空间越来越小,随运行时间增加,计算机逐渐变得卡顿,而且后续要申请内存空间,可能会由于堆空间匮乏,无法成功申请。因为此时const 修饰的实际时 int * 这个指针,所以不可以对 p 进行修改,无法通过 *p 对*p 指向的值惊醒修改。在用const修饰普通变量时,被修饰的无法通过直接访问变量,对变量的值进行修改,但是,可以使用指针对该变量进行访问和修改。

2024-07-30 19:19:41 300

原创 嵌入式学习第十三天

是一个变量,它存储的是一个内存地址。这个地址指向的是另一个变量或数据的位置,也就是说,指针可以直接访问内存中的数据。在C语言中,函数的参数传递默认是值传递,也就是说,函数中的形参是实参的拷贝,对形参的修改不会影响到实参。但是,如果我们将指针作为函数的参数传递,就可以实现对实参的修改。这里,我们将指针a和b作为函数swap的参数传递,函数中的操作会直接修改a和b的值。数据类型是指针所指向的变量的数据类型,指针变量名是指针变量的名称。定义指针之后必须初始化指针,否则指针会变成一个野指针,指向未知的区域。

2024-07-29 18:07:58 120

原创 嵌入式学习第十二天

注意:在编译时并不是对两个文件分别进行编译,然后再将它们的目标程序连接的,而是在经过编译预处理后将头文件 format. h 包含到主文件中,得到一个新的源程序,然后对这个文件进行编译,得到一个目标(.obj)文件。它的作用是在本程序文件中用指定的标识符 PI 来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的 PI 都用“3.1415926”代替。但是有时希望程序中一部分内容只在满足一定条件时才进行编译,也就是对这一部分内容指定编译的条件,这就是“条件编译”。

2024-07-28 10:32:29 303

原创 嵌入式学习第十一天

必须一同将此二维数组的行数传入函数,不可以再函数中对二维数组进行 sizeof(a)/ sizeof ( a[ 0 ])的操作,因为其中sizeof(a)中的a 是作为数组的数组名传入函数,sizeof(a)的计算结果是8,因此无法正确运算。因此,形参数组名获得了实参数组的首元素的地址,前已说明,数组名代表数组的首元素的地址,因此,形参数组首元素(array[0])和实参数组首元素(score[0])具有同一地址,它们共占同一存储单元,score[n]和array[n]指的是同一单元。

2024-07-26 18:58:27 171

原创 嵌入式学习第十天

在大多数编程语言中,函数调用的执行是通过栈来管理的。每当一个函数被调用时,一个新的记录(称为"栈帧")被推入调用栈中,包含了函数的参数、局部变量和返回地址。当函数执行完成后,其对应的栈帧就会被弹出栈,并控制权返回到函数的调用点。语句的含义是:当expression表达式的值为假的话,则整个程序会立刻停止运行,写在assert之后的语句被中断,不会执行。且 实参在传入时,禁止进行++,或 - -运算,防止因为编译器问题,运行出不可控的结果。因为形参会单独开辟一个新的内存空间,用来保存实参传递来的值。

2024-07-25 19:52:29 172

原创 嵌入式学习第九天

5、函数执行return 语句后,会立刻停止运行当前函数,return 语句之后的语句将不会执行。如: int a [2][4] 表示一个名叫a的二维数组,其存储的数据的数据类型是int型数据,其有三行,每行可以存储四个元素。2、在形式参数声明时,每个参数数据的数据类型都必须独立给出,不可写成这样:int x,y;

2024-07-24 19:31:13 285

原创 嵌入式学习第八天

比较要查找的值n小于mid还是大于mid或是等于mid,然后更新begin 或end 的值,在更新mid的值,重复此操作比较mid 与n 的值的大小关系,直到比较出n;strlen( s ):获取字符串中除' \n '外所有的字符数量,即字符串中的有效字符数量,返回值是一个 long unsigned int 型数据。若小于:返回值是一个小于0的数;puts( s ):作用是输出括号中表示的字符串,其中s 是一个指针,指向字符串第一个元素的地址。输入的字符将存入s 中,s 表示存入第一个字符的地址。

2024-07-23 19:12:43 211

原创 嵌入式学习第七天

冒泡排序:从第一个元素开始,与第二个元素比较大小,将较小的元素放在左边,然后,将第二个元素与第三个元素比较,将较小的数放在左边,再将第三个与第四个比较,直到第len - 1 与 第len个比较完,第一轮比较结束。选择排序:从数组中的第一个元素开始,依次和后面的元素比较大小,若后面的数相较于第一个数小,则两数互换位置,知道与最后一个元素比较完毕,再从第二个元素开始,重复上述比较,直到从左边的第一个数比较到倒数第二个数。其中:数组类型不可以为void型。

2024-07-22 20:45:40 103

原创 嵌入式学习第六天

其中标识符是程序员对某一行程序起的标识符,遵循标识符命名规则,写在某一行代码的最前端;语句 语句 表达式。while(表达式);三种循环语句可以互相嵌套使用,使用时注意循环的内外层关系。使用go to 语句后,跳转到该行代码处继续运行。go to语句:格式:go to 标识符;continue:直接执行下一次循环。break:用于终止当前层次的循环。3.有使循环趋于结束的语句。

2024-07-20 18:59:20 123

原创 嵌入式学习第五天

第二个是:今天刚学习 if 语句,我没有注意 if 语句的书写格式,在写完第一个if判断语句后,没有写相应的输出结果直接继续想下写第二个if 判断语句,导致程序在编译时一直无法通过。所以c语言在逻辑判断时只要判断出&& 中的0 或 || 中的1,则后续的运算则不会往下进行,停止逻辑运算,及时后面有++i,也不会提前让i自加。: 是一个三目运算符,其中的a是一个条件判断语句,若为真,则输出结果是b,若为假,则输出结果为c。case(语句1): 对应的操作;case(语句2): 对应的操作;

2024-07-19 19:48:11 249

原创 嵌入式学习第四天

其中,&i的取地址符号&是一定要写入的,因为scanf函数是直接向变量申请的内存空间中存放数据,所以需要取地址符取出变量的地址,才能向其中写入数据.如果不加&,程序在运行过程中会报错,因为程序不能找到正确的变量地址,所以可能会访问到不能访问的区域发生报错.缓冲区:是介于计算机中的高速设备和低速设备直接的数据临时存储区域.遵循FIFO原则,即:先入先出,先输入的数据在输出时优先输出,余下的数据则不会输出.缓冲区既有输入缓冲区,也有输出缓冲区.其中n是一个整数,如:scanf("%2d",&i);

2024-07-18 18:47:58 227

原创 嵌入式学习第三天

在定义一个变量时可以同时给变量赋值,而变量的本质是在内存中随机划分出一片相应地内存给此变量使用,如:定义的标识符为int时,内存中会划分出四个字节的区域,在未赋值的情况下,这个区域中的数据是上一次这片内存使用后存储的数据(可以认为是随机数),在给标识符赋值后,如:int s = 3,新的数据会覆盖原有的数据存储在分配好的这四个字节中。当int---->float时:同样可以赋值。short —>int 或long:当字节数短的数据向占有字节数长的标识符赋值时,短的数据会在长数据空间的低位按顺序写入。

2024-07-17 18:42:38 333

原创 嵌入式学习第二天

int:整型类型(占四个字节) unsigned int:0~2^32-1 signed int:-2^31~2^31-1。其中short int:占2个字节 unsigned short int:0~2^16-1 signed int:-2^15~2^15-1。表示格式为:符号位:1位 (0为正,1为负)字符型类型:char:占1个字节,-2^7~2^7-1。

2024-07-16 17:54:29 292

原创 嵌入式学习第一天

mv 地址1 地址2:把文件或目录从地址1移动到地址2。ls -al查看当前工作目录下的所有文件的详细内容。cp 文件地址1 地址2:把文件1复制到地址2中。ls -l查看当前工作目录下的文件的详细内容。touch 地址 文件名:在此地址创建文件。ls -a查看当前工作目录下的所有文件。mkdir 目录地址:创建一个目录。rm -r 目录地址:删除目录。如:ls 查看当前工作目录下的文件。rm 文件地址:删除文件。touch:创建文件。cp:拷贝文件或目录。mv:移动文件或目录。rm:删除文件或目录。

2024-07-15 18:24:52 198

空空如也

空空如也

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

TA关注的人

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