自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【无标题】

计算机内核分为CISC: complex istruction set computer(复杂指令集)成本高,体积大,功耗大 产生2 8效应,在80%情况下只能有到20%的功能。(x86)RISC:reduced istruction set computer 功能少,功耗下降,便携(ARM)ARM先是ARM1,ARM2 ARM3.。。。。。到ARM11后分类变为A Application(应用领域)M Mircr(微控制领域)R Real time(实时领域)

2025-09-08 23:13:44 858

原创 【无标题】

我的思路是,晶振为12mhz,则晶振/12为1000000hz,这个是频率,换算成周期则为10的-6次方,也就是说我每加一次,用的时间是10的-6次方s,也就是10的-3次方us, 我要算的是:花费1us的时间我能加几次。以下代码则是外部中断,将p3.2,p3.3设置为外部中断,且都是下降沿触发的方式,当我的P3.2接gnd时,会发生外部中断,在从1开始加1次,当p3.3接地时,会从999开始减。2.要设置触发方式,时下降沿触发还是边沿,由图看见,设置IT0为0,则p3.2接地会发生外部中断。

2025-09-05 00:20:49 808

原创 单片机点灯

动态数码管,由此可见,这八个发光二极管的负极都连在了LED1上,所以是共阴极数码管,所有发光二极管的阴极连接在一起形成公共阴极。LED1234再制高低电平时主要是由左边的,例如p10来控制LED1,将p10制位高电平,则LED1导通,接地,变为低电平。这是0-9的表示方法。使用按位与(&)配合按位取反(~)实现特定位清零,保持其他位不变,例如P2 &= ~(1<<4)关闭第4位对应的灯。一个是&=,一个是=,这两个的区别是,&=是其他位不变,指定为清零,而=是指定不考虑原来p2的值,直接赋值。

2025-09-03 23:19:12 752

原创 select

任务由生产者提交(例如处理完成的 socket 描述符、客户端请求等),消费者(线程池中的工作线程)从队列取任务并执行。通过复用已有的线程,避免频繁的创建销毁带来的开销,并能更好地控制并发度和系统资源。子进程循环接收客户端发送的数据,打印收到的内容,并返回原数据拼接字符串“----ok”给客户端。,表示关注可读事件。为了解决多线程或者多进程模型,在服务器运行过程,频繁创建和销毁线程(进程)带来的时间消耗问题。线程池通过预先创建线程并复用,减少创建开销,主线程作为生产者分发任务,工作线程作为消费者处理任务。

2025-08-27 22:46:03 2180

原创 tcp协议

AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB。2. 接收方数据处理速度较慢,导致多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出。TCP粘包问题:发送方应用层发送的多包数据,将来在接收方可能一次读到,多包数据产生了粘连。

2025-08-25 19:19:27 968

原创 网络通信UDP

2)编辑--》虚拟网络编辑器--》更改设置--》VMnet0---》桥接至--》当前PC正在上网的网卡上--》应用--》确定。公有IP:由电信公司直接分配,并需要付费的IP地址, 可以直接访问internet。

2025-08-24 20:09:52 771

原创 信号和共享内存

SIG_IGN: 以忽略方式处理该信号(不处理)SIG_DFL:以缺省方式处理(系统默认方式)函数的地址:以捕获方式处理(自定义)向自己所在的进程发送一个SIGALRM的信号。使用内存映射技术,减少的数据的反复拷贝,提高了通信效率。seconds:设置的闹钟的定时时间。SHM_RDONLY:只读。当进程收到一个信号,会打断该进程正在执行的任务,处理信号产生的事件;管理员信号:只能按照默认方式处理,不能够被忽略和捕获。增加数据的等级(优先级:优先级数据越小,优先级越高)自定义方式:返回自定义的函数入口。

2025-08-19 22:38:24 905

原创 管道的通信

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系(多个执行流拿着对方想要的锁,并且各执行流还去请求对方的锁)。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放(执行流本身使用着一把锁并不释放,还在请求别的锁)。(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺(A执行流拿着锁,其它执行流不能释放)。如:线程A获取了1锁,线程B获取了2锁,同时线程A还想获取2锁,线程B还想获取1锁。4. 管道破裂:读端关闭,向管道中写入数据,发生管道破裂(异常)

2025-08-18 23:25:07 1796

原创 线程的同步

5. 销毁锁:int pthread_mutex_destroy(pthread_mutex_t *mutex);4. 解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);start_routine:函数的指针:指向线程启动后要执行的任务(线程任务函数)2. 非分离属性:可以被其他线程回收或者结束的线程,称为非分离属性的线程默认属性:非分离属性)1. 分离属性:不需要被其他线程回收的线程称为分离属性得到线程,将来会被操作系统所回收。

