自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ARM架构

ARM的工作模式,更准确地说,是处理器的执行状态。

2025-09-08 18:16:35 802

原创 中断系统,定时器

是一种通过调节数字信号脉冲宽度来模拟模拟控制的技术。其核心原理是:通过改变方波的占空比(高电平时间占整个周期的比例)来等效输。再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。51单片机可进行两级中断嵌套。出不同的平均电压或功率。

2025-09-04 18:22:13 707

原创 硬件基础与c51基础

是微控制器(MCU)或片上系统(SoC)上的一种​可编程数字引脚​。其核心特点是​功能通用——通过软件配置,同一个引脚既能作为输入也能作为输出,用于读取外部信号或驱动外部设备。它是微控制器与外部世界进行​数字信号交互的最基本、最直接的方式。最初是CPU的专用协处理器,主要负责图形计算,但现在其强大的并行能力也使其成为通用计算的重要角色。是一个集成了CPU、GPU和其他多个系统的"超级芯片",用于功能完整的设备。是一个集成了CPU和其他外围设备的"完整微型计算机",用于控制。是一个通用计算核心的概念。

2025-09-03 17:46:50 436

原创 TCP服务端并发模型

(4)当内核监测到事件时,应用层select将解除阻塞,并获得相关的事件结果。在不创建新的进程和线程的前提下,使用一个进程实现对多个文件读写的同时监测。(3)使用select传递集合表给内核,内核开始检测事件select()单循环服务器:服务端同一时间只能处理一个客户端的任务。多循环服务器:服务端同一时间处理多个客户端的任务。(2)添加关注的文件描述符到集合 FD_SET。(5)根据select返回的结果做不同的情况处理。对多个文件描述符的读写可以复用个进程。(1)创建文件描述符集合 fd_set。

2025-08-27 17:50:05 291

原创 http协议

2025-08-26 17:14:57 656

原创 Linux下的网络编程

2)编辑--》虚拟网络编辑器--》更改设置--》VMnetO---》桥接至--》当前PC正在上网的网卡上--》应用--2)端口号从1024-49151是被注册的端口号,被IANA指定为特殊服务使用。DNS:域名解析服务域名解析服务(www.baidu.com---》IP地址)1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号。B/S模型:browser/server(浏览器/服务器)C/S模型:client/server(客户端/服务端)1)虚拟机--》设置--》网络适配器---》桥接模式。

2025-08-22 22:09:46 1142

原创 信号 进程间通信

子进程空间异步回收:通过子进程发送的SIGCHLD信号实现。sighandler_t:执行信号任务处理函数的入口。增加数据的等级(优先级:优先级数据越小,优先级越高)向自己所在的进程发送一个SIGALRM的信号。功能:设置信号的处理方式(注册一个信号)shmaddr:要解除的用户空间首地址。SIG_IGN:以忽略方式处理该信号。seconds:设置的闹钟的定时时间。shmaddr:映射的用户空间首地址。signum:触发该任务函数的信号。共享内存:进程间效率做高的通信方式。

2025-08-19 20:44:17 1045

原创 线程回收与线程间通信

