初学stm32 --- NVIC中断
目录
STM32 NVIC 中断优先级管理
NVIC_Type:
ISER[8]:
ICER[8]:
ISPR[8]:
ICPR[8]:
IABR[8]:
IP[240]:
STM32 的中断分组:
中断优先级分组函数 NVIC_PriorityGroupConfig
中断初始化函数 NVIC_Init
总结
STM32 NVIC 中断优先级管理
CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。
而我们常用的就是这 68 个可屏蔽中断, 但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。因为我们开发板选择的芯片是 STM32F103 系列的,所以我们就只针对 STM32F103 系列这 60 个可屏蔽中断进行介绍。
在 MDK 内,与 NVIC 相关的寄存器, MDK 为其定义了如下的结构体:
NVIC_Type:
typedef struct
{
__IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Software Trigger Interrupt Register */
} NVIC_Type;
STM32 的中断在这些寄存器的控制下有序的执行的。 只有了解这些中断寄存器,才能方便的使用 STM32 的中断。下面重点介绍这几个寄存器:
ISER[8]:
全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。上面说了 CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。但是STM32F103 的可屏蔽中断只有 60 个,所以对我们来说,有用的就是两个(ISER[0]和 ISER[1]),总共可以表示 64 个中断。而 STM32F103 只用了其中的前 60 位。 ISER[0]的 bit0~bit31 分别对应中断 0~31。 ISER[1]的 bit0~27 对应中断 32~59;这样总共 60 个中断就分别对应上了。 你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、 IO 口映射等设置才算是一个完整的中断设置)。具体每一位对应哪个中断,请参考 stm32f10x.h 里面的第 140 行处(针对编译器 MDK5 来说)。
#ifdef STM32F10X_HDADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */TIM2_IRQn = 28, /*!< TIM2 global Interrupt */TIM3_IRQn = 29, /*!< TIM3 global Interrupt */TIM4_IRQn = 30, /*!< TIM4 global Interrupt */I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */SPI1_IRQn = 35, /*!< SPI1 global Interrupt */SPI2_IRQn = 36, /*!< SPI2 global Interrupt */USART1_IRQn = 37, /*!< USART1 global Interrupt */USART2_IRQn = 38, /*!< USART2 global Interrupt */USART3_IRQn = 39, /*!< USART3 global Interrupt */EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ADC3_IRQn = 47, /*!< ADC3 global Interrupt */FSMC_IRQn = 48, /*!< FSMC global Interrupt */SDIO_IRQn = 49, /*!< SDIO global Interrupt */TIM5_IRQn = 50, /*!< TIM5 global Interrupt */SPI3_IRQn = 51, /*!< SPI3 global Interrupt */UART4_IRQn = 52, /*!< UART4 global Interrupt */UART5_IRQn = 53, /*!< UART5 global Interrupt */TIM6_IRQn = 54, /*!< TIM6 global Interrupt */TIM7_IRQn = 55, /*!< TIM7 global Interrupt */DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */DMA2_Channel4_5_IRQn = 59 /*!< DMA2 Channel 4 and Channel 5 global Interrupt */
#endif /* STM32F10X_HD */
ICER[8]:
全称是: Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ICER 一样。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。具体为什么这么设计,请看《CM3 权威指南》第 125 页, NVIC 概览一章。
ISPR[8]:
全称是: Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。
ICPR[8]:
全称是: Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。写 0 无效。
IABR[8]:
全称是: Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
IP[240]:
全称是: Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当重要! STM32 的中断分组与这个寄存器组密切相关。 IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。 而 STM32 只用到了其中的前 60 个。 IP[59]~IP[0]分别对应中断 59~0。 而每个可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。
STM32 的中断分组:
STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表1 所示:

