嵌入式学习笔记——STM32的中断控制体系
STM32的中断控制体系
- 前言
- STM32中断的概念
- 中断类型
- 中断控制
- 常用控制函数
- 区分中断源与中断信号
- 配置中断
- 优先级
- 分组问题
- 中断使能
- 中断服务函数
- 总结
前言
上一篇中,借着串口接受的问题,简要说了一下串口中断的作用和用法,本文将对STM32的中断控制体系做个介绍。
STM32中断的概念
关于中断的概念,在上一篇中已经做了介绍了,说通俗点就是程序正常情况下是在while(1)内运行着相关的任务,例如下图中的任务1,任务2,在没有中断的时候,整个代码的运行流程就是完成初始化,然后在while(1)内一直循环里面的任务,此时如果任务1内有大的阻塞延时,类似串口等待接收,LED灯while死等延时这些都会阻塞整个while(1)的运行时间,导致执行效率严重低下,这种情况是不能满足日常需求的,所以在实际产品中很少有使用阻塞式的延时和while死等的情况。为了解决这个问题,这时就需要有中断的加入了。
加入中断后的运行流程图就变成了下图的情况,首先,中断是一个内核功能,不属于片上外设,但是使用过程中也需要初始化;其次,初始化后,会有一个与之对应的中断服务函数,上面的那些具有阻塞的功能通过中断服务函数内的各种标志位就可以实现变阻塞为不阻塞了;当初始化中断对应的条件满足时就会产生一个中断信号,这时CPU会停止当前任务,转而去到对应的中断服务函数里面,将中断服务函数内的任务先完成,完成后再回来继续执行原本的任务。编程时只需要判断对应的标志位即可解决上面的阻塞问题。
需要注意的是,中断是可以解决阻塞的问题,但是中断服务函数的本身也不能有延时、循环、阻塞程序,紧急事件是实时响应的,紧急事件不能执行太久。
总的来说,中断对于正常运行的CPU来说就是一个异常事件,而且异常事件的优先级高于正常运行的事件的优先级,发生异常必须先解决异常才可以重新回到正常运行。上一篇中的空闲中断和接收中断就是这样,那么,STM32的中断到底是怎么运行和管理的呢。
中断类型
首先,中断的控制是在内核里面的,中断的相关内容是有ARM公司设计的,在处理器内部会有一个叫做嵌套向量中断控制器NVIC得中断处理器,他就是专门用来管理整个STM32的中断问题的,其中中断的主要来源有两个,一个是处理器的内核出现了故障会触发系统异常,进而进入中断;二是片上外设触发了其相关的中断信号也会进入中断,像上一篇的出口接收中断和空闲中断就是属于后者,是外设产生的中断。
中断控制
在上一篇的配置中,已经使用到了NVIC的相关控制,关于这部分控制是官方封装好的函数,在使用过程中调用即可。也就是说,对于开发者来说,中断的控制只需要调用函数就可以了,这里借用上一篇调用的代码:
NVIC中断控制器做配置的时候流程:
第一步:配置优先级分组 (主函数配置)
第二步:合成优先级
第三步:分配优先级
第四步:使能对应的中断源 (在对应的片上外设初始化函数中)
//NVIC控制器配置
NVIC_SetPriorityGrouping(7-2);//设置中断的优先组别(111-110-101-100)
u32 pri=NVIC_EncodePriority(7-2,0,0);//设置抢占优先级为0,响应优先级为0
NVIC_SetPriority(USART1_IRQn,pri); //将对应的优先级设置映射到对应的中断
NVIC_EnableIRQ(USART1_IRQn); //使能中断源
常用控制函数
1.中断分组函数,此函数用于对整个工程进行中断分组
void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
位置:core_cm4.h------1435行
返回值:空
参数:uint32_t PriorityGroup 分组中需要写入的值
传参:7-占先的位数
分组整个工程都要一样,可以只配置一次,只需要在主函数使用一次即可
2.使能中断源配置函数,此函数用于使能对应的中断源
void NVIC_EnableIRQ(IRQn_Type IRQn)
位置:core_cm4.h------1467行
返回值:空
形参:IRQn_Type IRQn很明显此处形参是个结构体,需要使用结构体内规定好的名称
传入对应的片上外设中断源----放中断源名字 例如:串口:USART1_IRQn
作用:使片上外设的中断能够使用 核心级别中断使能
关于此函数的形参:IRQn_Type IRQn很明显此处形参是个结构体,需要使用结构体内规定好的名称 需要用时直接跳转过去复制即可。
注意,此处的形参编程时一定要跳转到stm32f4xx.h中找到对应的,不可以自己随意修改。
3.中断优先级配置函数,此函数用于设置对应中断源的中单优先级
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
位置:core_cm4.h------1550行
返回值:空
形参:IRQn_Type IRQn, uint32_t priority
IRQn_Type IRQn:中断源和上一个一样的中断源名称,需要去stm32f4xx.h复制
uint32_t priority:优先级(占先和次级一起的优先级)
4. 优先级合成函数,由于优先级写入时是一起写入的,但是分类时又是分开计算的,为了避免写入出错,官方给了一个合成函数,将分组、抢占优先级和响应优先级传入后此函数会返回需要写入的优先级值。
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
位置:core_cm4.h------1592行
返回值:u32类型的值 优先级uint32_t priority
形参:uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority
uint32_t PriorityGroup:优先级分组
uint32_t PreemptPriority:占先优先级
uint32_t SubPriority:次级优先级用法:u32 pri= NVIC_EncodePriority(7-2,3,2);NVIC_SetPriority(USART1_IRQn, pri);
从上面的注释中,可以看出NVIC控制器的作用:
①对中断优先级做分组
② 接收来自中断的请求
③ 配置中断的优先级
④ 使能外设的中断源
具体的代码在"core_cm4.h"中,查看步骤如下图所示,点击main.c前方1号框所在位置的"+“号,然后选择"core_cm4.h”,下滑就可以找到相关函数,对应的函数描述就在其上方注释。
区分中断源与中断信号
仔细回想上一篇中的配置过程,关于中断配置,除了上面的NVIC控制器的相关操作,还在USART的出事后配置中,使能了接收中断和空闲中断这两个控制位,那么这个使能与上面的中断源使能有什么区别呢。
中断源:一个片上外设 USART1独立的中断源 USART2也是独立的中断源
中断信号:指的是每一个中断源下,会有多个触发条件,例如串口1的接收中断和空闲中断。
也就是说,中断源相当于房子里的总电闸,而中断信号相当于房间里灯的开关,插座的开关,电视的开关。要开灯,不仅要打开总闸,还需要开启对应的分开关才行。
所以在中断配置过程中不仅需要配置对应的中断源使能,还需要使能具体的中断信号。
知道了中断的管理方式,接下来就是怎么管理的问题了。
配置中断
在上述管理的相关函数中,涉及了多个中断里面的名词,像分组,占先优先级、次级优先级、占先位数等等,看起来是有些混乱,接下来就来解释一下这些东西的具体作用。
优先级
首先,需要搞清楚优先级的定义,对于Cortex-M处理器的异常是否能被处理器接受以及何时被处理器接受并执行异常处理,是由异常的优先级和处理器当前的优先级决定的。
更高优先级的异常可以抢占低优先级的异常,这就是异常/中断嵌套的情形,也就是上面提及的占先优先级。
有些异常(例如:复位,Sys_Tick等)具有固定的优先级,其优先级由负数表示,这样,它们的优先级就会比其他的异常高。
其他异常则具有可编程的优先级﹐范围为0~255。依据以上描述优先级被分为三类:
**1.占先优先级:程序员进行配置的,具备抢占功能,就是当一个中断正在进行时,另外一个中断也产生了,高抢占优先级的中断可以打断低抢占优先级的中断优先运行,高优先级的运行结束后才会继续运行低优先级的。**类似下图,中断1的占先优先级是1,次级优先级为0;中断2的占先优先级为0,次级优先级为0;
此时,中断1已经在运行了,但是由于它的占先为1优先级低于中断2的0占先优先级,所以中断1会被中断2给打断,优先运行中断2,中断2运行完毕了才会回到中断1运行,中断1运行后再回到while(1)中运行。
**2.次级优先级:程序员进行配置的,不具备抢占功能,也就是说当一个中断正在进行时,另外一个中断也产生了,此时由于不具有抢占功能,所以需要等当前中断运行结束后再进入后面产生的中断中运行。**如下图,中断1的占先优先级为1,次级优先级为1,;中断2的占先优先级为1,次级优先级为0;
当中断1正在运行时,中断2也产生了,虽然此时中断2的次级优先级高于中断1的次级优先级,但是其不具有抢占功能,所以CPU会先运行完中断1后再去运行中断2。
次级优先级的作用在于,当不同优先级的中断同时到达时,CPU会优先执行次级优先级高的。
3.自然优先级:系统自己配置(不需要我们管),这个优先级是官方给的,最后的一道防线。
优先级:数字越小,优先级越高
分组问题
解决了优先级,接下来就要高清楚分组的问题了。这个分组其实就是决定上面提到的占先优先级的在优先级控制寄存器中的位数和次级优先级在优先级控制寄存器的位数,先看看M3和M4的权威指南关于分组的描述:
ARM在涉及的时候一共预留了一个8位寄存器来实现优先级控制的编程,理论上占先优先级和次级优先级会有2^8=256种组合方式。
但是,由于过多的中断优先级分组会影响单片机的性能,所以ST公司在实际设计STM32芯片的时候就丢弃了LSB也就是这个八位寄存器的第四位,只保留了四位用来做优先级的控制编程,这样一来,STM32的优先级分组就只有2的四次方种,也就是16种组合。
ARM体系下优先级配置寄存器总共由8位,占先和次级同时使用这个寄存器
中断的优先级共有256种
ST体系下,ST公司对ARM公司的中断进行了裁剪,只是用寄存器的高4位
中断的优先级共有16种。
可能还是有点没说清楚,来看下表吧,由于舍去了第四位,占先优先级和次级优先级这两个一起瓜分这四位,通过这四位来配置中断的优先级,其中的配置方式如下表:
写入的分组数 | 占先在优先级寄存器中的位数 | 次级在优先级寄存器中的位数 | 此模式下中断的具体优先级数 |
---|---|---|---|
7(111) | 0位 (范围:无) | 4位(范围:0-15) | 16种 |
6(110) | 1位 (范围:0-1) | 3位(范围:0-7) | 16种 |
5(101) | 2位 (范围:0-3) | 2位(范围:0-3) | 16种 |
4(100) | 3位(范围:0-7) | 1位(范围:0-1) | 16种 |
3(011) | 4位(范围:0-15) | 0位(范围无) | 16种 |
2(011) | 4位(范围:0-15) | 0位(范围无) | 16种 |
1(011) | 4位(范围:0-15) | 0位(范围无) | 16种 |
0(011) | 4位(范围:0-15) | 0位(范围无) | 16种 |
举几个栗子吧:
1.当对分组写入101也就是5时,占先优先级和次级优先级会分别占用优先级控制寄存器的两位,每一个都有0-3三种,组合起来一共就有16个优先等级,其中00为最高优先级,33位最低优先级,且0x(0,1,2,3)可以打断1x(0,1,2,3)、2x(0,1,2,3)以及3x(0,1,2,3)的中断优先运行,其他的也是依次类推。
2.假设在这个系统中,我们不需要占先优先级,此时就可以将占先的位置零,也就是对分组写入7(111)让优先级控制寄存器独享四位,这样的话,整个系统的中断之间就不会出现打断和抢占,当同一时刻有多个中断到来时,会优先执行次级优先级高的中断,执行完毕后才会转去下一个优先级相对高的中断,此时的16组中断都不具有抢占功能,最高优先级为0最低优先级为15.
3.假设我们在整个系统中需要各种中断嵌套,这时就可以不为次级优先级分配优先级控制寄存器的位数,让占先优先级独享四位,也就是写入3(011);这样就可以有(0-15)16种中断嵌套,其中优先级最高的可以打断任意中断,最高优先级为0,最低优先级为15。
其他的情况也就是依照上面进行类推即可,这里再做两个练习吧,
1.占先写入3 次级写入2 优先级分组能够是?5
2.占先写入4 次级写入1 优先级分组能够是?4
3.占先写入5 次级写入2 优先级分组能够是? //不能选择这种写入方式
需要注意的是,一个系统只能有一个中断分组,所以整个设置分组的函数也只需要在初始化时调用一次即可,具体的写入方式为:
写入值=7-占先的位数
NVIC_SetPriorityGrouping(7-2);//设置中断的优先组别(111-110-101-100)
//此时写入的分组为5对应的分组,占先占两位取值范围0-3,次级占两位取值范围0-3
上面的优先级设置函数中,最终的中断优先级的参数只有一个,也就是说,所有的分组、占先的值,次级的值都需要整合计算成一个数值写入,为了减轻计算的麻烦,也为了降低错误率,官方给了一个优先级计算函数,只需传入对应的分组、占先数和次级数即可计算出对应的优先级值,
u32 pri= NVIC_EncodePriority(7-2,3,2);//传入参数进行计算NVIC_SetPriority(USART1_IRQn, pri);//写入对应的优先级
中断使能
在弄清楚中断优先级和中断分组后,整个关于中断的操作就剩下了中断使能这最后一个步骤,这里的中断使能是指的对中断源的使能,官方已经给程序员提供了每个外设的中断源名称,使用时只需要在stm32f4xx.h内查询即可,具体的查询步骤在上面已经介绍过了,想看的自己往上翻一下。
注:此处只是打开了外设中断的总开关,具体的中断信号配置还需要在对应的片上外设设置时打卡。
中断服务函数
再经过上面的中断配置后,中断已经可以产生了,那么怎么起作用呢,这是就需要使用到中断服务函数了,中断服务函数就是中断产生后,CPU处理异常事件的代码入口, 具体执行的内容就是中断服务函数中的程序代码;和前面的中断源使能一样,官方也提供了对应片上外设的中断服务函数名,使用时直接在startup_stm32f40_41xxx.s复制即可。
中断服务函数也分为两个大类,一种是内核的中断,一种是外设的中断,这与中断的分类是一致的。
注意事项:
1.中断服务函数必须复制,不可以自己想当然的写,写错了不会报错,会很难查错误;
2.中断服务函数不需要声明、调用,也没有形参和返回值;
3. 具体的使用只需要触发中断信号就进入中断服务函数 为了能够实时的响应
格式;
4.中断服务函数中不能出现大量的延时和循环 尽量不使用printf,尽量简短;
格式:void 中断服务函数名(void){//判断是哪一个中断信号{//清除标志位------防止CPU重复进入中断//紧急事件程序}//判断为另一个中断信号{//清除标志位//紧急事件}
}
举个栗子:
中断的执行过程:
以串口1为例,接收中断,接收到了数据进入中断
空闲中断,数据接收结束了会进入中断
void 串口1中断服务函数(void)
{//判断是否为接收中断{}//判断是否为空闲中断{//清除标志位}
}
总结
好了,关于中断的介绍就记录到此,文中如有不足欢迎指出。本文重点就是详细描述一下中断的配置过程,以及中断的运行流程。
相关文章:

