异常与中断(下)

news2025/1/5 9:41:23

文章目录

  • 一、中断的硬件框架
    • 1.1 中断路径上的3个部件
    • 1.2 STM32F103的GPIO中断
      • 1.2.1 GPIO控制器
      • 1.2.2 EXTI
      • 1.2.3 NVIC
      • 1.2.4 CPU
        • 1. PRIMASK
        • 2. FAULTMASK
        • 3. BASEPRI
    • 1.3 STM32MP157的GPIO中断
      • 1.3.1 GPIO控制器
      • 1.3.2 EXTI
        • 1. 设置`EXTImux`
        • 2. 设置`Event Trigger`
        • 3. 设置`Masking`
        • 4. 查看中断状态、清中断
      • 1.3.3 GIC
      • 1.3.4 CPU
    • 1.4 IMX6ULL的GPIO中断
      • 1.4.1 GPIO控制器
        • 1. 配置GPIO中断
        • 2. 使能GPIO中断
        • 3. 判断中断状态、清中断
      • 1.4.2 GIC
      • 1.4.3 CPU
  • 二、GPIO中断编程
    • 2.1 查看原理图确定引脚
    • 2.2 STM32F103的GPIO中断
      • 2.2.1 GPIO控制器
      • 2.2.2 EXTI
      • 2.2.3 NVIC
      • 2.2.4 CPU
        • 1. PRIMASK
        • 2. FAULTMASK
        • 3. BASEPRI
    • 2.3 代码操作

一、中断的硬件框架

1.1 中断路径上的3个部件

  • 中断源
    中断源多种多样,比如GPIO、定时器、UART、DMA等等。
    它们都有自己的寄存器,可以进行相关设置:使能中断、中断状态、中断类型等等。
  • 中断控制器
    各种中断源发出的中断信号,汇聚到中断控制器。
    可以在中断控制器中设置各个中断的优先级。
    中断控制器会向CPU发出中断信号,CPU可以读取中断控制器的寄存器,判断当前处理的是哪个中断。
    中断控制器有多种实现,比如:
    • STM32F103中被称为NVIC:Nested vectored interrupt controller(嵌套向量中断控制器)
    • ARM9中一般是芯片厂家自己实现的,没有统一标准
    • Cortex A7中使用GIC(Generic Interrupt Controller)
  • CPU
    CPU每执行完一条指令,都会判断一下是否有中断发生了。
    CPU也有自己的寄存器,可以设置它来使能/禁止中断,这是中断处理的总开关。

在这里插入图片描述

1.2 STM32F103的GPIO中断

参考资料:STM32F103数据手册.pdfARM Cortex-M3与Cortex-M4权威指南.pdfPM0056.pdf

对于GPIO中断,STM32F103又引入了External interrupt/event controller (EXTI)
用来设置GPIO的中断类型,如下图:

在这里插入图片描述

EXTI可以给NVIC提供16个中断信号:EXTI0~EXTI15。
EXTI为开关一,决定了中断外部中断是否能发给NVIC;NVIC为开关二,决定了NVIC中断能否发送给CPU;CPU为开关三,决定了CPU是否处理中断。
那么某个EXTIx,它来自哪些GPIO呢?这需要设置GPIO控制器。

1.2.1 GPIO控制器

STM32F103的GPIO控制器中有AFIO_EXTICR1~AFIO_EXTICR4一共4个寄存器
名为:External interrupt configuration register,外部中断配置寄存器。
用来选择某个外部中断EXTIx的中断源,示例如下:

在这里插入图片描述

注意:从上图可知,EXTI0只能从PA0、……、PG0中选择一个,这也意味着PA0、……、PG0中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。

在这里插入图片描述

1.2.2 EXTI

在GPIO控制器中,可以设置某个GPIO引脚作为中断源,给EXTI提供中断信号。
但是,这个中断的触发方式是怎么的?高电平触发、低电平触发、上升沿触发、下降沿触发?
这需要进一步设置。
EXTI框图如下:

在这里插入图片描述