2025-08-17 22:13:02 860

原创 进程的回收

功能:回收指定进程的资源和wait功能相似,比wait更灵活参数:pid:<-1 回收指定进程组内的任意子进程 (-100.等待GID=100的进程组中的任意子进程)-1 回收任意子进程,组内外0 回收和当前调用waitpid一个组的所有子进程,组内> 0 回收指定ID的子进程status 子进程退出时候的状态,如果不关注退出状态用NULL;options 选项:0 表示回收过程会阻塞等待WNOHANG 表示非阻塞模式回收资源。

2025-08-15 21:12:44 2217

原创 framebuffer

常见网络图片格式为JPG或PNG,属于压缩格式,体积小但可能存在图像损失(有损压缩)。BMP(位图)为未压缩的无损图像格式,数据完整,便于直接读取像素值。由于压缩图像需解压才能获取RGB值,因此在嵌入式设备贴图时通常使用BMP格式。

2025-08-13 22:37:42 752

原创 文件IO的学习

标准io 文件io。在使用文件io实现cat功能或者实现文件拷贝功能时,如果文件过大一次性读写不完,时需要进行循环。2.标准io是系统调用的一次封装,增加了缓冲区,目的是提高数据读写的效率。标准IO:---》 FILE *---》FILE ---》int fd;//文件读写位置复位。1.行缓存 1k(1024字节)---》人机交互界面,终端。stderr---》无缓冲。3.文件io主要应用在对硬件的操作上,也可以操作普通文件。

2025-08-12 19:01:41 996

原创 【无标题】

gets会将字符串后面的\n变为\0,将来读不到\0,而fgets会读到\n最后会加上\0。以下函数是读出图片的分辨率和,首先先读取bmp文件的相关信息,之后再读取bmp的图像信息。该代码是抢占1000字节,将第一千个字节赋值\0不让只是流指向第一千个字节并没有进行抢占。3.gets是危险的,因为在读取时,没有大小的限制,可能造成内存越界。功能:向文件中写入number个大小是size的数据到文件中。nmemb:希望从文件中读取的元素的个数。功能:从文件中读取number个大小是size的元素。

2025-08-11 20:18:16 783

原创 【无标题】

以下代码是将拷贝文件里的内容,一个文件进行读操作,一个进行写操作,运行时 写三个文件 ./a.out 1.txt 2.txt 之后会将1.txt的文件赋值到2.txt里。- 普通文件-------》xxx.c xxx.h xxtxt xxxjpg xxx.mp4 a.0ut。FILE*----》文件流指针----》以打开文件。//./a.out aaa bbb ----->实参。s 套接字文件 -----》网络通信。p 管道文件------》进程间通信。

2025-08-10 22:14:30 373

原创 【无标题】

3.完全二叉树,对于一颗有n个结点的二叉树技层序编号,如果编号(1<=i=n)的结点于同样深度的满二叉树中编号为ì的结点在二叉树中位置完全相同,则这可树为完全二叉树。n个结点的有限集合,集合要么为空树,要么由一个根结点和两棵互不相交,分别称谓根结点的左子树和右子树的二叉树组成。度为0的结点称谓叶结点。中序,左根右,先从根开始(不是先访问根),从左开始访问,在访问根,在访问右结点。1.斜树,所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。树的度数是指,这棵树中,最大的结点的度数,称谓树的度数。

2025-08-09 09:07:30 511

原创 循环队列和哈希表