通过这个表,我们就可以清楚的看到组 0~4 对应的配置关系,例如组设置为 3,那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
这里需要注意两点:
第一,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
第二,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断,当两个中断同时发生的时候响应优先级高的先执行中断。
结合实例说明一下:
假定设置中断优先级组为 2,然后设置中断 3(RTC 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1) 的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。
上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!
接下来我们介绍如何使用库函数实现以上中断分组设置以及中断优先级管理。 NVIC 中断管理函数主要在 misc.c 文件里面
中断优先级分组函数 NVIC_PriorityGroupConfig
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。这个函数我们可以找到其实现:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
从函数体可以看出,这个函数唯一目的就是通过设置 SCB->AIRCR 寄存器来设置中断优先级分组。
#define IS_NVIC_PRIORITY_GROUP(GROUP)
(((GROUP) == NVIC_PriorityGroup_0) ||
((GROUP) == NVIC_PriorityGroup_1) || \
((GROUP) == NVIC_PriorityGroup_2) || \
((GROUP) == NVIC_PriorityGroup_3) || \
((GROUP) == NVIC_PriorityGroup_4))
这也是我们上面表1 讲解的,分组范围为 0-4。比如我们设置整个系统的中断优先级分组值为 2,那么方法是:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
这样就确定了一共为“2 位抢占优先级, 2 位响应优先级”。
中断初始化函数 NVIC_Init
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
其中 NVIC_InitTypeDef 是一个结构体,我们可以看看结构体的成员变量:
typedef struct
{uint8_t NVIC_IRQChannel;uint8_t NVIC_IRQChannelPreemptionPriority;uint8_t NVIC_IRQChannelSubPriority;FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
NVIC_InitTypeDef 结构体中间有四个成员变量,这四个成员变量的作用是:
- NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到每个中断对应的名字。例如 USART1_IRQn。
- NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。
- NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。
- NVIC_IRQChannelCmd:该中断是否使能。
比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,子优先级位 2,初始化的方法是:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器
总结
- 系统运行开始的时候设置中断分组。 确定组号,也就是确定抢占优先级和子优先级的分配位数。 调用函数为 NVIC_PriorityGroupConfig();
- 设置所用到的中断的中断优先级别。 对每个中断调用函数为 NVIC_Init();
相关文章:
初学stm32 --- NVIC中断
目录 STM32 NVIC 中断优先级管理 NVIC_Type: ISER[8]: ICER[8]: ISPR[8]: ICPR[8]: IABR[8]: IP[240]: STM32 的中断分组: 中断优先级分组函数 NVIC_PriorityGroupConfig 中断初始化函…...
机器人角度参考方式
机器人的角度可以根据需求和系统设计来决定。通常情况下,机器人角度(如航向角或偏航角)有两种常见的参考方式: 参考开机时的 0:这是最常见的方式,机器人在开机时会将当前的方向作为 0(即参考方向…...
不同路径
不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径ÿ…...
WPS工具栏灰色怎么办
WPS离线不登录,开启工具栏等相关功能 当你在使用WPS的过程中,若因网络问题或其他特殊原因,导致无法登录使用WPS时,可根据以下步骤开启离线兼容模式,开启此模式后,可在未登录的状态下,激活并使用…...
js的节流与防抖方法封装
简介 节流(Throttling)和 防抖(Debouncing) 是防止频繁触发函数执行的两种技术,它们的目标都是减少函数的执行次数。 区别 防抖(Debouncing) :当用户停止触发事件后,经…...
深信服企业级数据备份与恢复系统(整机裸机恢复)
概述 深信服企业级数据备份与恢复系统可实现无需搭建目标环境,目标机可以是没有操作系统的物理主机或虚拟机,实现异构环境下的裸机恢复。 深信服企业级数据备份与恢复系统支持的多种连接恢复方式: 1. PXE连接恢复:PXE连接需要做…...
uniapp 微信小程序 页面部分截图实现
uniapp 微信小程序 页面部分截图实现 原理都是将页面元素画成canvas 然后将canvas转化为图片,问题是我页面里边本来就有一个canvas,ucharts图画的canvas我无法画出这块。 想了一晚上,既然canvas最后能转化为图片,那我直接…...
Sequelize ORM sql 语句工具
Sequelize ORM sql 语句工具 sequelize orm中文网 视频学习长乐未央 初始化配置 Sequelize orm 配置文章落日沉溺于海 在命令行中全局安装 npm i -g sequelize-clisequelize 执行需要匹配 mysql2 对应的依赖(安装 mysql2) npm i sequelize mysql2初始化…...
搭建Nacos注册中心
Nacos介绍 目前开源的注册中心框架有很多,国内比较常见的有: Eureka:Netflix公司出品,目前被集成在SpringCloud当中,一般用于Java应用 Nacos:Alibaba公司出品,目前被集成在SpringCloudAlibaba中…...
Linux 下SVN新手操作手册
下面来介绍Linux 下 SVN操作方法: 1、SVN的安装 Centos 7 安装Subversion sudo yum -y install subversion Ubuntu 安装Subversion sudo apt-get install subversion 自定义安装,官方地址:https://subversion.apache.org/ 2、SVN的使用…...
解释下什么是面向对象?面向对象和面向过程的区别?
看着很基础是吧,你还真不一定会 4-Java 中创建对象的几种方式? 1、使用new关键字,最常见的创建方式,通过调用类的构造方法(构造器)来创建对象。 2、使用反射,通过java的反射API可以动态的创建对…...
【CDN】快速了解CDN是什么?以及工作原理和应用场景
快速了解CDN是什么?以及工作原理和应用场景 一、什么是CDN?CDN相关的术语解释 二、CDN工作原理三、CDN与传统网站的区别四、CDN的作用和意义五、CDN的应用场景 一、什么是CDN? CDN英文全称Content Delivery Network,中文翻译即为内…...
【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用
引言 在上一篇文章中,我们详细介绍了ResNet与GoogLeNet的网络结构、设计理念及其在图像分类中的应用。本文将继续深入探讨如何在实际项目中应用这些模型,特别是如何保存训练好的模型、加载模型以及使用模型进行新图像的预测。通过这些步骤,读…...
WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)
文章目录 1、引言2、案例效果3、案例实现1、依赖安装2、文件创建3、代码实现1、依赖引用与上下文2、个性化视觉效果:自定义 ItemContainerStyle3、页面样式与布局完整代码4、ViewModel 逻辑实现5、子界面代码:3、实现效果4、源代码获取5、总结1、引言 在WPF应用程序开发中,…...
Git进阶:本地或远程仓库如何回滚到之前的某个commit
在Git的使用过程中,我们经常会遇到需要回滚到之前某个commit的情况。无论是为了修复错误、撤销更改,还是为了重新组织代码,回滚到特定commit都是一个非常有用的技能。本文将介绍几种常用的回滚方法,帮助读者更好地掌握Git版本控制…...
Django 后端数据传给前端
Step 1 创建一个数据库 Step 2 在Django中点击数据库连接 Step 3 连接成功 Step 4 settings中找DATABASES Step 5 将数据库挂上面 将数据库引擎和数据库名改成自己的 Step 6 在_init_.py中加上数据库的支持语句 import pymysql pymysql.install_as_MySQLdb()Step7 简单创建两列…...
Docker 技术系列之安装多版本Mysql5.6和Mysql5.7
image 大家好,后面的就不是关于MAC专有的内容,基本是跟Java环境,基础技术方面有关。所以这个教程对于在linux系统还是macOS都是通用的,不用担心。 上一篇,我们安装好对应的Docker之后,感受到了它的便利。接…...
C# 范围判断函数
封装范围函数 public static class CommonUtil {/// <summary>/// 范围判断函数,检查给定的值是否在指定的最小值和最大值之间。/// 例如,可以用来判断当前日期是否在开始日期和结束日期之间。/// 该方法适用于任何实现了 IComparable 接口的类型…...
技术速递|使用 Dependabot 管理 .NET SDK 更新
作者:Jamie Magee - 高级软件工程师 排版:Alan Wang 保持 .NET SDK 版本的更新对于维护安全高效的应用程序至关重要。现在 Dependabot 可以在 global.json 中更新 .NET SDK 版本,这使您可以比以往更轻松地确保自己的应用程序始终运行最新的安…...
笔记本通过HDMI转VGA线连接戴尔显示器,wifi不可用或网速变慢
早上开开心心的来使用我的分屏显示器,结果winP开拓展,我的wifi就断掉了,琢磨了好一阵我以为是wifi的问题,发现不进行拓展,网络又好了,一上午就研究这个了,说是hdmi信号干扰了wifi信号啥的额&…...
Excel中match()函数
函数功能概述 MATCH 函数是 Excel 中用于在指定区域中查找特定值的位置的函数。它返回指定数值在指定数组区域中的位置。这个位置是相对于查找区域的相对位置,而不是绝对的单元格位置。语法结构 MATCH(lookup_value, lookup_array, match_type)lookup_value…...
ACl访问控制列表
ACL的原理 ACL也称为访问控制列表,主要有包过滤的功能,同时也是包过滤防火前的本质 其方式主要是定立规则,这些规则控制着数据包的允许或者通过 ACL的场景 如下图,在全网互通的情况下,控制特定的数据包走向 例如控…...
android 用户空间切换流程
在Android开发中,创建和切换用户是一个重要的功能,特别是在需要多用户支持的应用中,下面讲述一下用户切换的流程。 一、CarUserManager.java 准备创建新用户,可以减少真正创建用户的时间 @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,Manifest.permis…...
突破续航瓶颈:数字样机技术引领新能源汽车复合制动新方向
随着我国经济快速发展和人民生活水平不断提升,汽车保有量截至2023年9月底就已达到了3.3亿,同比增长6.32%。庞大的汽车保有量对我国的环境和能源都产生了巨大的压力,具备节能环保优势的新能源汽车对于有效解决环境恶化和能源危机问题具有重要意…...
51单片机仿真摇号抽奖机源程序 12864液晶显示
资料下载地址:51单片机仿真摇号抽奖机源程序12864液晶显示仿真程序 一、功能介绍 单片机连接12864(st7920)液晶显示器和1个按键接INT0,模拟一个抽奖机。 实现效果: 1、液晶初始显示“祝你好运!”ÿ…...
路由器的原理
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 路由器的原理一,路由器基础及相关…...
Vue(四)
1.Vuex 1.1 Vuex是什么 Vuex 是一个插件,可以帮我们管理 Vue 通用的数据。例如:购物车数据、个人信息数据。 1.2 vuex的使用 1.安装 vuex 安装 vuex 与 vue-router 类似,vuex 是一个独立存在的插件,如果脚手架初始化没有选 v…...
今日总结 2024-12-23
项目初始化 拉取代码与环境配置: 难点:Git 命令不熟悉,依赖文件定位不准,启动脚本含义不明。解决办法:系统学习 Git 基础操作,如通过官方文档、优质的 Git 教程视频,反复练习克隆、分支切换等常…...
Vue常用指令
1. 插值表达式 {{}} <script setup> let msg="hello vue!" </script> <template> <h1>{{ msg }}--{{ 1+1 }}--{{ msg+sb }}</h1> </template> 2. Vue 常用指令 (以v- 开头) 2.1 v-html 替换标签元素内容,包含标签…...
欢乐力扣1-10
文章目录 前言1、合并两个有序数组1.1.描述 2、移除元素2.1.描述2.2.思路 3、删除有序数组中的重复元素3.1.描述3.2.思路 4、输出有序数组中的重复项二4.1.描述4.2.思路 5、多数元素5.1.描述5.2.思路 6、轮转数组6.1.描述6.2.思路 7、买卖股票最佳时机一7.1.思路 8、买卖股票最…...
[创业之路-204]:《华为战略管理法-DSTE实战体系》- 5-平衡记分卡绩效管理
目录 一、平衡计分卡概述 1、平衡计分卡的基本概念 2、平衡计分卡的发展阶段 3、平衡计分卡在华为的应用 4、平衡计分卡的优缺点 五、财务(股东)、顾客(用户)、内部运营(内部)及学习与发展࿰…...
算法设计期末复习
文章目录 1. 什么是算法,算法有哪些特征,算法设计的基本步骤,算法的时间复杂度的确定2. 什么是算法分析,算法分析的主要内容是什么?怎么确定算法的时间复杂度?3. 什么是分治算法,分治算法通常用…...
芝法酱学习笔记(2.2)——sql性能优化2
一、前言 在上一节中,我们使用实验的方式,验证了销售单报表的一些sql性能优化的猜想。但实验结果出乎我们的意料,首先是时间查询使用char和datetime相比,char可能更快,使用bigint(转为秒)和cha…...
Linux 安装 nvm
Linux 安装 nvm 网上用curl命令安装的方式都下载不成功,直接使用压缩包安装 ####### wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.1.tar.gz mkdir -p /root/.nvm tar xvf nvm-0.39.1.tar.gz -C /root/.nvm#######vi ~/.bashrc,在~/.bashrc的末尾…...
图像处理基础 | 查看两张图像的亮度差异,Y通道相减
两张图像的Y通道相减通常用于图像差异分析或比较,尤其是在亮度方面。具体来说,这一操作是基于YCbCr颜色空间中的Y通道进行的,其中Y通道代表图像的亮度信息(亮度成分),而Cb和Cr通道分别代表色度成分…...
机器学习-43-可解释性机器学习库LIME
文章目录 1 LIME1.1 LIME的特点1.2 LIME的步骤2 应用LIME2.1 分类模型2.1.1 创建模型和解释器2.1.2 解释样本2.2 回归模型2.2.1 创建模型和解释器2.2.2 解释样本2.3 文本模型2.3.1 创建模型和解释器2.3.2 解释样本2.4 图像模型2.4.1 创建模型和解释器2.4.2 解释样本3 附录3.1 l…...
RestTemplate关于https的使用详解
RestTemplate关于https的使用详解 一、restTemplate注入到bean里面。 Configuration public class RestTempleConfig {BeanPrimarypublic RestTemplate restTemplate() {return new RestTemplate();}/*** https 请求的 restTemplate* return* throws Exception*/Beanpublic R…...
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
Hiヽ(゜▽゜ )-欢迎来到蓝染Aizen的CSDN博客~ 🔥 博客主页: 【✨蓝染 の Blog😘】 💖感谢大家点赞👍 收藏⭐ 评论✍ 文章目录 行为型模式1、模板方法模式(1)概述(2&…...
CNN、RNN、LSTM和Transformer之间的区别和联系
文章目录 CNN、RNN、LSTM和Transformer之间的区别和联系前言CNN(卷积神经网络)RNN(循环神经网络)LSTM(长短期记忆网络)Transformer四者之间的联系与区别Yolo算法简介Yolo和CNN的关系YOLO各版本 CNN、RNN、L…...
sqlite3,一个轻量级的 C++ 数据库库!
宝子们,今天咱来唠唠 sqlite3 这个超棒的轻量级 C 数据库库。它就像是一个小巧但功能齐全的“数据仓库”,能帮咱们轻松地存储、查询和管理数据,无论是开发小型的桌面应用,还是做一些简单的数据处理程序,它都能派上大用…...
重温设计模式--观察者模式
文章目录 观察者模式(Observer Pattern)概述观察者模式UML图作用:实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题(Subject):具体主题(Concrete Subject…...
基于Java+Swing+Mysql的超市客户关系管理系统
基于JavaSwingMysql的超市客户关系管理系统 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 系统实现管理员对客户信息进行增删改查,信息包括客户编号,姓名,手机号,会员评级;可以对客户消费记录…...
JavaWeb Servlet的反射优化、Dispatcher优化、视图(重定向)优化、方法参数值获取优化
目录 1. 背景2. 实现2.1 pom.xml2.2 FruitController.java2.3 DispatcherServlet.java2.4 applicationContext.xml 3. 测试 1. 背景 前面我们做了Servlet的一个案例。但是存在很多问题,现在我们要做优化,优化的步骤如下: 每个Fruit请求都需…...
基础I/O -> 如何谈文件与文件系统?
文件的基础理解 空文件也要在磁盘上占据空间。文件 文件内容文件属性。文件操作 对内容的操作 对属性的操作或者是对内容和属性的操作。标定一个文件,必须使用:文件路径 文件名(具有唯一性)。如果没有指明对应的文件路径&…...
安装配置git
1、下载git:https://git-scm.com 2、配置git,进入git bash #配置用户名 git config-global user.name "petter7226" #配置邮箱 git config-global user.email "894266014qq.com" 3、配置ssh免密登录 可参考这个文档 https://gitee.com/help/article…...
cad学习 day4 day5
平面布置 客厅平面布置 端景柜: 一般玄关区域、走廊、过道尽头做造型端景柜,可以组展示、柜体、艺术品陈设窗帘盒 200mm 电动窗帘盒 250mm, 镜像命令: MI 做对称使用沙发: 归类FF - 移动家私木门: 归类FF - 平面内门地台床: 使用bo快速生成, 绘制后外围偏移O 50mm pl连接作为灯…...
Java的基础概念(一)
一、注释 **注意!:**注释内容不会参与编译和运行,仅仅是对代码的解释说明。 Java支持单行注释、多行注释、文档注释。 单行注释 以//开头 ,格式【 //注释内容 】 例子如下: 多行注释 格式【 / 注释内容 / 】 例…...
Qt5 cmake引用private头文件
Qt5 cmake引用private头文件 如何引用Qt的qzipreader_p.h头文件 、xlsxzipreader_p.h头文件 使用 target_include_directories target_include_directories(TestQtXlsx PRIVATE${Qt${QT_VERSION_MAJOR}Gui_PRIVATE_INCLUDE_DIRS}${Qt${QT_VERSION_MAJOR}Xlsx_PRIVATE_INCLUD…...
重温设计模式--代理、中介者、适配器模式的异同
文章目录 1、相同点2、不同点 1、相同点 目的都是为了更好地处理对象之间的关系:这三种模式都是在软件设计中用于处理对象之间的关联和交互,以达到优化系统结构、增强可维护性等目的。它们都在一定程度上隐藏了对象之间的某些细节或者复杂性,…...
拦截器魔法:Spring MVC中的防重放守护者
目录 简介HandlerInterceptorAdapter vs HandlerInterceptor创建一个防重放拦截器注册拦截器路径模式匹配适配器模式的魅力总结 简介 在构建安全可靠的Web应用程序时,防止请求重放攻击是一项关键任务。当用户或系统发出的请求被恶意第三方捕获并重复发送给服务器…...