沿着上面框图中的红线,我们要设置:

  • Falling trigger selection register:是否选择下降沿触发
  • Rising trigger selection register:是否选择上升沿触发
  • Interrupt mask register:是否屏蔽中断

当发生中断时,可以读取下列寄存器判断是否发生了中断、发生了哪个中断:

  • Pending reqeust register

要使用EXTI,流程如下:

在这里插入图片描述

翻译如下:

  • 配置EXTI_IMR:允许EXTI发出中断
  • 配置EXTI_RTSR、EXTI_FTSR,选择中断触发方式
  • 配置NVIC中的寄存器,允许NVIC把中断发给CPU

1.2.3 NVIC

多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。
处理中断时,程序可以写NVIC的寄存器,清除中断。
涉及的寄存器:
在这里插入图片描述

我们暂时只需要关注:ISER(中断设置使能寄存器)、ICPR(中断清除挂起寄存器)。
要注意的是,这些寄存器有很多个,比如ISER0、ISER1等等。里面的每一位对应一个中断。
ISER0中的bit0对应异常向量表中的第16项(向量表从第0项开始),如下图:

在这里插入图片描述

1.2.4 CPU

cortex M3/M4处理器内部有这几个寄存器:

1. PRIMASK

在这里插入图片描述

把PRIMASK的bit0设置为1,就可以屏蔽所有优先级可配置的中断。
可以使用这些指令来设置它:

CPSIE I  ; 清除PRIMASK,使能中断
CPSID I  ; 设置PRIMASK,禁止中断

或者:
MOV R0, #1
MSR  PRIMASK R0  ; 将1写入PRIMASK禁止所有中断

MOV R0, #0
MSR PRIMASK, R0  ; 将0写入PRIMASK使能所有中断
2. FAULTMASK

在这里插入图片描述

FAULTMASK和PRIMASK很像,它更进一步,出来一般的中断外,把HardFault都禁止了。
只有NMI可以发生。
可以使用这些指令来设置它:

CPSIE F  ; 清除FAULTMASK
CPSID F  ; 设置FAULTMASK

或者:
MOV R0, #1
MSR  FAULTMASK R0  ; 将1写入FAULTMASK禁止中断

MOV R0, #0
MSR FAULTMASK, R0  ; 将0写入FAULTMASK使能中断
3. BASEPRI

在这里插入图片描述

BASEPRI用来屏蔽这些中断:它们的优先级,其值大于或等于BASEPRI。
可以使用这些指令来设置它:

MOVS R0, #0x60
MSR BASEPRI, R0   ; 禁止优先级在0x60~0xFF间的中断

MRS R0, BASEPRI   ; 读取BASEPRI

MOVS R0, #0
MSR BASEPRI, R0    ; 取消BASEPRI屏蔽

1.3 STM32MP157的GPIO中断

STM32MP157的GPIO中断在硬件上的框架,跟STM32F103是类似的。
它们的中断控制器不一样,STM32MP157中使用的是GIC:

在这里插入图片描述
EXTI为开关一,决定了外部中断是否能发送给GIC;GIC为开关二,决定了中断能否发给CPU;CPU为开关三,决定了CPU是否会处理该中断。

1.3.1 GPIO控制器

对于STM32MP157,除了把GPIO引脚配置为输入功能外,GPIO控制器里没有中断相关的寄存器。
请参考前面的课程《01_使用按键控制LED(STM32MP157)》。

1.3.2 EXTI

GPIO引脚可以向CPU发出中断信号,所有的GPIO引脚都可以吗?
不是的,需要在EXTI控制器中设置、选择。
GPIO引脚触发中断的方式是怎样的?高电平触发、低电平触发、上升沿触发、下降沿触发?
这需要进一步设置。
这些,都是在EXTI中配置,EXTI框图如下:

在这里插入图片描述

沿着红线走:

1. 设置EXTImux

选择哪些GPIO可以发出中断。
只有16个EXTI中断,从EXTI0~EXTI15;每个EXTIx中断只能从PAx、PBx、……中选择某个引脚,如下图所示:

