自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 标准输入输出流,面向对象,构造函数(表现形式)

为什么不直接用printf和scanf?不能输入/输出C++新增的内容。

2025-02-16 23:51:50 773

原创 C与C++的区别,类型转换,引用

左值引用–引用普通的变量<存储类型> <数据类型> &引用名;int a = 10;int &r = a;右值引用–引用临时变量int &&r;移动构造。{}namespace 标识符(名字)任何内容变量函数对象。

2025-02-12 23:26:37 583 1

原创 IO模型(阻塞IO,非阻塞IO,IO多路复用)

​ 写阻塞:当对文件描述符进行写操作时,如果没有足够空间,则进入阻塞状态。读阻塞:当对文件描述符进行读操作时,如果没有资源分配则进入阻塞状态。read、recv…​ 特点:当使用非阻塞IO,没有资源(输入或者输出)时,IO函数不会阻塞,而是会立即返回。​ 缺点:当用户使用阻塞IO进行IO操作时,有可能会阻碍其他程序的正常运行。​ 缺点:因为非阻塞IO函数在频繁调用时会消耗大量系统资源。​ IO多路可以对用户指定的文件描述符做统一的监测。​ 特殊:accept、connect。(1)select机制。

2025-02-10 20:04:21 208

原创 UDP小实验

【代码】UDP小实验。

2025-02-10 19:50:37 444

原创 三次握手,四次挥手,服务器模型(多进程并发,线程),基于套接字的UDP通信

当父进程接收到 SIGCHLD 信号时,会调用 signal_handler 函数,该函数使用 wait(NULL) 来回收子进程的资源,避免子进程成为僵尸进程。17对应的信号是 SIGCHLD,SIGCHLD 信号是在子进程状态发生改变(如子进程终止、暂停或恢复)时,由操作系统发送给父进程的信号。注意:如果在多线程并发服务器中出现公共数据访问时,需要使用同步或者互斥进行资源保护。注意:使用多进程并发服务器需要注意子进程资源回收的问题。(1)多线程并发服务器。(2)多进程并发服务器。

2025-02-09 22:17:13 286

原创 服务端与多客户端照片的传输,recv,send

服务器一次只能处理一个连接请求,只有将对应客户端的请求处理完成然后与之断开连接再与下一个客户端建立连接。服务器可以同时处理多个客户端的请求,就是并发服务器。recv/send函数专门用来进行网络通信的函数。TCP粘包:tcp的数据包边界不明显。​ 遍历每个字节寻找消息的格式头解析;将每个客户端的请求都创建对应线程去处理。​ 保证完整接收期望的数据。

2025-02-08 16:34:32 415

原创 网络编程(历史,网络协议模型),预备知识,基于socket的TCP通信

1968年:阿帕网(ARPAnet)问世,是internet的雏形。不能跨平台、跨操作系统、没有纠错功能1974年:TCP协议出现,TCP协议可以实现跨平台、跨操作系统的操作,但是还是没有有效的纠错功能协议:事先约定好的一组规则。

2025-02-07 17:01:13 669

原创 信号,System V IPC对象 共享内存,消息队列,信号灯

为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间,共享内存是一种最高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。​ 创建/打开信号灯 semget。​ 创建/打开共享内存 shmget。​ 获取IPC对象key ftok。

2025-02-07 09:39:49 298

原创 进程间通信

由于进程与进程之间内存空间独立,进程间通信是让不同进程之间进行数据交互,实现数据传输。本质是让不同进程空间可以访问同一个资源,而让不同进程看到同一个资源操作可以由系统不同模块实现,所以有不同的进程间通信方式。共享内存(share memory)、消息队列(message queue)和信号灯(semaphore)读端关闭向管道中写入数据的进程将收到内核传来的SIGPIPE信号,结束进程。无名管道(pipe)、有名管道(fifo)和信号(signal)管道:一个进程连接另一个进程的数据流。

2025-02-07 09:34:27 172

原创 线程(同步,互斥),形成死锁的四个条件

​​。

2025-02-07 09:31:36 367