2.非分离属性的线程:pthread_join()阻塞回收。5.销毁锁 int pthread_mutex_destroy(pthread_mutex_t*mutex。1.分离属性: 不需要被其他线程回收的线程称为分离属性得到线。2.非分离属性:可以被其他线程回收或者结束的线程,称为非分离。1.分离属性的线程:不需要回收(没有空闲的线程可帮忙回收)临界资源:多个线程可以同时访问的资源称为临界资源:比。(默认属性:非分离属性).线程回收:pthread_join();功能:将线程设置成分离属性的线程。

2025-08-16 16:55:24 332

原创 exec族函数与线程

path:要执行的可执行文件的路径和名称arg:执行该可执行文件时需要传递的参数。参数:file:需要执行的可执行文件的名称(系统路径下已有的文件)线程没有进程安全性好,,一个线程异常可能影响同一进程中的所有线程。进程间不能直接通信,,需要使用进程间通信机制(IPC机制)进程资源开销大,每次创建都需要有0-4G的虚拟内存空间。进程创建线程时,会为其分配独立的(8M)栈区空间;资源开销较小,只需要所在进程为其开辟8M的栈区空间。轻量级的进程,可实现多任务的并发。进程安全性比线程高,各进程空间独立。

2025-08-15 19:07:12 682

原创 进程 进程相关编程

会被系统进程所收养 (守护类的进程)。僵尸进程:进程退出后,但其资源空间未被父进程回收。查看进程相关参数:PID、状态、CPU占有率、内存占有率。2.让该进程成为一个孤儿进程,结束时被操作系统中的系统进程回收。子进程拷贝父进程PCB(进程控制块)块中的部分内容:PID。孤儿进程:父进程先消亡,其对应的子进程成为一个孤儿进程,进程:是一个程序动态执行的过程,需要消耗内存和cpu;子进程:父进程产生出来的新进程即为该父进程的子进程。动态查看进程的相关参数:CPU占有率、内存占有率。

2025-08-14 20:01:14 545

原创 framebuffer

framebuffer本质上是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。framebuffer驱动程序控制LCD显示设备,通过映射framebuffer设备到用户空间,应用程序可以直接对显存进行操作,从而控制LCD显示内容。显示屏:800*600(横向有800个像素点,纵向有600个像素点)所以可以采用内存映射,将用户空间与显存空间建立起一一对应的关系。2.获取显示设备相关参数(分辨率、位深度)1.打开显示设备(/dev/fb0)显卡(显存(保存像素点的值))

2025-08-13 19:25:50 289

原创 文件io ,缓冲区

系统默认已经打开的三个文件占用了0(标准输入设备),1(标准输出设 备),2标准出错设备)这三个文件描述符。已打开文件需及时关闭,否则文件描述符使用完时会造成文件描述符泄漏。2.标准IO是系统调用的一次封装,增加了缓冲区,目的是提高数据读写的效率。3.文件IO主要应用在对硬件的操作上,也可以操作普通文件。1k(1024字节))-----》人家交互界面、终端。小的、非负的整形数据。4k(4096字节)-----》文件缓冲区。0k-------》出错信息对应的设备。pathname:要打开的文件的文件名。

2025-08-12 20:10:28 799

原创 fwrite fread与流定位相关接口

gets是危险的,因为在读取时,没有大小的限制,可能造成内存越界。功能:向文件中写入nmemb个大小是size的数据到文件中。从指定的已打开文件中读取最多一行数据(遇到n停止读取)功能:从文件中读取mmemb个大小是size的元素。gets会将终端读到的"\n"字符替换成"\0"nmemb:希望从文件中读取的元素个数。功能:获取流的当前位置到文开头的偏移量。stream:需要定位的文件流指针;stream:要写入的文件流指针。ptr:存储读取到数据的首地址。nmemb:要写入的元素个数。

2025-08-11 19:40:33 737

原创 linux文件操作

"w"以只写的方式打开 文件存在则清空 文件不存在则创建。"w+"以读写的方式打开 文件存在则清空 文件不存在则创建。"a+"以读写的方式打开 文件不存在创建 文件存在则追写。"r"以只读的方式打开 文件必须存在。"r+"以读写的方式打开 文件必须存在。FILE*---》文件流指针----》已打开文件。"a"以追加写的方式打开 文件不存在创建。stream::要读取的文件的文件流指针。stream:要写入的文件的文件流指针。

2025-08-09 17:27:56 368

原创 树和二叉树和算法复杂度

3,完全二叉树,对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<=n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这可树为完全二叉树。3.任意一个二叉树T,如果其叶子结点的个数是n0,度数为2的结点数为n2,n0=n2+1;1,斜树,“所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。2,满二叉树,所有的分支结点都存在左右子树,并且叶子都在同一层上。在满二叉树的基础下,删除节点,只能从右至左,从下到上,删若干个。添加节点,只能从左至右,从上到下,添加若干个。