在这里插入图片描述

注意:从上图可知,EXTI0只能从PA0、……中选择一个,这也意味着PA0、……中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。

通过EXTI_EXTICR1等寄存器来设置EXTIx的中断源是哪个GPIO引脚,入下图所示:

在这里插入图片描述

2. 设置Event Trigger

设置中断触发方式:

在这里插入图片描述

3. 设置Masking

允许某个EXTI中断:

在这里插入图片描述

4. 查看中断状态、清中断

在这里插入图片描述

1.3.3 GIC

ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。

GIC比较复杂,下一个视频再详细讲解。

1.3.4 CPU

CPU的CPSR寄存器中有一位:I位,用来使能/禁止中断。

在这里插入图片描述

可以使用以下汇编指令修改I位:

  CPSIE I  ; 清除I位,使能中断
  CPSID I  ; 设置I位,禁止中断

1.4 IMX6ULL的GPIO中断

IMX6ULL的GPIO中断在硬件上的框架,跟STM32MP157是类似的。
IMX6ULL中没有EXTI控制器,对GPIO的中断配置、控制,都在GPIO模块内部实现:

在这里插入图片描述

1.4.1 GPIO控制器

1. 配置GPIO中断

每组GPIO中都有对应的GPIOx_ICR1、GPIOx_ICR2寄存器(interrupt configuration register )。
每个引脚都可以配置为中断引脚,并配置它的触发方式:

在这里插入图片描述

2. 使能GPIO中断

在这里插入图片描述

3. 判断中断状态、清中断

在这里插入图片描述

1.4.2 GIC

ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。

GIC比较复杂,下一个视频再详细讲解。

1.4.3 CPU

CPU的CPSR寄存器中有一位:I位,用来使能/禁止中断。

在这里插入图片描述

可以使用以下汇编指令修改I位:

  CPSIE I  ; 清除I位,使能中断
  CPSID I  ; 设置I位,禁止中断

二、GPIO中断编程

目的:实现KEY1中断,按下、松开按键,串口输出相应信息。

2.1 查看原理图确定引脚

  • STM32F103按键原理图

在这里插入图片描述

  • KEY1用的是PA0引脚

    在这里插入图片描述

2.2 STM32F103的GPIO中断

参考资料:STM32F103数据手册.pdfARM Cortex-M3与Cortex-M4权威指南.pdfPM0056.pdf

对于GPIO中断,STM32F103又引入了External interrupt/event controller (EXTI)
用来设置GPIO的中断类型,如下图:

在这里插入图片描述

EXTI可以给NVIC提供16个中断信号:EXTI0~EXTI15。
那么某个EXTIx,它来自哪些GPIO呢?这需要设置GPIO控制器。

2.2.1 GPIO控制器

STM32F103的GPIO控制器中有AFIO_EXTICR1~AFIO_EXTICR4一共4个寄存器
名为:External interrupt configuration register,外部中断配置寄存器。

在这里插入图片描述

用来选择某个外部中断EXTIx的中断源,示例如下:

在这里插入图片描述

注意:从上图可知,EXTI0只能从PA0、……、PG0中选择一个,这也意味着PA0、……、PG0中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。

在这里插入图片描述

在GPIO控制器这部分创建一个key.c,使按键PA0以EXTI0发出中断,这里会写一个AFIO结构体,方便后续代码:

typedef struct
{
  volatile unsigned int EVCR;
  volatile unsigned int MAPR;
  volatile unsigned int EXTICR[4];
  volatile unsigned int RESERVED0;
  volatile unsigned int MAPR2;  
} AFIO_TypeDef;

2.2.2 EXTI

在GPIO控制器中,可以设置某个GPIO引脚作为中断源,给EXTI提供中断信号。
但是,这个中断的触发方式是怎么的?高电平触发、低电平触发、上升沿触发、下降沿触发?
这需要进一步设置。

在这里插入图片描述

EXTI框图如下:

在这里插入图片描述

