单片机知识总结(完整)

1、单片机概述
1.1. 单片机的定义与分类
定义:
单片机(Microcontroller Unit,简称MCU)是一种将微处理器、存储器(包括程序存储器和数据存储器)、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型计算机。它通常用于控制应用,可以在没有外部支持芯片的情况下独立运行。
分类:
-
按处理能力分类:
- 低端单片机:处理能力较弱,适用于简单的控制应用。
- 中端单片机:具有一定的处理能力,适用于中等复杂度的控制系统。
- 高端单片机:处理能力强,适用于复杂的控制系统和计算密集型应用。
-
按指令集分类:
- 复杂指令集单片机(CISC):指令丰富,操作复杂,适用于多种应用场景。
- 精简指令集单片机(RISC):指令简单,执行速度快,功耗低。
-
按位数分类:
- 4位单片机:处理能力有限,适用于简单的控制任务。
- 8位单片机:应用最广泛,如8051系列。
- 16位单片机:处理能力更强,适用于较为复杂的控制系统。
- 32位单片机:具有更高的处理能力和更多的功能,适用于高端应用。
-
按用途分类:
- 通用型单片机:适用于多种场合。
- 专用型单片机:针对特定应用设计,如汽车电子、家电控制等。
1.2. 单片机的发展历程
早期阶段(1970年代):
- 1971年,Intel推出了世界上第一款微处理器4004,随后推出了8008,为单片机的发展奠定了基础。
发展阶段(1980年代):
- 1981年,Intel推出了8051单片机,成为历史上最成功的单片机之一。
- 其他公司如Motorola、Zilog、Atmel等也相继推出了自己的单片机产品。
成熟阶段(1990年代):
- 单片机的性能不断提升,应用领域不断扩展。
- 出现了基于Flash存储技术的单片机,使得程序更新更加方便。
多元化发展阶段(2000年代至今):
- 单片机开始集成更多的功能,如USB、网络、CAN总线等。
- 32位单片机逐渐成为市场的主流。
- 出现了基于ARM架构的嵌入式处理器,进一步推动了单片机技术的发展。
1.3. 单片机的应用领域
-
消费电子:
- 家用电器(如洗衣机、空调、电视)
- 音响设备
- 游戏机
-
工业控制:
- 自动化生产线
- 机器人控制
- 电力系统监控
-
汽车电子:
- 发动机控制单元(ECU)
- 车身电子控制
- 车载娱乐系统
-
医疗设备:
- 监护仪器
- 医疗诊断设备
- 智能假肢
-
通信设备:
- 路由器
- 交换机
- 无线通信模块
-
物联网(IoT):
- 智能家居
- 智能城市
- 工业互联网
-
其他:
- 安全监控
- 环境监测
- 仪器仪表
2、单片机硬件基础
2.1. 单片机的内部结构

内部结构图
单片机的内部结构通常包括以下几个主要部分:
- 中央处理器(CPU): 执行程序指令,进行算术和逻辑运算。
- 程序存储器(ROM): 存储程序代码。
- 数据存储器(RAM): 存储运行时的数据和变量。
- 特殊功能寄存器(SFR): 控制和状态寄存器,用于特定功能的配置和状态反馈。
- 输入/输出端口(I/O): 与外部设备进行数据交换。
- 定时器/计数器: 用于定时或计数功能。
- 中断控制器: 处理中断请求,实现多任务处理。
- 串行通信接口: 实现与其他设备或单片机的串行通信。
2.2. 单片机的引脚功能