嵌入式学习笔记——STM32的中断控制体系
STM32的中断控制体系前言STM32中断的概念中断类型中断控制常用控制函数区分中断源与中断信号配置中断优先级分组问题中断使能中断服务函数总结前言 上一篇中,借着串口接受的问题,简要说了一下串口中断的作用和用法,本文将对STM32的中断控制体…...

如何发布自己的npm包
一、什么是npm npm是随同nodejs一起安装的javascript包管理工具,能解决nodejs代码部署上的很多问题,常见的使用场景有以下几种: ①.允许用户从npm服务器下载别人编写的第三方包到本地使用。 ②.允许用户从npm服务器下载并安装别人编写的命令…...
Qt QProcess管道命令带“|”多命令执行获取stdout输出问题总结
问题描述: 在Qt中,使用system和QProcess执行命令,system执行的命令,我们通常不需要获取stdout的输出结果,所以只需要得到返回结果,知道成功失败即可。 而用到QProcess,多半是要获取输出的返回信息。 这里的返回信息只要是标准输出的即可,当然了,也可以是别的channe…...

【JavaEE进阶篇2】spring基于注解开发1
在上一篇文章当中,我们提到了怎样使用spring来创建一个bean对象。下面,我们继续来研究一下,更加优胜的开发方式:基于注解开发【JavaEE进阶篇1】认识Spring、认识IoC、使用spring创建对象_革凡成圣211的博客-CSDN博客springIoc、使…...
统一登录验证统一返回格式统一异常处理的实现
统一登录验证&统一返回格式&统一异常处理的实现 一、用户登录权限效验1.1 最初的用户登录验证1.2 Spring AOP 用户统一登录验证的问题1.3 Spring 拦截器1.3.1 准备工作1.3.2 自定义拦截器1.3.3 将自定义拦截器加入到系统配置1.4 拦截器实现原理1.4.1 实现原理源码分析1…...
【建议收藏】华为OD面试,什么场景下会使用到kafka,消息消费中需要注意哪些问题,kafka的幂等性,联合索引等问题
文章目录 华为 OD 面试流程一、什么场景下会使用到 kafka二、消息消费中需要注意哪些问题三、怎么处理重复消费四、kafka 的幂等性怎么处理的五、kafka 会怎么处理消费者消费失败的问题六、数据库设计中,你会如何去设计一张表七、联合索引有什么原则华为 OD 面试流程 机试:三…...