沿着上面框图中的红线,我们要设置:

  • Falling trigger selection register:是否选择下降沿触发
  • Rising trigger selection register:是否选择上升沿触发
  • Interrupt mask register:是否屏蔽中断

当发生中断时,可以读取下列寄存器判断是否发生了中断、发生了哪个中断:

  • Pending reqeust register

要使用EXTI,流程如下:

在这里插入图片描述

翻译如下:

  • 配置EXTI_IMR:允许EXTI发出中断
  • 配置EXTI_RTSR、EXTI_FTSR,选择中断触发方式
  • 配置NVIC中的寄存器,允许NVIC把中断发给CPU

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在设置EXTI此处,主要做两件事:① 由于前面设置的是按键为中断源,所以这里设置双边沿触发,同时使能EXTI能够向NVIC发出中断;② 清除EXTI中断,如果不清除中断,当按下按键后松手会一直触发中断,而清除中断需要从根源开始,GPIO中没有相关寄存器,所以从EXTI开始清除。这里会写一个EXTI结构体,方便后续代码:

typedef struct
{
  volatile unsigned int IMR;
  volatile unsigned int EMR;
  volatile unsigned int RTSR;
  volatile unsigned int FTSR;
  volatile unsigned int SWIER;
  volatile unsigned int PR;
} EXTI_TypeDef;

2.2.3 NVIC

多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。
处理中断时,程序可以写NVIC的寄存器,清除中断。

在这里插入图片描述

涉及的寄存器:

在这里插入图片描述

我们暂时只需要关注:ISER(中断设置使能寄存器)、ICPR(中断清除挂起寄存器)
要注意的是,这些寄存器有很多个,比如ISER0、ISER1等等。里面的每一位对应一个中断。
ISER0中的bit0对应异常向量表中的第16项(向量表从第0项开始),如下图:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里主要做两件事:① 使能NVIC,让中断能够发送给CPU,而发送过来的中断为EXTI0,EXTI0对应异常向量表的第六项,将其设置为1即可;② 清除NVIC,这里NVIC接受的是来自EXTI0的中断,所以将上图寄存器的第6位(对应异常向量表第六项)设置为1即可。这里会写一个NVIC结构体,方便后续代码:

typedef struct
{
  volatile unsigned int ISER[8];         /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
  volatile unsigned int RESERVED0[24];   
  volatile unsigned int ICER[8];         /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register         */
  volatile unsigned int RSERVED1[24];    
  volatile unsigned int ISPR[8];         /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register          */
  volatile unsigned int RESERVED2[24];   
  volatile unsigned int ICPR[8];         /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register        */
  volatile unsigned int RESERVED3[24];   
  volatile unsigned int IABR[8];         /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register           */
  volatile unsigned int RESERVED4[56];   
  volatile unsigned char  IP[240];             /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
  volatile unsigned int RESERVED5[644];
  volatile unsigned int STIR;            /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register     */
}  NVIC_Type;

2.2.4 CPU

cortex M3/M4处理器内部有这几个寄存器:

1. PRIMASK

在这里插入图片描述

把PRIMASK的bit0设置为1,就可以屏蔽所有优先级可配置的中断。
可以使用这些指令来设置它:

CPSIE I  ; 清除PRIMASK,使能中断
CPSID I  ; 设置PRIMASK,禁止中断

或者:
MOV R0, #1
MSR  PRIMASK R0  ; 将1写入PRIMASK禁止所有中断

MOV R0, #0
MSR PRIMASK, R0  ; 将0写入PRIMASK使能所有中断
2. FAULTMASK

在这里插入图片描述

FAULTMASK和PRIMASK很像,它更进一步,出来一般的中断外,把HardFault都禁止了。
只有NMI可以发生。
可以使用这些指令来设置它:

CPSIE F  ; 清除FAULTMASK
CPSID F  ; 设置FAULTMASK

或者:
MOV R0, #1
MSR  FAULTMASK R0  ; 将1写入FAULTMASK禁止中断

MOV R0, #0
MSR FAULTMASK, R0  ; 将0写入FAULTMASK使能中断
3. BASEPRI