以8051单片机为例,它通常有40个引脚,以下是部分引脚的功能:
- VCC: 电源正极。
- GND: 电源负极。
- P0.0 - P0.7: 端口0,可以作为通用I/O口,也可以作为地址/数据总线。
- P1.0 - P1.7: 端口1,通用I/O口。
- P2.0 - P2.7: 端口2,通用I/O口,也可用于外部存储器地址线。
- P3.0 - P3.7: 端口3,通用I/O口,部分引脚具有第二功能,如P3.0和P3.1用于串行通信。
- RST: 复位引脚,高电平有效。
- ALE/PROG: 地址锁存使能/程序存储器编程。
- PSEN: 程序存储器选通信号。
- EA/VPP: 外部访问使能/编程电压。
2.3. 单片机的时钟与复位
- 时钟: 单片机的时钟用于提供CPU操作的基本时间节拍。8051单片机通常需要一个外部晶振或陶瓷振荡器来提供时钟信号。
- 复位: 当RST引脚接收到高电平时,单片机会执行复位操作,将CPU和寄存器恢复到初始状态。
2.4. 单片机的存储器结构

2.4.1 程序存储器(ROM)
程序存储器用于存储单片机的程序代码。在8051单片机中,程序存储器通常是只读存储器(ROM)或闪存(Flash)。汇编代码将被存储在程序存储器的特定地址中。
assembly ORG 0000H ; //程序起始地址 MOV A,
55H ; //将55H加载到累加器A
2.4.2 数据存储器(RAM)
数据存储器用于存储程序运行时的数据和变量。在8051单片机中,数据存储器是随机存取存储器(RAM)。
char data_var = 0xAA; // 定义一个字符变量并初始化为0xAA
data_var变量将被存储在数据存储器中的一个地址。
2.4.3 特殊功能寄存器(SFR)
特殊功能寄存器是CPU内部的一些寄存器,它们具有特定的功能,如控制I/O端口、定时器、串行通信等。P1是一个特殊功能寄存器,用于控制端口1的状态。
SFR P1 = 0x90; // 定义P1端口的地址
P1 = 0xFF; // 将P1端口的所有引脚设置为高电平
3. 汇编语言
(1)指令系统
汇编语言的指令系统是指单片机可以理解和执行的指令集合。每个指令对应一个特定的操作,如数据传送、算术运算、逻辑运算、跳转等。以下是一些常见的8051单片机汇编指令:
- 数据传送指令: MOV A, #data(将立即数data传送到累加器A)
- 算术运算指令: ADD A, Rn(将寄存器Rn的内容加到累加器A,结果存储在A中)
- 逻辑运算指令: ANL A, #data(将累加器A的内容与立即数data进行逻辑与运算)
- 跳转指令: JMP label(无条件跳转到label标签处执行)
(2)汇编程序结构
- 起始地址: 指定程序开始执行的地址。
- 数据定义: 定义程序中使用的变量和数据。
- 代码段: 包含实际的指令代码。
- 子程序: 可被主程序调用的代码块。
- 中断服务程序: 处理中断事件的代码。
assembly
ORG 0000H ; 程序起始地址
START: MOV A, #55H ; 将立即数55H传送到累加器AADD A, R0 ; 将寄存器R0的内容加到累加器AMOV P1, A ; 将累加器A的内容输出到端口P1SJMP START ; 无条件跳转到START标签处继续执行
(3) 汇编语言编程实例
例子1: 将P1端口的值翻转到P2端口
assembly
ORG 0000H
START: MOV A, P1 ; 将P1端口的值读取到累加器ACPL A ; 将累加器A的内容取反MOV P2, A ; 将取反后的值输出到P2端口SJMP START ; 无限循环
3.1C语言基础
C语言的基础概念:
- 变量: 用于存储数据的标识符。
- 数据类型: 定义变量可以存储的数据种类,如int、char、float等。
- 控制结构: 如if、for、while等,用于控制程序流程。
3.2 C语言编程实例
例子1: 将P1端口的值翻转到P2端口
#include <reg51.h> // 包含8051寄存器定义的头文件void main() {while (1) { // 无限循环P2 = ~P1; // 将P1端口的值取反后输出到P2端口}
}
reg51.h头文件包含了8051单片机的特殊功能寄存器定义,P1和P2是特殊功能寄存器,分别代表端口1和端口2。程序中的while循环会不断执行,将P1端口的值取反后输出到P2端口。
4、单片机I/O接口