原创 进线程(类型、状态、孤儿,僵尸进程)

程序:程序是静态的,它是一些保存在磁盘上的指令的有序集合进程:进程是动态的,是一个程序一次执行的过程,包括进程的创建、调度和消亡​ 正文段​ 数据段​ 系统数据段:pcb:进程控制块,通过进程控制块进行进程调度​ pc:程序计数器,记录下一次的执行指令​ CPU的所有寄存器值、数据堆栈​ 文件描述符表。

2025-01-20 16:24:09 326

原创 目录操作(opendir,stat)、静态库、动态库

​ (3) 添加/etc/ld.so.conf.d/*.conf文件,把库所在的路径加到文件末尾,并执行ldconfig 刷新, 这样,加入的目录下的所有库文件都可见。2.将.o文件做成动态库 gcc -shared -o libmyfunc.so *.o。1.将.c文件编译成.o文件 gcc -fPIC -Wall -c *.c。2.将.o文件做成静态库 ar crs lib库名.a *.o。1.将.c文件编译成.o文件 gcc -c *.c。

2025-01-11 19:35:06 331

原创 文件IO(系统调用)

文件描述符是一个顺序的非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符,对于内核而言,所有打开文件都由文件描述符引用。

2025-01-09 17:30:09 303

原创 标准IO(库函数)

库函数为了实现某个功能而封装起来的API集合提供统一的编程接口,更加便于应用程序的移植是语言或者应用程序的一部分。

2025-01-08 20:21:19 310

原创 OLED的显示

I2C时序:时钟线SCL高电平下:SDA由高变低代表启动信号,开始发送数据;SCL高电平时,数据稳定,数据可以被读走,开始进行读操作,SCL低电平时,数据发生改变;每发送一个字节的数据都会产生应答信号;时钟线SCL低电平下:SDA由低变高代表传输数据结束初始化: P6数据线(SDA) P7时钟线(SCL),选用P6和P7两根引脚,并给他们置为低电平分别输出数据线和时钟线。

2025-01-03 23:24:09 492

原创 ADC、温湿度传感器

利用光敏电阻传感器来测试adc引脚配置初始化ADC初始化,其中ADC使能过后,需要对其进行校准,随后开启软件启动转换读取转换完成后的数据当标志位为SET时循环结束。

2025-01-02 19:41:35 471

原创 串口发送数据,SysTick定时器的实现

USART_SendData(USART1,ch):将字符ch发送到 USART1串口的数据寄存器中启动发送流程。一旦定时器启动,定时器的计数逻辑会从SysTick->LOAD寄存器获取初始值,也就是9000000 - 1。,但在启动时是从SysTick->LOAD加载初始值),也就是VAL从初始值处开始递减。SysTick->CTRL &= ~(1<<1):倒计时到0时不产生中断。波特率、数据位、奇偶校验位、停止位、模式化选择、硬件流控的初始化。,确保它在开始计数时没有受到之前可能遗留的计数值的干扰。

2024-12-31 20:30:23 852

原创 按键控制灯,矩阵键盘原理

PB0接按键,接上一个上拉电阻。默认状态下PB0为高电平作为输入,初始化按键,当按键按下使用ReadInputDataBit函数读取PB0此时的低电平状态并返回,PA5作为输出,在main函数中运用switch…case语句进行调用。

2024-12-27 18:35:38 221

原创 stm32四联七段数码管,LED8*8点阵

2)仿真。

2024-12-26 19:41:40 542

原创 寄存器控制LED灯亮

LED.cLED.hmain.c二、分析基地址加偏移地址等于寄存器地址首先我们只数据手册上找到APB2的说明如上图所示外设时钟RCC的基地址为0x4002 1000,偏移地址为0x18,两者相加便是他的寄存器地址CRL(端口配置低寄存器),ODR(端口输出数据寄存器)同理(即为Port系列GPIO里面),GPIOA基地址为0x4001 0800,GPIOB基地址为0x4001 0C000x1<<2 的操作是将二进制数 00000001 左移 2 位,得到 00000100,然后通过

2024-12-25 19:59:56 1201

原创 stm32基础(keil创建、Proteus仿真、点亮LED灯,7段数码管)

随后点击新建(Ctrl+n),接着保存到所自己项目工程文件。.c .h都是这样操作。

2024-12-25 19:07:26 539

原创 线性表——顺序表

首先应该判断是否满了,如果满就没有插入的必要即返回-1,而后判断他的位置是否合法;i的初始值为表尾元素,条件是大于等于要插入的位置,插入位置整体向下移一位,**->**是 C 语言中的指向结构体成员运算符。当有一个指向结构体的指针seqList时,使用->可以访问该指针所指向结构体中的成员。顺序表是在计算机内存中以连续的存储单元依次存储数据元素的线性数据结构(由程序员开辟出来的)。index表示表尾元素,与实际的大小相差1,看内存满不满即看他+1是否等于数组长度。

2024-12-24 22:53:09 338

原创 数据结构基本概念、关系,算法

设算法对应问题的体积(或规模)为n,执行算法所占存储空间的量级为D(n),则D(n)为算法的空间复杂度(Space Complexity)。它确定了解决某一问题的一个运算序列。对于问题的初始输入,通过算法有限步的运行,产生一个或多个输出。可行性 —— 每个计算步骤能够在有限的时间内完成;数据结构指的是数据的逻辑结构和存储结构及其操作.有穷性 —— 算法执行的步骤(或规则)是有限的;数据库系统 操作系统 编译系统。输入 —— 算法有一个或多个外部输入;输出 —— 算法有一个或多个输出。4)时间复杂度(重点)

2024-12-16 17:04:03 558

原创 Makefile,自动变量,gdb调试

+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$% 如果目标是归档成员,则该变量表示目标的归档成员名称。所有时间戳比目标文件晚的的依赖文件,并以空格分开。$^ 所有不重复的目标依赖文件,以空格分开。$* 不包含扩展名的目标文件名称。$< 第一个依赖文件的名称。$@ 目标文件的完整名称。

2024-12-15 21:15:30 199

原创 测试文件、数字、管道(linux脚本)

预定义变量:预先赋值好的变量(环境变量) HISTSIZE PATH。$9 分别包含第一个到第九个命令行参数……$@ 包含所有命令行参数:“$1,$2,$* 包含所有命令行参数:“$1,$2,$0 与键入的命令行一样,包含脚本文件名。包含前一个命令的退出状态。$$ 包含正在执行进程的ID号。sum=0 数据类型不用写。$# 包含命令行参数的个数。

2024-12-12 20:13:55 191

原创 文件类型,目录,压缩归档,添加用户

grep “xxxx” file 在某一个文件中查找相应字符串。grep -r “xxx”path 在某一个路径下递归查找相应字符串。file 看文件的属性,一般用于查看库的支持架构。/etc/passwd 存储用户信息的文件。grep 查找某个文件中存在某个字符串。ln 默认硬链接 用物理编号。/etc/group 查看组id。tail ± 看后10行。ln -s 软链接 绝对路径。head ±n 看前10行。shell的一些其余命令{

2024-12-11 18:36:25 221

原创 linux基础

操作系统 :内核(进程管理,文件管理,网络管理,内存管理,用户管理), 驱动(操作设备的软), 根文件系统。免费,开源(定制化) GNU 开源免费不负责 GPL 开源收费负责。/etc/apt/sources.list 存放apt下载的网址。ping + ip + 域名 检查于某个ip是否连通。ifconfig eth0 + ip 配置ip。L: 有内存分页分配并锁在内存中。可剪裁,移植性能高(芯片架构)IPv4改到自动即可。D: 不可中断的静止。<: 高优先级的进程。N: 低优先级的进程。

2024-12-10 19:40:36 145

原创 递归函数,四个关键字

初始化:struct student s1 = {“康康”,241101001,88.8},s2;赋值:需要一个成员一个的赋值,不能像初始化一样赋值两个结构体变量之间可以直接赋值;s2 = s1;结构体变量成员的使用:结构体变量名** . **成员名;//使用结构体变量里面的某个成员//注意:成员是什么类型,上面操作就该怎么用。

2024-12-09 18:50:17 360

原创 函数及其传参

数据类型:函数运行之后结果的数据类型,就是返回值的数据类型 void。return:提前结束函数,返回后面的值。<数据类型><函数名>(<形参列表>);函数名:符合标识符命名规则-见名之意。形参列表:参数的个数、参数的类型。函数的声明:解释说明有这个东西;函数体:函数的功能主体部分。返回值:函数运行之后的结果。补充:可以省略形参的名字。直接拿返回值参与运算;定义一个变量来接收;

2024-12-08 22:56:52 206

原创 数组指针(行指针),指针数组

int a[4];int b[4];p=&a;

2024-12-07 22:57:07 353

原创 指针的运算,取地址(&),取内容(*),大小端存储

地址:十六进制的编号数字(常量)指针:是一种自定义数据类型指针变量:指针类型的变量,存放地址的定义:<存储类型><数据类型><变量名>int **q;<数据类型>+’ * ':构成指针数据类型int *:代表int类型数据的地址char:代表char类型数据的地址使用:*:取内容(反引用),&:取地址,得到某个变量的地址int a=10;int *p=&a;*p == *&a;a == *&a;;通过变量的名字去访问数据–直接访问。

2024-12-07 17:35:19 848

原创 数组即字符串函数的应用

本质:相同类型的变量所组成的有序集合;<存储类型><数据类型><变量名>;//变量<存储类型><数据类型><数组名>[元素个数];存储类型:四大存储类型(auto,static,extern,register)数据类型:基本数据类型数组名:符合标识符命名规则元素:在数组内部称呼构成数组的变量为元素元素个数:数字,决定了数组的长度//定义了一个叫做arr的数组,由6个int类型的变量构成数组的初始化://完全初始化//部分初始化,没有做初始化的存储位置默认赋0。

2024-11-30 22:27:18 741

原创 循环语句基础

表达式3:改变循环条件参数的一条语句,一般是自增自减。表达式1:给循环初始值,一般为赋值运算,定义变量。3.如果表达式2为真那么久去执行循环体;表达式2:循环条件,一般是关系运算。2.如果表达式为真就继续执行循环体。2.如果表达式为真就继续执行循环体。1.执行表达式1,给循环赋初值。3.如果表达式为假就结束循环。3.如果表达式为假就结束循环。2.判断表达式2的真假;4.循环体执行完继续判断。为假就结束for循环;1.判断表达式是否为真。}while(表达式)2.判断表达式是否为真。while(表达式)

2024-11-25 15:20:53 166

原创 数据类型之间的转换,变量,栈,控制语句

c

2024-11-22 20:24:21 522

原创 常量变量输入输出

常量变量输入输出

2024-11-21 19:42:28 285

原创 C语言基础

C语言基础

2024-11-20 19:41:06 572

原创 初识Linux

Linux

2024-11-19 19:09:06 271 1

原创 STM32——呼吸灯实验(PWM)

PWM实现呼吸灯

2024-08-18 10:01:14 794

原创 STM32——定时器中断点灯

STM32——定时器中断

2024-08-17 08:28:56 486

原创 LCD1602排队控制

基于STM32排队的实现

2024-08-15 15:30:56 791

STM32-呼吸灯实验(PWM)

STM32-呼吸灯实验(PWM)

2024-08-18

LCD1602排队控制

给于STM32排队的实现

2024-08-15

STM32-LCD1602显示一个字符

LCD1602显示一个字符代码

2024-08-14

STM32-电动车报警

电动车报警器代码

2024-08-13

STM32-中断实现震动点灯

STM32-中断实现震动点灯

2024-08-11

WiFi模块的AT指令联网数据交互

WiFi模块的AT指令联网数据交互

2024-07-16

WiFi模块的AT指令联网数据交互

WiFi模块的AT指令联网数据交互

2024-07-16

空空如也

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

TA关注的人

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