在这里插入图片描述

BASEPRI用来屏蔽这些中断:它们的优先级,其值大于或等于BASEPRI。
可以使用这些指令来设置它:

MOVS R0, #0x60
MSR BASEPRI, R0   ; 禁止优先级在0x60~0xFF间的中断

MRS R0, BASEPRI   ; 读取BASEPRI

MOVS R0, #0
MSR BASEPRI, R0    ; 取消BASEPRI屏蔽

2.3 代码操作

main.c

key_init();
exti_init();
nvic_init();

key.c

#include "string.h"
#include "exti.h"
#include "nvic.h"

typedef struct
{
  volatile unsigned int EVCR;
  volatile unsigned int MAPR;
  volatile unsigned int EXTICR[4];
  volatile unsigned int RESERVED0;
  volatile unsigned int MAPR2;  
} AFIO_TypeDef;

void key_init(void)
{
	AFIO_TypeDef *afio = (AFIO_TypeDef *)0x40010000;
	
	unsigned int *pReg;
	unsigned int *pRegA;
	
	/* 1.初始化GPIO引脚PA0,设置为输入引脚 */
	/* GPIOA */
	pReg = (unsigned int *)(0x40021000 + 0x18);
	*pReg |= (1<<2);	
	
	/* 设置GPIOA0为输入引脚 */
	pRegA = (unsigned int *)(0x40010800 + 0x00);	
	*pRegA &= ~(3); 		//设置为输入模式 这里需要把MODE0写成00 先写入11(3用8421就是11) 再取反得到00		/* mode0 = 0b00 */ 
	*pRegA &= ~(3<<2);		//先清除CNF0中的数据 即先全部写成00 3对应8421就是11 取反得到00						/* cnf0 = 0b00 */
	*pRegA |= (1<<2);		//1用8421对应CNF0就是01 写入后配置成浮空输入模式									/* cnf0 = 0b01 */
	
	/* GPIOA的数据输入寄存器 */
	pRegA = (unsigned int *)(0x40010800 + 0x08);	
	
	/* 2.设置为EXTI0 */
	afio->EXTICR[0] &= ~0xf;	//AFIO的EXTICR[0]寄存器0000对应PA0
}

void EXTI0_IRQHandler(void)
{
	unsigned int * pRegA = (unsigned int *)(0x40010800 + 0x08);
	
	/* 读取GPIOA input data register */
	
	if ((*pRegA & (1<<0)) == 0)		/* KEY1被按下(PA0对应IDR0 只需要判断与上IDR0后是否为0) */
	{
		puts("KEY1 pressed!\n\r");			/* 设置GPIOB0输出0 */
	}
	else
	{
		puts("KEY1 released!\n\r");			/* 设置GPIOB0输出1 */
	}
	
	/* 清除中断 */
	exti_clear_int(0);	//清除exti0
	nvic_clear_int(6);	//清除NVIC
}

exti.c


typedef struct
{
  volatile unsigned int IMR;
  volatile unsigned int EMR;
  volatile unsigned int RTSR;
  volatile unsigned int FTSR;
  volatile unsigned int SWIER;
  volatile unsigned int PR;
} EXTI_TypeDef;

void exti_init(void)
{
	EXTI_TypeDef *exti = (EXTI_TypeDef *)0x40010400;
	
	/* 1.设置触发方式:双边沿触发 */
	exti->RTSR |= (1<<0);	//上升沿触发
	exti->FTSR |= (1<<0);	//上降沿触发
	
	/* 2.使能中断(作为开关1):能够向NVIC发出中断 */
	exti->IMR |= (1<<0);
}

void exti_clear_int(int bit)
{
	EXTI_TypeDef *exti = (EXTI_TypeDef *)0x40010400;	
	exti->PR |= (1<<bit);	//输入bit后会清楚对应的exit[bit] 前面选择exti0 所以主函数应该会清除exti0
}

nvic.c