2025-08-08 17:43:31 817

原创 哈希表(散列表)

在编程和数据结构中,"hash" 通常指的是哈希函数,它是一 种算法,用于将数据(通常是字符串)映射到一个固定大小的数字(哈希值)。哈希函数在哈希表中尤为重要,哈希表是一种通过哈希函数将键映射到表中位置的数据结构,以实现快速的数据插入和检索。也称为散列表,是一种通过哈希函数将键(Key)映射到表中一个位置以便快速访问记录的数据结构。要存储的关键字与要存储的位置建立一种联系,这种联系就叫哈希函数/散列函数。

2025-08-07 17:29:55 412

原创 栈和队列

在递归函数中,每次递归调用都会生成一个新的栈帧,包含该调用的局部变量和返回地址,这些栈帧在递归调用返回时被销毁。遵循先进先出(FIFO,First-In-First-Out)的原则,即最先添加到队列的元素会第一个被移除。遵循后进先出(LIFO,Last-In-First-Out)的原则,即最后添加到栈的元素会第一个被移除。:两者都使用类似的基本操作,如 push(压栈)和 pop(出栈),来添加和移除元素。:无论是数据栈还是系统栈,都遵循 LIFO 的原则,即最后进入的元素会第一个被移除。

2025-08-06 20:18:52 725

原创 双向链表

对于单向链表的某一个节点,只能找到其后的节点,而不能找到之前的节点。单向链表只有一个后继指针。

2025-08-05 19:52:39 253

原创 单向链表

当使用单向链表查看链表中某个节点的数据,可以使用快慢指针法快慢指针:快慢指针是一种在链表和数组中常用的算法技巧,主要用于解决链表或数组中的问题,如检测环存在、找到环的入口、计算链表的中点等。快慢指针的核心思想是使用两个指针以不同的速度遍链表或数组:>慢指针(Slow Pointer):每次移动一步。>快指针(Fast Pointer):每次移动两步。使用场景检测链表是否有环:如果快指针最终追上慢指针,说明链表中有环。如果快指针到达链表的末尾,说明链表中没有环。

2025-08-04 20:29:09 520

原创 结构体 共用体

2025-07-31 20:12:34 116

原创 指针的指针 函数指针 动态内存分配

要包一个头文件<stdlib.h>malloc(申请的空间不在栈上,在堆上)将你申请的大小的内存空间的首字节的地址返回。用malloc有可能申请不到,若申请到内存,则返回申请到的内存的首地址,若申请不到,则返回一个空指针。形如int (*pfn)(int,int) 的指针就是函数指针,*pfn就是这个函数指针的名字。malloc可以保证你所申请的内存空间一定是连续的。在函数的入口地址后面加一个(),就表示调用函数。指的是一个指针变量,他的值是另一个指针的地址。2025年7月28日。

2025-07-30 21:24:41 267 2

原创 数组指针函数指针

int a = 5;//修饰int类型,该变量的值不能修改在指针变量p之前加const指的是无法通过该指针修改他指向的变量strncpy函数:只拷贝字符串前n个字符数组指针:能够指向整个数组。与之前学过的指针不同,他们只能指向数组中的一个元素。对于数组a而言,数组的数组名a就是首元素的地址。&a,那么a是一个指针,a的类型就是一个长度为10的一位整形数组,那么&a就是一个指向长度为10的一维数组的指针。a的类型:int[10];所以在编写程序过程中,不能写一个int *p;

2025-07-29 18:54:58 558

原创 字符串指针

对指针可以进行加法运算,即p+n,其结果依旧是一个指针,新的指针在原基础上偏移sizeof n个基类型比较大小是关系运算,结果是一个逻辑值0或1。

2025-07-28 20:40:27 718

原创 预处理命令,指针初学习

