nRF52832——GPIOTE与外部中断

这里写目录标题

  • GPIOTE 原理分析
  • GPIOTE 输入事件应用
    • GPIOTE 事件寄存器应用
    • GPIOTE 事件组件的应用(库函数)
    • GPIOTE PORT 事件应用
  • GPIOTE 任务应用
    • GPIOTE 任务触发 LED 寄存器操作
    • 组件方式进行任务配置


GPIOTE 原理分析

GPIO 任务和时间(GPIOTE)模块提供了使用任务和事件访问 GPIO 引脚的功能。每个 GPIOTE 通道被分配到一个引脚,GPIOTE 其实就是对 GPIO 口进行操作,同时引入了外部中断的概念。

比如按键控制分为两种情况:

  • 按键扫描:CPU 需要不停工作来判断 GPIO 引脚是否有拉低或者置高,效率很低;
  • 外部中断控制:中断控制的效率很高,一旦系统 IO 口出现上升或下降沿电平就会触发中断内的程序。

在 nRF52832 内部普通的 IO 管脚设置成 GPIO,中断和任务管脚设置成 GPIOTE。
nRF5x 系列处理器将 GPIO 的中断的快速触发做成了一个单独的模块 GPIOTE,这个模块不仅提供了 GPIO 的中断功能,同时提供了通过 task 和 event 方式来访问 GPIO 的功能。GPIOTE 的后缀 T 即为 task,E 为 event。

Event 称为事件,来源与 GPIO 的输入、定时器的匹配中断等可以产生中断的外设来触发。Task 称为任务,就是执行某一特定功能,比如翻转 IO 端口等。那么事件 event 触发任务 task。task 和 event 的组合是为了和 52832 中的 PPI(可编程外围设备互联系统)模块的配合使用。这种机制不需要 CPU 参与,极大的减少了内核消耗,降低功率,特别适合于 BLE 低功耗蓝牙进行应用。

GPIOTE 实际上分为两种模式:

  • 任务模式:作为输出使用
  • 事件模式:作为中断触发使用

GPIOTE task 任务模式,每个 GPIOTE 通道最多可以使用三个任务来执行引脚的写操作。

  • 固定的输出高电平(SET)
  • 固定的输出低电平(CLR)
  • 输出任务(OUT)可以配置为执行 置位清零切换

GPIOTE event 事件模式,可以从以下输入条件之一在每个 GPIOTE 通道中生成事件:

  • 上升边缘
  • 下降边缘
  • 任何改变

任务模式有三种状态:置位、清零、翻转;事件模式有三种触发状态:上升沿触发、下降沿触发、任意变化触发。TASJK 任务通过通道 OUT[0]-OUT[7] 设置输出触发状态,Event 则可以通过检测信号产生 PORT event 事件,产生 IN[n] event 事件。

整个 GPIOTE 寄存器的个数非常少。GPIOTE 模块提供了 8 个通道,这 8 个通道都是通过 CONFIG[0]~CONFIG[7] 寄存器来配置。八个通道可以通过单独设置来分别和普通的 GPIO 绑定。当需要使用 GPIOTE 的中断功能时可以设置相应寄存器的相关位,让某个通道作为 event 事件模式,同时配置触发 event 动作。比如绑定的引脚有上升沿跳变或者下降沿跳变触发 event,然后配置中断使能寄存器,配置让其 event 产生时触发输入中断。这样实现了 GPIO 的中断方式。
在这里插入图片描述

  1. GPIO 绑定 GPIOTE 通道
    那么如何实现和普通 GPIO 端口的绑定了?关键是设置 GPIOTE 的 CONFIG[n]n = 0~7 寄存器,如下。
    在这里插入图片描述
    在这里插入图片描述
    如上描述,每个 GPIOTE 通道通过 CONFIG.PSEL 字段与一个物理 GPIO 引脚相绑定。
  • 在 CONFIG.MODE 中选择时间模式时:CONFIG.PSEL 绑定的引脚将被配置为输入,从而覆盖 GPIO 中的 DIR 设置。
  • 当在 CONFIG.MODE 中选择任务模式时:CONFIG.PSEL 绑定的引脚将被配置为输出,也会覆盖 GPIO 中的 DIR 寄存器设置和 OUT 值的输出。
  • 当在 CONFIG.MODE 中选择 disabled 时,CONFIG.PSEL 绑定的引脚将使用普通 GPIO 中 PIN[n].CNF 寄存器的配置,也就是不绑定。因此只能将一个 GPIOTE 通道分配给一个 GPIO 物理引脚。
  1. 设置为事件模式
    当设置为事件模式时,因为事件模式就是输入,通过输入信号可以出发事件中断。基本步骤如下:
  • 首先在寄存器 CONFIG.PSEL 绑定引脚,设置一个 GPIO 管脚绑定 GPIOTE 通道;
  • 在 CONFIG.MODE 设置为事件模式
  • 在 CONFIG.POLARITY 中设置触发事件模式的输入电平
  • 当对应电平输入 GPIOTE 通道后就会产生中断,EVENTS_IN 寄存器就来判断对应端口中断事件是否发生。