遍历哈希表中所有元素的功能,也就是对每个链表中的所有节点进行访问并输出对应的数据内容。该函数进行两次遍历,第一次遍历是遍历哈希表里面的每个索引,里面的遍历是索引里面的每个节点。队列:允许从一端进行数据的插入,另一端进行数据删除的线性结构存储,称之为队列结构(线性)这个函数的逻辑和作用,它实现了队列的出队操作(删除元素)(头删)。这段代码是用C语言实现的哈希表插入操作,具体是向哈希表中插入新节点。哈希存储:将要存储的的数据的关键字和存储位置之间,建立起对应的关系。对于除字母外的字符,映射到哈希表的最大索引(

2025-08-07 21:17:58 848

原创 【无标题】

下列代码是出栈操作,是一个头删操作,首先判断是否为空栈,是的话就终端,定义一个指针指向头结点,将这个栈的ptop指向第二个节点,之后将首元素的值赋给指针,释放首元素,这时候pdata里就是首元素地址。栈顶始终有数据叫满栈,栈顶没数据叫空栈,满栈先移动栈顶再移动数据,而空栈是先移动数据再移动栈顶,满栈移出时先移动数据再移动栈顶。该代码是入栈操作,思路是创建一个节点,定义里面的data,然后把pnext值为空,之后进行插入操作,进行头插的操作。插入操作,叫做入队操作,插入的这段称之为队列的对尾。

2025-08-07 09:11:42 384

原创 双链表的增删查改

该函数是进行头删的操作,如果只有一个节点,定义一个节点指在这个节点上,将pdlink -> phead值为空,如果不是一个节点,则将指针指向第二个节点,将pdlink -> phead指向第二个节点,释放第二个节点的上一个节点,也就是头结点,将当前头结点(最初的第二个节点)的pper置空。该代码是尾插操作,首先先创建一个节点,如果该链表对象为空则直接进行链接,如果不为空,定义一个指针,将其通过循环移动到最后一个接节点,将最后一个节点的pnext连接到创建的节点上,将新建立的节点的pper连接到上一个节点。

2025-08-05 20:40:57 459

原创 【无标题】链表的查找排序和逆序等

之后开始判断如果头结点的data就已经大于pinsert里的data的值,那直接采用头插的将其插入到前面,但是如果头结点的值小于pinsert的data值,则我定义一个指针p先指向头结点,然后将p的next节点的data值进行和pinsert进行比较,如果p->pnext的值小于我的pinsert,就让p指针往后移直到。先定义一个指针ptmp指向第二个节点,然后将第一个节点后面置空,目的是将其断开,再定义一个指针pinsert也指向第二个节点,然后将ptmp移到下一个节点的位置。,代表待插入的节点。

2025-08-04 20:15:42 480

原创 数据结构增删改查操作

尾删操作,首先我定义一个ptmp的指针依次往后遍历,如果我要删除最后一个指针,那我不能将指针移到最后一个节点然后free,因为倒数第二个节点的pnext需要变为空,正确做法是移动到倒数第二个节点,然后将该节点的pnext释放掉,然后将这个节点的pnext值为空。尾插操作,首先开辟一个新节点pnode,之后再次创建一个指针指向头结点,将指针以此往后遍历,当循环结束后指针会停在最后一个节点的位置,之后将最后一个节点的pnext指向我刚开始新创建的节点pnode。

2025-08-03 18:00:23 1033

原创 结构体,共用体和位运算

首先先保存char的内存,在0处保存一个字节,之后放s要放在2处,两个字节,然后放double八个字节,要从8开,往后移八个字节,但是默认要按最长的字节对齐,为八的整数倍,所以为占16个字节。当i = 1后会开辟一个四字节的内存,因为c和i公用一个内存,c只有一个字节,所以当c访问空间时,会访问i的首字节地址,当首字节地址是1,则是小段存储。如果按结构体来算会输出8个字节,但是共同体的话只占4个字节,因为他们公用一个内存空间,所以为共用体,输出三个变量的地址,三个地址是一样的。

2025-07-31 22:48:26 1158

原创 指针数组,二维指针

qsort快速排序是可以先写一个回调函数之后调用,下面代码是qsort的回调函数,但是要注意,这个函数里面的形参都是void *,而void*不能直接进行指针访问,他的作用是进行强转操作。如果链接的过程中目标和原都是自己时,需要加入一个中间变量,防止出现内存重叠的情况,需要开辟另一个空间出来,把原来的原或者目标先拷贝过来,连接时也是从备份的空间进行拷贝。表示p是一个指向int指针的指针。relloc也是动态分配,当分配好空间后,他会自动把以前的内容复制到新的地址里面,并且把以前的指针释放掉,

2025-07-30 23:48:00 484

原创 指针指针指针

以下几个例子分别是从指针的角度来编写strlen ,strcpy, strcat ,strcmp几个函数的功能。在前面添加const说明是不能修改的部分,在后面的调用中既可以写数组名也可以写字符串常量,比如在strcat中调用可以写成Strcat(s1,"hello");下图代码为strcat函数完整的逻辑, 当用puts函数调用时,需要传入一个指针,而最初写的函数是void,不能返回指针,写成如下形式,必须将最初的dest地址进行拷贝,如果不拷贝最后返回的是最后的dest = 0.用于控制拷贝字符数。

2025-07-29 20:36:05 490

原创 指针迭代和递归

如果数组指针为int型,则指针变量的基类型也为int型, p = &a[0], 把a[0]元素的地址赋给指针变量p,也就是使p指向a数组的第0号元素。当(*p)++,表达的是首先*p指的是啊a[0]的值然后进行++运算,此时数组变为22345.....当为*p++时先进行++运算表达式没有加但是值加了,再进行指针运算,最后指针会指向a[1]。对指针进行加法运算,及p+n,其结果依旧是一个指针,新的指针是在原来的地址值基础上加上n(sizeof(基类型))个字节。注释的是迭代操作,下面的是递归。

2025-07-28 20:45:06 899

原创 【无标题】

所谓“文件包含"处理是指一个源文件可以将另外一个源文件的全部内容包含进来即将另外的文件包含到本文件之中。// 指针变量,存储a的地址,int *p中的*代表p是类型是一个指针,不代表指针运算,*p = &i的*代表指针运算。带参数的宏类似于函数,要进行参数替换,一般为#define 宏明 字符串 它实际上是在预处理阶段进行文本替换,没有类型检查。不要使用未初始化的指针(悬空指针)如果不知道一个指针变量到底指向谁(野指针)而对其指针进行指针运算会造成越界访问。换句话说,它的值是另一变量的地址。

2025-07-27 22:50:29 257

原创 函数函数函数

在编译器里面退出编辑模式到选择模式,然后然后输入:vsp + .c文件可以水平再次创建一个.c文件,输入sp +.h文件垂直创建一个.h文件,在创建的.c文件中编写对应的函数,在新建立的.h文件进行函数的声明extern+函数+;运行中空间不销毁,只在自己的函数里面。在全局变量加或者函数前加static,限制范围,只能在自己的.c文件使用。在函数的创建中,传参效率和和全局变量相比,传参效率要高于全局变量,且耦合性过高。全家变量的空间不在栈上,在全局区(静态区),全局变量如果不初始化,则默认为0。

2025-07-25 22:25:40 314

原创 函数与数组

也就是说,函数内部的参数是实参的一个副本,任何在函数中对形参的修改都不会影响到实参本身。之后是字符串数组的函数用法,一下为函数编写的字符串的判断长度,两个字符串的复制,两个字符串的链接和比大小四种运算。当数组作为参数传递时,传递的是首元素的地址,是指针传参,只是把首元素地址传到函数里并不是赋值一份传到函数内。指针传参,在背调函数中修改主函数的变量,通过指针参数在函数内部可以直接访问和修改原变量的值。该代码为运用函数对数组进行排序,分别用选择,冒泡,插入三种方式对函数进行排序。函数的传参是自右往左传递的。

2025-07-24 20:02:44 232

原创 【无标题】

二维数组的二分查找,先将二维数组进行排列,之后定义一个中间量,进行循环,如果中间量的大小小于要找的要找的内容,则将begin转到mid的位置+1,如果a[mid]比要找的大,则在左侧范围继续查找(end = mid - 1)之后再进行下一轮的比较,在二分查找中,如果找到目标,break退出循环,此时begin和end的范围仍然有效(或begin <= end依然成立)。二维数组初始化 inta[3][4]={{1,2,3,4},{5,6,7,8,},{9,10,11,12}};

2025-07-23 22:16:38 302

原创 C语言字符数组

第一项填写数组名,第二项填写数组大小,比如sizeof(a),第三项为“stdin”。数组必须是有序的,若干目标比中间元素小,则在左半部分继续查找,如果目标比中间元素大,则在右边查找。该图代码首先为一个冒泡排序,将数组进行顺序排列,之后查看中间值7与与顺序数组的中间值进行比较,发现大于中间值,则将begin切换到mid,再次进行比较,直到循环结束。strcat链接两个数组,用于将一个字符串追加到另一个字符串的末尾。,返回一个正值,下图代码表示先比较前两个数大小存入max之后又和a3比较,最后得到结果。

2025-07-22 18:59:04 437

原创 数组数组数组数组的排序

2.将它与未排序部分的第一个元素交换位置。如下图所示在第一次循环当i=0时,将a[0]与后面的九个数字进行比较,如果a[0]大于后面数字,则交换位置,继续用a[0]比较,直至循环结束,则第一次循环结束后a[0]将是数组的最小值,同理将数字以此排序。1.倒序排列,是指将数组中的元素顺序倒过来,比如[1,2,3,4,5]变为[5,4,3,2,1].一下代码为将[1,2,3,4,5,6,7,8,9,0]逆序排序。数组在内存中存在连续性,数组在内存中占据的是一块连续的内存空间,即数组中的元素在内存中是连续存储的。

2025-07-21 21:22:48 379

原创 C语言循环

break语句不能用在switch语句和循环之外的任何其他语句当中,在循环语句中,break语句可以用来从内循环跳出循环体,提前结束循环,而continue也是终止的语句,他的作用是结束本次循环,跳过循环体中尚未执行的语句,接着进行下一次的判定。表达式3) 语句,他的执行过程是先求解表达式1,然后求解表达式2,如果其表达式为真,则运行for循环里面的语句,之后再运行表达式3,之后继续执行表达式2,再次运行for循环内部语句,再运行表达式3。循环嵌套:一个循环体内包含另一个循环,称为循环嵌套。