gcc -E:要求gcc只做预处理,不进行编译,将main.c预处理的结果,放到main.i 里。#ifdef 后面的标识符是一个宏名,在预处理阶段,编译器会先去看这个宏有没 有定义,若定义则执行下面的程序。一般访问访问分为直接访问和间接访问,直接访问是直接对变量赋 值,间接访问是利用指针对变量进行间接赋值。编辑--->预处理 -->编译(转换为可被机器识别的二进制指令)--->链接。宏定义的后面不加分号,因为预处理只是替换,会将分号也替换过去,导致编译报错。带参宏的执行效率比函数的执行效率更高。

2025-07-26 16:58:09 249

原创 标识符的作用域与可见性

一般情况下,变量的值是存放在内存中的,当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中,经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。在函数内部定义的变量是局部变量,而在函数之外定义的变量称为全局变量(也称全程变量)。局部变量是作用在本函数内的变量即在本函数内才有效,在其他函数中是无效的,仅在局部作用域有效。

2025-07-25 20:22:36 311

原创 学习函数参数类型和函数特性,嵌套调用和递归调用

传参本质就是实参将自己本身的数值传递给形参的过程,但其本身不参与形参函数里面的运算,因为实参传过去的只是数值而不是其地址故而在运行过程中系统会给形参开辟一个空间存放实参的数据然后代替实参进行操作,而实参不改变。1.形式参数和实际参数:在定义函数时函数名的括号内的变量名称被称之为形式参数,而在主函数调用函数时函数名括号内的变量称之为形式参数。要先将实参存入栈区,而存入顺序形参所对应的实参按自右向左进行存入而在结束调用后再出栈(ps:栈区是有限的)。(3)在被定义的函数中,必须指定形参的类型。

2025-07-24 19:09:25 525

原创 二维数组及函数

这三者虽然都是代表的是第一个元素的地址但代表的含义不同第一个代表二维数组的第一个元素地址,第二个代表为其内部第一个一维数组的第一个元素地址,第三个代表对a[0][0]取址。可以使用两种方式方式1为直接输入数字用“ ,”隔开第2种则为每隔n个(n为列数)用“ {}”进行包裹在每个一维数组之间用“ ,”隔开。2.从函数的角度来分类:即无参函数(即有参函数的特殊情况)和有参函数。类型说明符 数组名 [常量表达式1] [常量表达式2]同时须区别'a', 'a[0]', '&a[0][0]'

2025-07-23 19:49:57 453

原创 字符数组和二分查找

char *strcpy(char *dest,const *strc) ~ 用法:strcpy(s1,s2),s2的数据内容拷贝给s1,使用时为了防止发生越界访问通常会让目标数组的容量足够大,最少为源数组的有效字符数+1。int strcmp(const char *s1,const char *s2) ~ 用法:strcmp(s1,s2)将s1的地址所对应的数据与s2的地址所对应的数据进行做差,大于为正小于为负等于为0;通过定义begin;用于存放字符的数组,其本质是字符串。

2025-07-22 18:39:52 603

原创 一维数组(排序)

将当前元素与已排序序列中的元素进行比较,找到合适的位置插入。数组的命名规则和变量名相同,定义数组时,需要指定数组中元素的个数,"[]"中的常量表达式用来表示元素的个数,即数组长度。​ 选择排序算法是通过遍历数组,选择出数组的最小或最大值,与指定位置交换数据,遍历完整个数组的所有位置就完成排序。数组越界就是数组的下标变量的取值超过了初始定义的大小,导致对数组元素的访问出现在数组的范围之外。2.有序性:下标小的元素总靠前,放在下标大的元素之前(地址)。越界的结果,可能会拿到不确定的值或者会导致程序报错。

2025-07-21 20:36:45 515

原创 循环语句和跳出语句的学习