typedef struct
{
  volatile unsigned int ISER[8];         /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
  volatile unsigned int RESERVED0[24];   
  volatile unsigned int ICER[8];         /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register         */
  volatile unsigned int RSERVED1[24];    
  volatile unsigned int ISPR[8];         /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register          */
  volatile unsigned int RESERVED2[24];   
  volatile unsigned int ICPR[8];         /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register        */
  volatile unsigned int RESERVED3[24];   
  volatile unsigned int IABR[8];         /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register           */
  volatile unsigned int RESERVED4[56];   
  volatile unsigned char  IP[240];             /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
  volatile unsigned int RESERVED5[644];
  volatile unsigned int STIR;            /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register     */
}  NVIC_Type;

void nvic_init(void)
{
	NVIC_Type * nvic = (NVIC_Type *)0xE000E100;
	
	/* 使能EXTI0中断作为开关2(EXTI0对应异常向量表中的第六项 将其设置为1即可使能) */
	nvic->ISER[0] |= (1<<6);	
}

void nvic_clear_int(int bit)
{
	NVIC_Type * nvic = (NVIC_Type *)0xE000E100;
	
	if (bit <= 31)
		nvic->ICPR[0] |= (1<<bit);	//输入bit后会清除异常向量表中对应的中断 这里为EXTIO 所以主函数使用时应该输入6
}

start.s
在这里插入图片描述
在这里插入图片描述
现象:之前发生的异常能够正常解决处理,同时按下按键会打印对应现象

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构&#xff0c;我们将创建一个动态购物车&#xff0c;支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…

STM32学习之EXTI外部中断(以对外式红外传感器 / 旋转编码器为例)

中断:在主程序运行过程中&#xff0c;出现了特定的中断触发条件(中断源)&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中断源同时申请中断时&#xff0c;CPU会根据中断源的轻重缓急…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力

HuatuoGPT-o1&#xff1a;基于40K可验证医学问题的两阶段复杂推理增强框架&#xff0c;通过验证器引导和强化学习提升医学模型的推理能力 论文大纲理解1. 确认目标2. 分析过程3. 实现步骤4. 效果展示 解法拆解全流程提问俩阶段详细分析 论文&#xff1a;HuatuoGPT-o1, Towards …

07-计算机网络面试实战

07-计算机网络面试实战 计算机网络面试实战 为什么要学习网络相关知识&#xff1f; 对于好一些的公司&#xff0c;计算机基础的内容是肯定要面的&#xff0c;尤其是 30k 以内的工程师&#xff0c;因为目前处于的这个级别肯定是要去写项目的&#xff0c;还没上升到去设计架构的高…

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现&#xff0c;有的commit记录带有verified绿色标识&#xff0c;有的带有橘色的Unverified标识&#xff0c;还有的什么都不显示。 既然我是根正苗红的作者(bushi)…

中式美学|中国红电商展台咒语分享

使用工具&#xff1a;千鹿AI 咒语&#xff1a;geometric shape podium,Red background, and rose gold elements on the right side, Chinese New Year atmosphere, simple and clean light luxury scene, minimalist style, minimalist stage design, studio lighting, minim…

中断系统 | 高优先级抢占原理

参考视频 入坑单片机 – [12_2]中断系统 [12_3]底层解析 51内核中断抢占性 如果我们把51单片机的5个中断都打开的话&#xff0c;CPU对与中断的响应是从上到下的。 如果INT0 和TIM0 的中断同时发生&#xff0c;CPU会有执行INT0的服务函数&#xff0c;然后再执行TIM0的函数。…

探寻AI Agent:开启知识图谱自动生成新篇章(17/30)

一、AI Agent 与知识图谱&#xff1a;智能时代的双雄 在当今科技飞速发展的时代&#xff0c;人工智能如同一股汹涌澎湃的浪潮&#xff0c;正以前所未有的力量重塑着我们的世界。而在这股浪潮中&#xff0c;AI Agent 与知识图谱无疑是两颗最为璀璨的明珠&#xff0c;它们各自发挥…

CA系统的设计(CA证书生成,吊销,数字签名生成)