2025-07-19 19:29:58 253

原创 55555

&和||的计算低于关系运算符,“!在下面的代码中,当遇到于操作时,如果做操作数如果为假,那么后面的操作将会被截断,在下面代码中当i <-6为假时,后面的++i将不会被运行,所以不会加一。在下图代码中,-4<i<j的比较中,从左到右,-4<i为真,所以前面会得到1,之后再将1和j进行进一步比较,1!举例如图,该代码通过条件语句打印输入月份的天数,当月份为2的时候进行的语句嵌套,判断年份如果是闰年就输出29,平年就输出28.在C语言中,以数值“1”代表“真”,以“0”代表“假”,非零即为真,0为假。

2025-07-18 21:18:35 274

原创 顺序程序设计

顺序程序设计

2025-07-17 20:26:56 286

原创 33333

C语言赋值,int i = 3;如果将short类型装换成int型时,由于short类型只占两个字节而int类型占四个字节,会将前面两个字节进行扩展,如果是无符号类型,前面添00 00,如果short是负值,那么前面添FF FF。运算符的运算中会有优先级的高低,例如乘法的优先级为3级,而加法的优先级为4级,所以在有加法和乘法的运算中,应该先算出优先级较高的运算。在强制转换后,得到一个中间变量,为临时变量,开辟临时地址,将转换后的值存入其中,之后会删除临时的地址但是原来变量的类型没有发生改变。