用途: 主要用于复杂的流程控制或错误处理,如在深度嵌套的循环中跳出多层循环或处理异常情况。这种跳转是直接的、无条件的,不考虑程序中的函数调用或块的范围。用途: 主要用于在循环内部的某个条件达成时提前退出循环,通常用于避免无限循环或在已达到所需条件后停止执行循环体内的代码。特点: for 循环提供了一个结构化的方式来指定初始化、条件检查和循环体后的更新操作,通常用于已知循环次数的情况。用途: 保证至少执行一次循环体的情况,适合于需要先执行一次操作再检查条件的场景,例如菜单选择或循环处理用户输入。

2025-07-19 17:26:21 168

原创 【无标题】

switch内的表达式仅支持整型或者与整型兼容的数据类型,case后的表达式只能为常量,且每个case操作后面放置的常量不能相同否则会相互矛盾。特殊提醒:在使用逻辑运算符编写时,若前面逻辑运算符左边的表达式已然决定了逻辑运算表达式的真假,系统会从自动中断运行不会执行该表达式后面剩余的操作这种操作称为表达式中断。if根据语句1的条件进行判断若为真则进行存放目的代码1的操作,若为假则进行存放目的代码2的操作.一、关系运算符:< ,> , <= , >= , == ,!3.if (表达式) 语句1。

2025-07-18 20:36:47 379

原创 顺序程序设计、输入与输出

用法: scanf(“%d”,&i)————使用“&i”的原因是在被调函数中不能修改主调函数,这两者是相互独立的不提供地址,scanf会创建一个新的临时副本,改变这个副本不会影响原始变量。用法为: printf(“XXXX%d”,i)————"XXXX"自己想写啥写啥,%d可以变成自己需要的占位符由i决定且应与i的个数一致。%u,%0,%和%X 分别表示打印无符号整型,无符号八进制整型,无符号十六进制整型(x对应所以十六进制小写,X对应所有十六进制大写)其返回值是:输出量宽度的数量。

2025-07-17 18:24:02 609

原创 变量赋初值,各类数值型数据间混合运算

rvalue[right(readable)value]常量,只能放到右边,所有的临时变量(匿名变量)都为右值。在‌C语言中,‌求余运算符(%)用于计算两个数相除后的余数。这个运算符主要用于整型,也可用于与整型相兼容的数。i++:先赋值后加\n注意:自增运算符(++)和自减运算符(--)只能用于变量,不能用于常量或表达式。lvalue[left(locatable)value]变量,能放到运算符的左边。在声明一个变量的时候指定变量的值,这叫做初始化。const i:将该变量设置为只读变量,使其无法修改。

2025-07-16 19:36:26 385

原创 整型,浮点型,字符型数据类型的学习

如果为有符号整型,首位为符号位,正负决定首位,0为正1为负,正数就写出其对应的原码,如果为负数,则将该数取绝对值,将该绝对值取反加一。阶码 8bit 将十进制数化为二进制,在变为科学计数法,得到其指数加127,该数的二进制为阶码。整型在内存中的实际存放情况,分为大端和小端,小端存储末尾对应小地址,大端末尾对应大地址。指数形式:123e3或123E3表示为123*,字母e之前必须有数据,之后必须为整型。十进制:日常生活所用的,如123,1,202。浮点型后末尾加f,表示单精度,d表示双精度。

2025-07-15 17:41:17 423

原创 Linux 命令指示符的学习

(8)"cp"用于把源文件拷贝到目标目录下,用法为"cp + 源文件的(绝对/相对)路径 + 目标目录的(绝对/相对)路径",若操作对象为文件夹则完成前述操作后在指令后面输入"-r"即可完成删除文件夹操作。(5) "mkdir"用于创建文件夹,用法为"mkdir + 文件名"用于在当前目录下创建文件夹以及"mkdir + 目标目录的(绝对/相对)路径/文件夹名 "用于在指定目录下创建文件。(1)"ls"用于将目录列表展开了解所展开目录的内容,用法为"ls + 目标目录的(绝对/相对)路径"。

2025-07-14 18:06:52 582

空空如也

空空如也

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

TA关注的人

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