在这里插入图片描述

  1. 设置为任务模式
    因为任务模式为输出模式。配置过程:
  • 首先需要设置 CONFIG.PSEL 绑定 GPIO 管脚;
  • 然后设置 CONFIG.MODE 为 GPIOTE 任务模式
  • 设置 CONFIG.POLARITY OUT[n[ 任务输出:置位、清零、切换
  • 设置完成后触发任务。TASKS_OUT[n] 触发 OUT[n] 值、TASKS_SET[n] 触发高电平、TASKS_CLR[n] 触发低电平
    三种状态触发同时申请,则优先级如下执行:
任务状态优先级
TASKS_OUT1
TASKS_CLR2
TASKS_SET3

在这里插入图片描述

  1. 中断配置
    中断是在事件模式下触发的,如果在配置寄存器 CONFIG[n] 中,绑定了对应的 GPIO 端口,同时配置为事件输入模式,那么可以通过 INTENSET 寄存器是能对应的中断通道。通过 INTENCLR 寄存器关闭对应的中断通道。INTENSET 寄存器和 INTENCLR 寄存器如下表所示:

INTENSET 寄存器
在这里插入图片描述
在这里插入图片描述

INTENCLR 寄存器
在这里插入图片描述

GPIOTE 输入事件应用

GPIOTE 事件寄存器应用

修改前面 GPIO 应用按键应用改为中断控制方式。中断控制的效率很高,一旦系统 IO 口出现上升沿或者下降沿电平就会触发执行中断内的处理程序。这样可以大大节省 CPU 的占用。中断在计算机多任务处理,尤其是实时系统重尤为有用,这样的系统包括运行在骑上的操作系统,也成为“中断驱动”。

硬件方面,和前面讲述 GPIO 输入扫描哪里的按键输入应用一样。四个按键分别连接 P0.13、 P0.14、 P0.15、 P0.16。

在这里插入图片描述
在使用 nRF52832 完成中断时,当 IO 管脚为低的时候可以判断管脚已经按下。通过 key 的中断来控制 led 的亮灭。硬件上设计是比较简单的,这和普通的 MCU 的中断用法一致。如下创建工程。
在这里插入图片描述
这样我们需要编写 exit.c 文件,主要有两部分:初始化开发板上的按键中断;编写中断执行代码。
按键中断这里实际上使用了事件模式。在 CONFIG 寄存器里进行了事件模式的配置。代码如下:

NRF_GPIOTE->CONFIG[0] = (GPIOTE_CONFIG)_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos) //输入事件极性| (13 << GPIOTE_CONFIG_PSEL_Pos)//绑定的引脚| (GPIOTE_COFNIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);//模式配置

上面的代码严格按照寄存器要求进行,首先是 MODE 模式设置,配置 GPIOTE 通道作为 event 还是 task 使用,这里设置成 event 事件。PSEL 设置对应绑定的 IO 管脚,选择 P0.13 作为触发管脚,POLARIY 极性设置为下降沿触发。
设置好了工作方式后,我们就需要进行中断的使能了,因为前面绑定的是 GPIOTE 的 0 通道,因此中断使能代码如下:

NVIC_EnableIRQ(GPIOTE_IRQn);//中断嵌套是能
NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_IN0_Set <<GPIOTE_INTENSET_IN0_Pos;//是能中断通道 IN0

上面任务基本上就可以把 GPIOTE 管脚中断配置好了,如果搞清楚这些寄存器配置很简单。中断函数的设计这里主要讲 LED 灯状态翻转,当然也可以加入对应的其他处理操作。

void GPIOTE_IRQHander()
{if((NRF_GPIOTE->EVENTS_IN[0] == 1) &&(NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk)){Delay(10000);//延迟消抖NRF_GPIOTE->EVENTS_IN[0] = 0;//中断事件清零}LED_Toggle();//led 灯状态翻转
}

完成 exit.c 的编写后,main 主函数的操作就很简单,直接调用写好的驱动函数,然后尝试按键是否有对应的响应即可。

#include "nrf52.h"
#include "nrf_gpio.h"
#include "exit.h"
#include "led.h"int mian()
{LED_Init();LED_Open();EXIT_KEY_Init();while(1){//这里暂时控制,主操作死循环}return 0;
}

GPIOTE 事件组件的应用(库函数)

通过使用 nrf 官方库函数可以更加方便完成整个过程的操作,对于寄存器操作我们仅仅只需要了解原理即可,如果非要使用寄存器去完成开发对日后维护和使用有很大弊端,所以官方已经将这部分进行了完美的封装。我们根据官方 SDK 的封装接口进行调用完成对应操作即可。

添加了 SDK 库函数的工程和之前也有所不同,这里添加了 nRF_Libraries 库函数路径。
在这里插入图片描述
官方也提供了一个驱动 nrfx_gpiote 的 GPIOTE 驱动库,但是这个驱动库带有错误跟踪函数,所以工程中必须添加错误跟踪库。同时区别于寄存器编程,组件库还需要配置 sdk_config.h 配置文件。

打开 sdk_config.h 配置文件,打开配置向导 Configuration Wizard,勾选以下两个使能项目,

  • GPIOTE_ENABLE 使能 GPIOTE 驱动库
  • NRFX_GPIOTE__ENABLE 使能 GPIOTE 兼容库
    在这里插入图片描述
    同时需要再 C/C++ 中添加硬件 GPIOTE 的库文件和头文件路径,如下:
    在这里插入图片描述
    库函数介绍:
  1. 函数 nrf_drv_gpiote_init 等同于函数 nrfx_gpiote_init
    在这里插入图片描述

  2. 函数 nrf_drv_gpiote_in_init 等同于函数 nrfx_gpiote_in_init
    在这里插入图片描述
    在这里插入图片描述

  3. nrf_drv_gpiote_in_event_enable 等同于函数 nrfx_gpiote_in_event_enable
    在这里插入图片描述

介绍完了前面的库函数接口。由于驱动组件库 SDK 已经编写好了,我们只需要编写 main.c 的主函数调用即可。

#include <stdbool.h>
#include "nrf.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "boards.h"#ifdef BSP_BUTTON_0#define PIN_IN BSP_BUTTON_0
#endif
#ifndef PIN_IN#error "Please indicate input pin"
#endif#ifdef BSP_LED_0#define PIN_OUT BSP_LED_0
#endif
#ifndef PIN_OUT#error "Please indicate output pin"
#endif/**GPIOTE中断处理*/
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{if(nrf_gpio_pin_read(PIN_IN)== 0)//按键防抖{nrf_gpio_pin_toggle(PIN_OUT);}
}
/**
配置GPIOTE初始化*/
static void gpio_init(void)
{nrf_gpio_cfg_output(PIN_OUT);//led灯的输出ret_code_t err_code;err_code = nrf_drv_gpiote_init();//初始化GPIOTEAPP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);in_config.pull = NRF_GPIO_PIN_PULLUP;//设置GPIOTE输入,极性,模式err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);//使能GPIOTEnrf_drv_gpiote_in_event_enable(PIN_IN, true);
}/**
主函数,循环等待中断*/
int main(void)
{gpio_init();while (true){// Do nothing.}
}

GPIOTE PORT 事件应用

把普通的 GPIO 端口配置为 GPIOTE 中断输入事件,能够绑定的只有 8 个通道,如果我们中断的数据量超过了 8 个,多的中断无法处理,如何出现这种情况,怎么处理?显然芯片设计厂家为了针对这种情况,特别在 GPIOTE 模块中提出了 GPIOTE PORT 功能。

GPIOTE PORT 是从使用 GPIO DETECT 信号的多个 IO 输入引脚来生成的事件。该事件将在 DETECT 信号的上升沿而产生。也就是说这个功能可以通过 32 个 IO 端口来产生,相当于一个总通道,32 个 IO 端口共用这个通道来申请中断。

同时 GPIO DETECT 信号就是通过 GPIO 的 SENSE 寄存器打开,此功能始终处于启用状态。即便外围设备本身是休眠状态,也不需要请求时钟或其他功率密集型基础架构来启用此功能。因此此功能可用于在系统启动时从 WFI 或 WFE 类型的睡眠时,来唤醒 CPU、所有外设和 CPU 空闲。达到唤醒系统启动模式下的最低功耗模式。
为了在配置源时防止来自 PORT 事件的虚假中断,用户应首先禁用 PORT 事件中的中断(通过 INTENCLR.PORT),然后配置源(PIN_CNF[n].SENSE),清除配置期间可能发生的任何潜在事件(向EVENTS_PORT写入“1”),最后启用中断(通过INTENSET.PORT)。

采用组件库编写 GPIOTE 输入事件与 GPIOTE PORT 事件的主要区别:

  • 配置事件的时候选择 IN 事件还是 PORT 事件,这个通过配置函数实现,GPIOTE_CONFIG_IN_SENSE_HITOLO(false),当函数参数是 false 的时候选择 PORT 事件;当函数参数是 true 的时候,选择 IN 事件
  • 所有 32 个 IO 端口触发的中断都是 INTENSET.PORT,因此配置都指向一个中断配置就可以了。
#include <stdbool.h>
#include "nrf.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "boards.h"/**GPIOTE中断处理*/
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{//事件由按键S1产生,即按键S1按下if(pin == BUTTON_1){//翻转指示灯D1的状态nrf_gpio_pin_toggle(LED_1);}//事件由按键S2产生,即按键S2按下else if(pin == BUTTON_2){//翻转指示灯D2的状态nrf_gpio_pin_toggle(LED_2);}//事件由按键S3产生,即按键S3按下else if(pin == BUTTON_3){//翻转指示灯D3的状态nrf_gpio_pin_toggle(LED_3);}//事件由按键S4产生,即按键S4按下else if(pin == BUTTON_4){//翻转指示灯D4的状态nrf_gpio_pin_toggle(LED_4);}}
/**
配置GPIOTE初始化*/
static void gpio_init(void)
{   //配置LED灯输出nrf_gpio_cfg_output(LED_1);nrf_gpio_cfg_output(LED_2);nrf_gpio_cfg_output(LED_3);nrf_gpio_cfg_output(LED_4);ret_code_t err_code;//初始化GPIOTEerr_code = nrf_drv_gpiote_init();APP_ERROR_CHECK(err_code);//配置SENSE模式,选择fales为sense配置nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);in_config.pull = NRF_GPIO_PIN_PULLUP;//配置按键0绑定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_0, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_0, true);//配置按键1绑定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_1, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_1, true);//配置按键2绑定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_2, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_2, true);//配置按键3绑定POTRerr_code = nrf_drv_gpiote_in_init(BSP_BUTTON_3, &in_config, in_pin_handler);APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_event_enable(BSP_BUTTON_3, true);}/**
主函数,循环等待中断*/
int main(void)
{gpio_init();while (true){// Do nothing.}
}

修改 sdk_config.h 配置文件,将其中中断配置的事件数目修改为 4。
在这里插入图片描述

GPIOTE 任务应用

GPIOTE 任务触发 LED 寄存器操作

GPIOTE 具有任务模式,任务模式就是输出模式。如果把 GPIO 管脚绑定了 GPIOTE 通道后,把它配置为任务模式,则可以实现输出功能。任务模式的使用不是孤立的,一般都是由事件来触发任务,如果在事件和任务中间假设一个通道,也就是后面的 PPI,那么整个过程不需要 CPU 参与了,大大节省了 MCU 资源。

构建工程:

在这里插入图片描述

新建 GPIOTE.c,首先是 GPIOTE 任务初始化,初始化两个 GPIOTE 通道。初始化首先设置通道 CONFIG[0].PSEL 域设置绑定 GPIO 的 19 管脚,CONFIG[1].PSEL 绑定 20 管脚;再设置两个通道的 CONFIG.MODE 为 TASK 任务模式;最后设置 CONFIG.POLARITY 为 OUT[0] 任务输出位翻转电平,OUT[1] 输出低电平。具体如下:

#include "nrf52.h"
#include "nrf_gpio.h"
#include "GPIOTE.h"void Delay(uint32_t temp)
{for(; temp!= 0; temp--);
} void GPIOTE_TASK_Init(void)
{NVIC_EnableIRQ(GPIOTE_IRQn);//中断嵌套设置//绑定两个GPIOTENRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos)//设置极性,翻转| (GPIOTE0 << GPIOTE_CONFIG_PSEL_Pos)  //绑定管脚| (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);//设置模式//配置任务输出状态、绑定通道、任务模式(详细说明请参看青风教程)NRF_GPIOTE->CONFIG[1] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)//输出低电平| (GPIOTE1<< GPIOTE_CONFIG_PSEL_Pos)  | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);配置任务输出状态、绑定通道、任务模式(详细说明请参看青风教程)}

主函数 main 中只需要初始化即可。

#include "nrf52.h"
#include "nrf_gpio.h"
#include "GPIOTE.h"
#include "led.h"
#include "nrf_delay.h"int main(void)
{/*初始化输出任务*/GPIOTE_TASK_Init();while(1){//触发输出任务模式NRF_GPIOTE->TASKS_OUT[0]=1;//由config寄存器里的极性配置觉得输出的信号NRF_GPIOTE->TASKS_OUT[1]=1;nrf_delay_ms(500);}
}

组件方式进行任务配置

和前面操作类似,这里使用 SDK 库函数的 API 进行组件方式的任务配置。

  1. nrf_drv_gpiote_out_init,类似 nrfx_gpiote_out_init
    在这里插入图片描述
  2. nrf_drv_gpiote_out_task_enabel , 类似 nrfx_gpiote_out_task_enabel
    在这里插入图片描述
    具体操作代码如下:

#include <stdbool.h>
#include "nrf.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "nrf_delay.h"#define GPIOTE0       19
#define GPIOTE1       20void GPIOTE_TASK_Init(void){ret_code_t err_code;	//初始化GPIOTE程序模块err_code = nrf_drv_gpiote_init();APP_ERROR_CHECK(err_code);//定义GPIOTE输出初始化结构体,主要是配置为翻转模式nrf_drv_gpiote_out_config_t config1 = GPIOTE_CONFIG_OUT_TASK_TOGGLE(true);////绑定GPIOTE输出引脚err_code = nrf_drv_gpiote_out_init(GPIOTE0, &config1);APP_ERROR_CHECK(err_code);//配置为引脚LED_3所在GPIOTE通道的任务模式nrf_drv_gpiote_out_task_enable(GPIOTE0);  //定义GPIOTE输出初始化结构体,主要是配置为低电平模式nrf_drv_gpiote_out_config_t config2 = GPIOTE_CONFIG_OUT_TASK_LOW;//绑定GPIOTE输出引脚err_code = nrf_drv_gpiote_out_init(GPIOTE1, &config2);APP_ERROR_CHECK(err_code);//配置为引脚LED_4所在GPIOTE通道的任务模式nrf_drv_gpiote_out_task_enable(GPIOTE1); 	}int main(void)
{GPIOTE_TASK_Init();   while(true){ //触发输出,即指示灯D3,D4翻转状态nrf_drv_gpiote_out_task_trigger(GPIOTE0);     nrf_drv_gpiote_out_task_trigger(GPIOTE1);nrf_delay_ms(500);}
} 

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

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

相关文章

仿牛客网项目---Elasticsearch分布式搜索引擎

1.什么是ElasticSearch分布式搜索引擎&#xff1f; Elasticsearch是一个开源的分布式搜索引擎&#xff0c;提供实时的、高可用性的搜索和分析解决方案。它支持快速索引和搜索大规模数据&#xff0c;具有分布式架构、RESTful API、基于JSON的查询语言等功能&#xff0c;适用于各…

蓝桥杯集训·每日一题2024 (二分,双指针)

前言&#xff1a; 开学了&#xff0c;平时学习的压力也逐渐大起来了&#xff0c;不过还算可以接受&#xff0c;等到后面阶段考的时候就不一样了&#xff0c;我目前为了转专业退选了很多课&#xff0c;这些课我都需要花时间来刷绩点&#xff0c;不然保研就没有竞争力了。我自己会…

OpenCASCADE+Qt创建建模平台

1、建模平台效果 2、三维控件OCCWidget 将V3d_View视图与控件句柄绑定即可实现3d视图嵌入Qt中&#xff0c;为了方便也可以基于QOpenGLWidget控件进行封装&#xff0c;方便嵌入各种窗体使用并自由缩放。 #ifndef OCCTWIDGET_H #define OCCTWIDGET_H#include <QWidget> #i…

javaWebssh药品进销存信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh药品进销存信息管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOM…

Filter过滤器+JWT令牌实现登陆验证

一、背景 我们需要在客户端访问服务器的时候给定用户一定的操作权限&#xff0c;比如没有登陆时就不能进行其他操作。如果他需要进行其他操作&#xff0c;而在这之前他没有登陆过&#xff0c;服务端则需要将该请求拦截下来&#xff0c;这就需要用到过滤器&#xff0c;过滤器可以…

原创+顶级SCI优化!23年新算法PSA优化CNN-LSTM-Attention一键实现多变量回归预测!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 效果展示 数据介绍 创新点 模型流程 部…

RabbitMQ的web控制端介绍

2.1 web管理界面介绍 connections&#xff1a;无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#xff0c;在这里可以查看连接情况channels&#xff1a;通道&#xff0c;建立连接后&#xff0c;会形成通道&#xff0c;消息的投递、获取…

Vue-Router使用

1.安装 npm install vue-router4 2. 添加路由 新建router文件夹&#xff0c;新建文件 index.ts import { createRouter, createWebHashHistory,createWebHistory} from "vue-router";const routes [{path: /login,component: () > import("../views/Logi…

牛客网——美团2024届秋招笔试第三场编程真题

牛客网——美团2024届秋招笔试第三场编程真题 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题1. 平均数为k的最长连续子数组2. 小球投盒3. 小红结账4. 小美的游戏5. 小美种果树6…

python自学6

第一节第十章 开发图表 第一个可视化图表&#xff0c;折线图的开发 json数据格式 pyecharts模块 图标源码网站 Document gallery.pyecharts.org pyecharts模块的快速入门 pyecharts配置有两个选项 全局配置是对整个可视化界面进行配置&#xff0c;比如名字&#xff0c;工具…

代码复现错误

1. 问题&#xff1a; torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 39.59 GiB total capacity; 37.72 GiB already allocated; 38.19 MiB free; 37.83 GiB reserved in total by PyTorch) If reserved memory is >> allocat…

防御保护 IPSEC VPPN实验

实验背景&#xff1a;FW1和FW2是双机热备 主备备份模式。 实验要求&#xff1a;在FW5和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置&#xff08;由于是双机热备状态&#xff0c;所以FW1和FW2只需要配置FW1主设…

用FPGA CORDIC IP核实现信号的相位检测,计算相位角

用FPGA CORDIC IP核实现信号的相位检测 1.matlab仿真 波形仿真代码&#xff1a; 代码功能&#xff1a;生成一个点频信号s&#xff0c;求出s的实部和虚部&#xff1b;并且结算相位角atan2。画出图形&#xff0c;并且将Q和I数据写入文件中。 %代码功能&#xff1a;生成一个点…

20.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据类型编辑功能的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易道云信息技术研究院VIP课 上一个内容&#xff1a;19.数据分析工具数据类型配置功能的实现 码云地址&#xff08;master 分支&#…

unity学习(49)——服务器三次注册限制以及数据库化角色信息4--角色信息数据库化

1.此处下断开始调试,list函数内就有问题&#xff1a; 2. 现在的问题是只读不写&#xff01;32行就是写入部分的代码&#xff1a; 3. 很奇怪&#xff0c;调试的时候确实是写进来了 程序正常执行后&#xff0c;文件中数据也没有消失 关闭服务器文件内容依旧正常。 players包含所…

MySQL篇—执行计划之覆盖索引Using index和条件过滤Using where介绍(第三篇,总共三篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

提醒一下!今年考研的人不要太老实了!!

今年准备计算机考研的同学&#xff0c;别太老实了&#xff01;别人说什么你就信什么 如果你的工作能力不足以支撑找到一个满意的工作&#xff0c;那我建议再沉淀两年&#xff01; 很多同学其实有点眼高手低&#xff0c;在计算机专业&#xff0c;低于1w的工作看不上&#xff0…

操作系统引导

目录 一. 什么是操作系统引导 \quad 一. 什么是操作系统引导 \quad 什么是操作系统引导: 就是在开机的时候, 怎么让操作系统运行起来 操作系统是安装在C盘的 分区表用来说明C,D,E,F盘的存储空间 RAM一关机, 里面的数据就会被清空, ROM则不会 MBR里面的程序被读到RAM里面, 那…

qt自定义时间选择控件窗口

效果如图&#xff1a; 布局如图&#xff1a; 参考代码&#xff1a; //DateTimeSelectWidget #ifndef DATETIMESELECTWIDGET_H #define DATETIMESELECTWIDGET_H#include <QWidget> #include <QDateTime>namespace Ui { class DateTimeSelectWidget; }class DateTim…

单链表OJ题:LeetCode--141.环形链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中的第141道单链表OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 …