【MySQL】MySQL的优化(二)
目录 explain分析执行计划 Explain分析执行计划-Explain 之 id Explain分析执行计划-Explain 之 select_type Explain分析执行计划-Explain 之 type Explain分析执行计划-其他指标字段 explain分析执行计划 通过以上步骤查询到效率低的 SQL 语句后,可以通过 …...

QT VTK开发 (一、下载编译)
Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C构建的,包含有大约250,000行代码,…...

C/C++每日一练(20230314)
目录 1. 移动数组中的元素 2. 搜索二维矩阵 3. 三角形最小路径和 🌟 每日一练刷题专栏 🌟 Golang 每日一练 专栏 C/C 每日一练 专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 移动数组中的元素 将一维数组中的元素循环左移 k 个位置 输入…...

裸辞3个月,面试了25家公司,终于找到心仪的工作了
上半年裁员,下半年裸辞,有不少人高呼裸辞后躺平真的好快乐!但也有很多人,裸辞后的生活五味杂陈。 面试25次终于找到心仪工作 因为工作压力大、领导PUA等各种原因,今年2月下旬我从一家互联网小厂裸辞,没…...

【Linux学习】进程间通信——system V(共享内存 | 消息队列 | 信号量)
🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言:你只管努力,剩下的交给时间! 进程间通信——共享内存 | 消息队列 | 信号量🏀共享内存⚽系统调用shmgetkey值⚽系统…...