4.1、I/O口的结构与功能
I/O口(输入/输出端口)是单片机与外部设备进行数据交换的接口。在8051单片机中,通常有P0、P1、P2、P3四个8位并行I/O端口。
-
结构:
- 锁存器: 用于存储数据输出。
- 缓冲器: 用于数据输入。
- 驱动器: 提供足够的电流来驱动外部设备。
-
功能:
- 输入模式: 可以读取外部设备的状态(如按键、传感器等)。
- 输出模式: 可以控制外部设备(如LED、继电器等)。
4.2、I/O口的编程方法
-
设置I/O口为输入模式:
- 对于P0、P1、P2、P3端口,可以通过设置相应的数据(定义)方向寄存器(如P1DIR)来控制每个位是输入还是输出。
-
设置I/O口为输出模式:
- 同样,通过设置数据方向寄存器来控制端口的方向。
-
读取输入:
- 直接读取I/O口寄存器即可。
-
写入输出:
- 直接向I/O口寄存器写入数据即可。
4.3、I/O口的应用实例
例子1: 控制一个连接在P1.0的LED亮灭( LED控制)
#include <reg51.h>void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++); // 简单的延时函数
}void main() {P1 = 0xFF; // 初始化P1口,所有LED熄灭while (1) {P1_0 = 0; // 点亮LEDdelay(1000); // 延时P1_0 = 1; // 熄灭LEDdelay(1000); // 延时}
}
例子2: 检测连接在P1.0的按键是否被按下(按键检测)
#include <reg51.h>void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);
}void main() {P1 = 0xFF; // 将P1口设置为输入模式,并启用内部上拉电阻while (1) {if (P1_0 == 0) { // 如果P1.0为低电平,表示按键被按下delay(20); // 延时消抖if (P1_0 == 0) { // 再次检测,确保按键确实被按下while (P1_0 == 0); // 等待按键释放P1_1 = ~P1_1; // 切换P1.1连接的LED状态}}}
}
例子3: 控制一个连接在P1.0的继电器开关(继电器控制)
#include <reg51.h>void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 123; j++);
}void main() {P1 = 0xFF; // 初始化P1口,所有继电器断开while (1) {P1_0 = 0; // 继电器闭合delay(5000); // 延时P1_0 = 1; // 继电器断开delay(5000); // 延时}
}``
`
5、单片机定时器/计数器
5.1、定时器/计数器的工作原理
定时器/计数器是单片机内部的一个重要模块,它可以用于计时或者计数。在8051单片机中,通常有两个定时器/计数器:定时器/计数器0和定时器/计数器1。
5.1.1 工作原理:
- 定时器模式: 当定时器/计数器被配置为定时器模式时,它会对单片机的内部时钟信号进行计数。当计数达到设定值时,定时器溢出,可以触发中断或改变I/O端口的状态。
- 计数器模式: 当定时器/计数器被配置为计数器模式时,它会对外部信号(通常是T0或T1引脚上的脉冲)进行计数。
5.2、定时器/计数器的编程方法
初始化定时器/计数器:
- 设置定时器/计数器模式。
- 设置定时器/计数器的初值。
- 启用或禁用定时器/计数器。
- 配置中断(如果需要)。
5.3、定时器/计数器的应用实例
例子1: 使用定时器0实现1秒的延时(延时)
#include <reg51.h>void Timer0_Init() {TMOD &= 0xF0; // 清除定时器0模式位TMOD |= 0x01; // 设置定时器0为模式1(16位定时器模式)TH0 = 0xFC; // 设置定时器初值(1秒延时,具体值取决于晶振频率)TL0 = 0x18;ET0 = 1; // 启用定时器0中断EA = 1; // 启用全局中断TR0 = 1; // 启动定时器0
}void Timer0_ISR() interrupt 1 {TH0 = 0xFC; // 重新加载定时器初值TL0 = 0x18;// 这里可以执行需要延时的代码
}void main() {Timer0_Init();while (1) {// 主循环代码}
}
例子2: 使用定时器1对外部脉冲进行计数(脉冲计数)
#include <reg51.h>void Timer1_Init() {TMOD &= 0x0F; // 清除定时器1模式位TMOD |= 0x10; // 设置定时器1为模式1(16位计数器模式)ET1 = 1; // 启用定时器1中断EA = 1; // 启用全局中断TR1 = 1; // 启动定时器1
}void Timer1_ISR() interrupt 3 {// 这里可以读取TL1和TH1的值,以获取脉冲计数// 注意:在中断服务程序中,通常不进行复杂操作
}void main() {Timer1_Init();while (1) {// 主循环代码}
}
例子3: 使用定时器0产生PWM信号(PWM输出)
#include <reg51.h>void Timer0_Init() {TMOD &= 0xF0; // 清除定时器0模式位TMOD |= 0x02; // 设置定时器0为模式2(8位自动重装载模式)TH0 = 0xFF; // 设置PWM周期(具体值取决于PWM频率)TL0 = TH0; // 初始化TL0ET0 = 1; // 启用定时器0中断EA = 1; // 启用全局中断TR0 = 1; // 启动定时器0
}void Timer0_ISR() interrupt 1 {static unsigned char pwm_width = 0; // PWM占空比变量if (TF0) { // 检查定时器是否溢出TR0 = 0; // 停止定时器TH0 = 0xFF; // 重新加载PWM周期TL0 = TH0;P1_1 = 1; // 开始PWM周期TR0 = 1; // 重新启动定时器} else if (TL0 == pwm_width) {P1_1 = 0; // 设置PWM占空比}
}void main() {Timer0_Init();
6、单片机中断系统
6.1中断系统的组成
-
中断源:中断源是指能够触发中断的事件或信号。中断源可以是硬件事件(如定时器溢出、外部引脚变化)或软件事件(如软件中断指令)。
-
中断控制器:中断控制器负责管理中断请求,确定中断的优先级,以及选择哪个中断服务程序(ISR)来响应。
-
中断向量表:中断向量表是一个存储中断服务程序入口地址的表格。当中断发生时,CPU通过中断向量表找到对应的中断服务程序。
-
中断服务程序(ISR):中断服务程序是一段用于处理特定中断事件的代码。当中断被触发时,CPU会暂停当前任务,跳转到ISR执行。
6.2中断处理流程
-
中断请求:中断源发出中断请求信号。
-
中断识别:中断控制器识别中断请求,并判断其优先级。
-
中断响应:如果中断被允许,CPU会暂停当前任务,保存当前程序状态(如程序计数器、寄存器等),然后跳转到对应的中断服务程序。
-
执行中断服务程序:CPU执行中断服务程序来处理中断事件。
-
恢复执行:中断服务程序执行完毕后,CPU恢复之前保存的程序状态,并返回到中断发生前的位置继续执行。
6.3中断优先级和嵌套
中断系统通常支持中断优先级,以决定多个中断同时发生时哪个中断将被首先处理。中断嵌套是指一个中断服务程序在执行时可以被另一个更高优先级的中断打断。
6.4程实践
#include <reg51.h>// 外部中断0服务程序
void External0_ISR(void) interrupt 0 {// 执行外部中断0的处理代码
}// 定时器0中断服务程序
void Timer0_ISR(void) interrupt 1 {// 执行定时器0的处理代码
}void main() {EA = 1; // 全局中断使能EX0 = 1; // 外部中断0使能ET0 = 1; // 定时器0中断使能// 其他初始化代码...while(1) {// 主循环代码}
}
7、单片机串行通信
单片机的串口通信是一种常用的数据传输方式,它允许单片机与其他设备(如计算机、传感器、其他单片机等)进行数据交换。
串口通信的基本概念
串口通信(Serial Communication)是一种按照位序列进行数据传输的方式,通常使用串行通信接口
串口通信的主要参数
-
波特率(Baud Rate):表示每秒钟传送的位数,单位是bps(bits per second)。
-
数据位(Data Bits):表示每个数据帧中数据位的数量,通常为7或8位。
-
停止位(Stop Bits):表示每个数据帧结束时的停止位的数量,通常为1、1.5或2位。
-
校验位(Parity Bit):用于错误检测的位,可以是奇校验、偶校验或无校验。
-
流控制(Flow Control):用于防止数据丢失的技术,如硬件流控制(RTS/CTS)或软件流控制(XON/XOFF)。
串口通信的硬件接口
- RX(接收):用于接收数据。
- TX(发送):用于发送数据。
- GND(地):用于信号参考点。
单片机串口通信的步骤
-
初始化串口:设置波特率、数据位、停止位、校验位等参数。
-
配置中断(可选):如果使用中断方式进行数据接收和发送,需要配置相关的中断服务程序。
-
数据发送:编写代码将数据写入串口发送缓冲区。
-
数据接收:编写代码从串口接收缓冲区读取数据。
示例1:8051单片机串口通信
#include <reg51.h>
```c```c```bash```bash
// 假设使用11.0592MHz的晶振void Serial_Init() {SCON = 0x50; // 设置为模式1,8位数据,可变波特率TMOD |= 0x20; // 定时器1使用模式2(自动重装载)TH1 = 0xFD; // 设置波特率为9600TL1 = 0xFD; // 与TH1相同TR1 = 1; // 启动定时器1TI = 1; // 设置TI位,准备发送
}void Serial_SendByte(unsigned char dat) {SBUF = dat; // 将数据放入发送缓冲区while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志
}void main() {Serial_Init(); // 初始化串口while (1) {Serial_SendByte('A'); // 发送字符'A'// 可以添加延时,控制发送速度}
}
首先初始化串口,然后在一个无限循环中发送字符’A’。Serial_Init函数设置了串口的工作模式和波特率,而Serial_SendByte函数负责发送一个字节的数据。
8、单片机外围设备扩展
单片机连接到各种外围设备的详细插图

相关文章:
单片机知识总结(完整)
1、单片机概述 1.1. 单片机的定义与分类 定义: 单片机(Microcontroller Unit,简称MCU)是一种将微处理器、存储器(包括程序存储器和数据存储器)、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…...
【C++】auto和decltype类型推导关键字
1.C11关键字 auto和decltype是C11引入的关键字,负责类型的推导。所有不同的是: auto可直接用来定义变量,编译器会自动推导出变量的类型。decltype是推导出一个操作数的类型,然后用这个类型再去定义。 2.两者区别 尽管两者都是宏…...
OGRE 3D----3. OGRE绘制自定义模型
在使用OGRE进行开发时,绘制自定义模型是一个常见的需求。本文将介绍如何使用OGRE的ManualObject类来创建和绘制自定义模型。通过ManualObject,开发者可以直接定义顶点、法线、纹理坐标等,从而灵活地构建各种复杂的几何体。 Ogre::ManualObject 是 Ogre3D 引擎中的一个类,用…...
ARM + Linux 开发指南
随想:想写一个系列来讲如何嵌入式开发,然后能形成一个知识体系,帮助那些刚刚做嵌入开发的同学们. 1. ARM Linux从开机到Linux完全启动的流程和代码分析 ARM Linux从开机到完全启动的流程与代码分析 ARM Linux的启动过程主要涉及从设备上电开始,到Linux内核完全启动并进入…...
facebook欧洲户开户条件有哪些又有何优势?
在当今数字营销时代,Facebook广告已成为企业推广产品和服务的重要渠道。而为了更好地利用这一平台,广告主们需要理解不同类型的Facebook广告账户。Facebook广告账户根据其属性可分为多种类型,包括个人广告账户、企业管理(BM&#…...
算法训练(leetcode)二刷第三十一天 | 1049. 最后一块石头的重量 II、494. 目标和、*474. 一和零
刷题记录 1049. 最后一块石头的重量 II*494. 目标和二维数组滚动数组 *474. 一和零 1049. 最后一块石头的重量 II leetcode题目地址 本题与416. 分割等和子集类似。依旧是01背包问题,本题尽可能将石头分为相等(相近)的两堆,然后…...
软件测试丨Pytest生命周期与数据驱动
Pytest的生命周期概述 Pytest 是一个强大的测试框架,提供了丰富的特性来简化测试执行。它的生命周期包括多个阶段,涉及从准备测试、执行测试到报告结果的完整流程。因此,理解Pytest的生命周期将帮助我们更好地设计和管理测试用例。 开始阶段…...
Figma入门-原型交互
Figma入门-原型交互 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的,对…...
网络安全防范技术
1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性,信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论,典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能抵抗…...
Java - JSR223规范解读_在JVM上实现多语言支持
文章目录 1. 概述2. 核心目标3. 支持的脚本语言4. 主要接口5. 脚本引擎的使用执行JavaScript脚本执行groovy脚本1. Groovy简介2. Groovy脚本示例3. 如何在Java中集成 Groovy4. 集成注意事项 6. 与Java集成7. 常见应用场景8. 优缺点9. 总结 1. 概述 JSR223(Java Spe…...
win10系统部署RAGFLOW+Ollama教程
本篇主要基于linux服务器部署ragflowollama,其他操作系统稍有差异但是大体一样。 一、先决条件 CPU ≥ 4核; RAM ≥ 16 GB; 磁盘 ≥ 50 GB; Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1。 如果尚未在本地计算机ÿ…...
基于Python制作一个简易UI界面
基于Python制作一个简易UI界面 目录 基于Python制作一个简易UI界面1 原理简介2 编写程序3 程序测试 1 原理简介 这里用到了Python自带的UI库tkinter。 tkinter 是 Python 的标准 GUI(图形用户界面)库,用于创建和管理图形界面。它提供了一个简…...
鲁菜大师程伟华到访金宫川派味业
共工新闻社11月29日电(范琦)上周,中国鲁菜大师、首批中国烹饪大师名厨程伟华到访金宫川派味业总部基地。这位从厨51年、坚持传承鲁菜的行业大师人物,深入了解了金宫川派的品牌文化,参观了金宫自动生产车间,…...
Linux设置jar包开机自启动
本文详细描述了如何在Linux服务器上创建并配置jar包的自启动脚本,包括编辑/etc/init.d/jar_auto.sh以设置环境变量,将jar包添加到rc.local以开机启动,以及提升脚本文件权限确保自动执行。 1、准备工作 Linux中Java的路径 项目jar包绝对路径 2…...
IoTDB 常见问题 QA 第一期
开始!关于 IoTDB 的 Q&A 我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。 Q1:WAL 堆积导致写入失败 问题及现象 集群报错: The write is rejec…...
【linux学习指南】linux捕捉信号
文章目录 📝前言🌠 信号捕捉的流程🌉 sigaction 🌠穿插话题-操作系统是怎么运⾏的🌉 硬件中断🌉时钟中断 🚩总结 📝前言 🌠 信号捕捉的流程 如果信号的处理动作是⽤⼾⾃定…...
git如何快速拉取已经提交的mr进行验证
参考:https://stackoverflow.com/questions/44992512/how-to-checkout-merge-request-locally-and-create-new-local-branch Pull merge request to new branch git fetch origin merge-requests/REQUESTID/head:BRANCHNAME i.e git fetch origin merge-requests/…...
【阿来来gis规划师工具箱说明书】h07四分标注
背景 在做arcmap的四分标注前,已经做好了二行三行的标注,以及在pro中做好了四分标注。这个四分标注做了好些版本,都达不到想要的效果。最终使用了静态标注的形式来做。 制作思路 新建两个承接标注文字的文本字段,考虑一般标注超…...
【大数据学习 | 面经】HDFS的三副本机制和编码机制
1. hdfs的三副本机制 hdfs的三副本机制是其核心特性之一,旨在确保数据的高可用性和容错性。通过将每个文件的数据块复制三个副本,并分散存储在不同的DateNode上,hdfs能够在节点故障的时候提供数据冗余和持续访问的能力。 三副本机制的工作原…...
lua-cjson 例子
apt install -y lua-cjson 安装 编辑 tmp.lua cjson require "cjson" p 666 d "23.42" payload{"d":[{"pres":..(p)..,"temp":"..(d).."}]} print("payload " .. payload) j cjson.decode(payloa…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