2025-07-16 21:13:52 173

原创 C语言数据类型

C语言中字符常量用单引号例如‘1’,‘a’占一个字节,类型为char,存储字符的ASCll,双引号用来表示字符串例如“hello”占8个字节,表示字符串第一个字符在存储的地址。6、整型数据的溢出:当输出的数值大于或者小于该类型的取值范围时,该情况不会报错,当超过取值范围的最大值时,又开始从最小值开始计数。阶码的计算为将整数部分变为二进制再将小数部分变为二进制,之后将其变为二进制的科学计数法,指数为几,就将指数加上127,得到的数字转成二进制,该二进制就为阶码。(1代表正数,0代表负数)

2025-07-15 19:35:30 338

原创 Linux终端命令行总结:

vi为编辑文档的内容,进入后分为编辑模式和命令模式,点击i为编辑模式,点击Esc为命令模式,双击yy为复制该行代码2yy为复制两行,p为粘贴,dd为剪切 2dd为剪切两行,p输出,此模式下输入:wq保存退出。cp为复制将某个文件夹复制到另一个目录下或者将一个目录复制到另一个目录下。比如 cp 目录/目录2 目录3/目录4/ -r。例如 mv 目录1/文件1 目录2,移除文件或目录都不用-r。rm为删除文件和目录,但是删除目录的话,应该加上-r,删除文件不用。./为当前目录,../为上一个目录。

2025-07-14 19:47:13 173

空空如也

空空如也

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

TA关注的人

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