CA系统概述 CA认证系统是一种基于公钥密码基础设施&#xff08;PKI&#xff09;的信息安全技术&#xff0c;它可以为网络通信双方提供身份认证、数据加密、数字签名等功能。CA认证系统的核心是证书授权机构&#xff08;CA&#xff09;&#xff0c;它负责为用户&#xff08;节点…

phpstudy2018问题(技巧)总结

目录 安装介绍注意操作 问题phpstudy待续、更新中...... 安装 软件下载&#xff08;新人推荐2018 版本phpstudy &#xff09; 官网下载 https://www.xp.cn/download.html 介绍 系统服务------开机自启 非服务模式------开机不自启 搭建好环境, 此时服务器与客户端同时存在 …

USB2.0之描述符(Descriptors)

文章目录 描述符(Descriptors)设备描述符(Device Descriptors)配置描述符(Configuration Descriptors)接口描述符(Interface Descriptors)端点描述符(Endpoint Descriptors)字符串描述符(String Descriptors) 参考资料 描述符(Descriptors) 描述符是设备本身各项信息的集合&…

从授权校验看SpringBoot自动装配

背景 最近需要实现一个对于系统的授权检测功能&#xff0c;即当SpringBoot应用被启动时&#xff0c;需要当前设备是否具有有效的的授权许可信息&#xff0c;若无则直接退出应用。具体的实现方案请继续看下文。 环境 Ruoyi-Vue SpringBoot3 RuoYi-Vue: &#x1f389; 基于Spr…

jmeter分布式启动

https://www.cnblogs.com/qtclm/p/11082081.html 1、代理机&#xff1a;输入“ipconfig”&#xff0c;找到IP地址&#xff0c;在Jmeter/bin/jmeter.properties设置remote host 启动jmeter server 1、控制机&#xff1a;输入“ipconfig”&#xff0c;找到IP地址&#xff0c;在J…

SpringCloud源码-Ribbon

一、Spring定制化RestTemplate&#xff0c;预留出RestTemplate定制化扩展点 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration 二、Ribbon定义RestTemplate Ribbon扩展点功能 org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguratio…

目标检测,语义分割标注工具--labelimg labelme

1 labelimg labelimg可以用来标注目标检测的数据集&#xff0c; 提供多种格式的输出&#xff0c; 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单&#xff0c; 不做过细的介绍&#xff0…

pd虚拟机 [po] Parallels Desktop 20 激活 for Mac [jie] 安装教程【支持M芯片】

文章目录 效果图一、下载软件二、安装运行⚠️注意事项&#xff1a;1、前往 系统设置–> 隐私与安全性 –> 完整磁盘访问权限&#xff0c;中允许终端&#xff1a;2、安装运行【ParallelsDesktop-20.1.2-55742.dmg】&#xff0c;运行【安装.app】3、将【Patch】文件夹拖到…

windows11安装软件时选择文件路径只有桌面及子文件夹怎么解决方法

现象&#xff1a;当桌面文件夹、文件总数超过一定数量时(具体个数不详&#xff0c;个人猜测可能跟系统架构或内存有关)点击应用程序中“浏览”按钮时&#xff0c;只能看到桌面文件夹&#xff0c;其他盘符看不到。一个巨硬愚蠢的bug。定期清理下桌面吧&#xff0c;习惯下载到桌面…

SpringCloud源码-openFeign

LoadBalancer默认只有nacos服务发现器 openFeign与springcloud loadbalancer的结合点 openFeign通过spring cloud loadbalancer进行负载均衡&#xff0c;spring cloud loadbalancer通过discovery client获取nacos的机器列表&#xff0c;然后底层进行负载均衡。

开源架构中的数据库选择优化版

上一篇文章推荐&#xff1a; 开源架构学习指南&#xff1a;文档与资源的智慧锦囊&#xff08;New&#xff09; 我管理的社区推荐&#xff1a;【青云交社区】和【架构师社区】 推荐技术圈福利社群&#xff1a;点击快速加入 开源架构中的数据库选择优化版 一、引言二、关系型开源…