解决 IDA 防F5转伪C笔记
某app砸壳后放到IDA,根据堆栈查到该位置如下; G调到,0x1b81bcc 看下: BR 调到后面 x8 x9地址,汇编指令; 找到x9的地址,然后减去基地址也就是首地址,得到便宜地址; hook x9: var moduleAddr = Module.findBaseAddress("XX"); var line = moduleAddr.add...
【面试题】你需要知道的webpack高频面试题
大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库谈谈你对webpack的看法webpack是一个模块打包工具,可以使用它管理项目中的模块依赖,并编译输出模块所需的静态文件。它…...

【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.60】损失函数改进为wiou
前言作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍&…...
2023年中职网络安全竞赛——数字取证调查(新版)attack解析(详细)
数字取证调查 任务环境说明: 服务器场景:FTPServer20221010(关闭链接)服务器场景操作系统:未知FTP用户名:attack817密码:attack817分析attack.pcapng数据包文件,通过分析数据包attack.pcapng找出恶意用户第一次访问HTTP服务的数据包是第几号,将该号数作为Flag值提交;…...
Cadence Allegro 导出Net Single Pin and No Pin报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Net Single Pin and No Pin作用3,Net Single Pin and No Pin示例4,Net Single Pin and No Pin导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频...
蓝桥冲刺31天之317
在这个时代,我们总是在比较,觉得自己不够好 其实不必羡慕别人的闪光点 每个人都是属于自己的限量版 做你喜欢并且擅长的事,做到极致 自然会找到自己独一无二的价值 鸟不跟鱼比游泳,鱼不跟鸟比飞翔 你我各有所长 A:组队…...

站上风口,文心一言任重道远
目录正式发布时机选择逻辑推理AI绘画用户选择总结自从OpenAI公司的chatGPT发布以来,吸引了全球目光,同时也引起了我们的羡慕,希望有国产的聊天机器人,盼星星盼月亮,终于等来了百度文心一言的发布。 正式发布 3月16日…...

Qt音视频开发24-视频显示QOpenGLWidget方式(占用GPU)
一、前言 采用painter的方式绘制解码后的图片,方式简单易懂,巨大缺点就是占CPU,一个两个通道还好,基本上CPU很低,但是到了16个64个通道的时候,会发现CPU也是很吃紧(当然强劲的电脑配置另当别论…...
百度发布文心一言,我想说几句
大家好,我是记得诚。 今天下午百度公司正式发布了文心一言,算是国内第一个交卷的互联网公司。 在ChatGPT和GPT-4的双重夹击下,可想而知百度的压力。 ChatGPT发布的时候,热度非常的高,大家对其都非常的感兴趣。 我是…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...