当前位置: 首页 > news >正文

94.STM32外部中断

目录

1.什么是 NVIC?

2.NVIC寄存器 

3.中断优先级 

4.NVIC的配置 

设置中断分组​编辑

配置某一个中断的优先级

5.什么是EXTI

6.EXTI和NVIC之间的关系 

7.SYSCFG 的介绍 


1.什么是 NVIC?

        NVIC是一种中断控制器,主要用于处理 ARM Cortex-M 微控制器的中断管理。NVIC 负责处理中断优先级、中断向量表以及中断使能和禁止等任务。

  1. 中断向量表: NVIC 维护了中断向量表,其中包含了中断服务程序的入口地址。当中断发生时,CPU会根据中断号(或中断向量)在中断向量表中查找相应的中断服务程序的入口地址。

  2. 中断优先级: NVIC 允许为每个中断配置优先级。这些优先级决定了中断在系统中的响应顺序。Cortex-M架构中,中断优先级通常是基于位宽的,较低位的值表示较高的优先级。

  3. 嵌套中断: NVIC 支持嵌套中断,即在处理某个中断时,如果发生更高优先级的中断请求,系统可以中断当前中断服务程序,处理更高优先级的中断,然后返回继续处理低优先级的中断。这种特性对于实时系统和复杂任务处理非常有用。

  4. 中断使能和禁止: NVIC 允许对每个中断进行使能和禁止。这使得可以在运行时动态地配置系统中的中断。

  5. 中断状态: NVIC 提供了一些寄存器用于查询和管理中断状态,例如检查某个中断是否处于挂起状态。

  6. 中断控制寄存器: NVIC 通过一系列寄存器(如 NVIC_ISER、NVIC_ICER、NVIC_ISPR、NVIC_ICPR)提供中断的使能、禁止、挂起和清除等功能。

2.NVIC寄存器 

typedef struct
{__IOM uint32_t ISER[8U]; /* 中断使能寄存器 */uint32_t RESERVED0[24U];__IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */uint32_t RSERVED1[24U];__IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */uint32_t RESERVED2[24U];__IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */uint32_t RESERVED3[24U];__IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */uint32_t RESERVED4[56U];__IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */uint32_t RESERVED5[644U];__OM uint32_t STIR; /* 中断触发中断寄存器 */
} NVIC_Type;

STM32F407 的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能
方便的使用 STM32F407 的中断。下面重点介绍这几个寄存器:

1.ISER[8](Interrupt Set Enable Register):中断使能寄存器
2.ICER[8](Interrupt Clear Enable Registers):中断除能寄存器

3.ISPR[8](Interrupt Set Pending Registers):中断使能挂起控制寄存器,通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是⽆效的。
4.ICPR[8](Interrupt Clear Pending Registers):中断解除挂起控制寄存器

5.IABR[8](Interrupt Active Bit Registers):是⼀个中断激活标志位寄存器组。对应位所代表的中断和 ISER ⼀样,如果为 1,则表示该位所对应的中断正在被执行。这是⼀个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
6.IP [240](Interrupt Priority Registers):中断优先级控制寄存器组。由240个8bit的寄存器组成,每个可屏蔽中断占用8bit。但我们只用IP[81] - IP[0]这82个。并且,每个中断通道占用的8bit并没有全部使用,而是只用了高4位。

3.中断优先级 

        STM32 中的中断优先级可以分为:抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级。抢占式优先级和响应优先级的区别:
        抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
        响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
        还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循
自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
        在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 个寄存器控制中断优先级,每个寄存器的每 8 位又分为一组,可以分 4 组,所以就有了 240 组宽度为 8bit 的中断优先级控制寄存器,
原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上 M3 /M4
/M7 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌
套,即 2^4=16。

        抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 抢占优先级和响应优先级相同的,按中断号(中断向量表)先后执行。

4.NVIC的配置 

设置中断分组

配置某一个中断的优先级

函数名称:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

typedef struct
{uint8_t NVIC_IRQChannel;  //表示要配置的中断通道(或中断号)                  uint8_t NVIC_IRQChannelPreemptionPriority;  //表示中断的抢占优先级。uint8_t NVIC_IRQChannelSubPriority;  //表示中断的响应优先级。      FunctionalState NVIC_IRQChannelCmd; //表示中断通道的使能状态。       
} NVIC_InitTypeDef;

下面是结构体成员的解释:

  1. NVIC_IRQChannel 表示要配置的中断通道(或中断号)。对于 ARM Cortex-M 微控制器,中断通道的编号是硬件定义的,代表不同的中断源。例如,USART1 的中断通道号是 USART1_IRQn

  2. NVIC_IRQChannelPreemptionPriority 表示中断的抢占优先级。中断的抢占优先级决定了在同一时间发生多个中断时,哪个中断可以立即被处理,而哪些需要等待。这是一个 0 到 N-1(N 是抢占优先级位数)的值,值越小表示优先级越高。

  3. NVIC_IRQChannelSubPriority 表示中断的子优先级。在同一抢占优先级组内,子优先级决定了不同中断的响应顺序。这是一个 0 到 N-1(N 是子优先级位数)的值,值越小表示优先级越高。

  4. NVIC_IRQChannelCmd 表示中断通道的使能状态。可以为 ENABLEDISABLE,分别表示使能或禁止相应的中断通道。

5.什么是EXTI

   EXTI 是外部中断(External Interrupt)控制器的缩写,用于处理与外部事件(通常是硬件引脚的状态变化)相关的中断。在 STM32 微控制器中,EXTI 模块与 GPIO 模块一起使用,以便在特定事件(如边沿触发、电平触发等)发生时触发相应的中断。 

初始化函数:void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);EXTI外设的时钟默认是开启的

typedef struct
{uint32_t EXTI_Line;              EXTIMode_TypeDef EXTI_Mode;      EXTITrigger_TypeDef EXTI_Trigger; FunctionalState EXTI_LineCmd;     
}EXTI_InitTypeDef;
  1. EXTI_Line 指定要启用或禁用的外部中断线。这个参数可以是 EXTI_Lines 枚举类型中的任何组合值,表示一个或多个中断线。例如,EXTI_Line0 表示外部中断线0。
  2. EXTI_Mode 指定外部中断线的工作模式。这个参数可以是 EXTIMode_TypeDef 枚举类型的值,表示中断线的触发模式。例如,EXTI_Mode_Interrupt 表示中断模式。
  3. EXTI_Trigger 指定外部中断线的触发方式,即触发信号的边沿。这个参数可以是 EXTITrigger_TypeDef 枚举类型的值,表示中断线触发的方式,如上升沿、下降沿等。
  4. EXTI_LineCmd 指定所选外部中断线的新状态。这个参数可以是 FunctionalState 枚举类型的值,表示中断线的使能或禁止状态,可以是 ENABLEDISABLE

6.EXTI和NVIC之间的关系 

  1. EXTI 模块配置中断线: EXTI 负责配置外部中断线,将外部事件(通常是引脚状态的变化)连接到中断系统。它定义了中断线的触发条件、使能状态等。EXTI 允许你设置哪些引脚上的事件会触发中断,以及中断是由上升沿、下降沿还是上升和下降沿都触发。配置好 EXTI 后,当与之相关联的外部事件发生时,EXTI 会产生中断请求。

  2. NVIC 确定中断优先级: 一旦 EXTI 产生中断请求,中断请求会传递给 NVICNVIC 负责管理所有中断的优先级。在STM32中,中断的优先级是按组管理的,NVIC 允许配置每个中断的优先级。这就是为什么在使用外部中断时,需要通过 NVIC 设置中断的优先级。

  3. 中断处理函数:NVIC 配置好中断优先级后,当外部中断被触发时,NVIC 会根据中断优先级的设定决定是否打断当前正在执行的程序。如果中断被接受,NVIC 会跳转到相应的中断处理函数,该函数是由用户编写的,通常用于处理与中断相关的任务。在中断处理函数中,需要清除相应的中断标志,通常是通过 EXTI_ClearITPendingBit 来完成。

7.SYSCFG 的介绍 

   SYSCFG 是STM32微控制器中的一个系统配置寄存器,用于配置和控制一些系统级别的功能和外设。主要的作用包括配置外部中断线、使能内部的传感器和控制外设的引脚映射。

1.中断线映射: SYSCFG 允许将外部中断线映射到不同的中断通道。在使用外部中断时,需要配置 SYSCFG 以选择相应的中断通道。

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
//上述例子将 GPIOA 的引脚0与外部中断线0相关联。 

2.定时器触发映射: 对于某些定时器,SYSCFG 允许配置触发源。例如,可以将外部信号映射到定时器的触发输入。

TIM1_ETR_Config(TIM1_ETRSource_TI1, TIM1_ExtTRGPSC_DIV1, TIM1_ExtTRGPolarity_NonInverted, 0x00);
//上述例子配置了TIM1定时器的触发源。

3.内部传感器使能: SYSCFG 允许使能内部的温度传感器和电压检测器。

SYSCFG_VBATMonitoringCmd(ENABLE);
//上述例子使能了电池电压检测器。

4.BOOT模式配置: SYSCFG 允许配置启动时的引脚状态,以确定系统启动时的模式。

SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
//上述例子将内部SRAM映射到系统的起始地址。

 第一步:时钟的使能

  • 1)使能GPIO时钟
  • 2)使能SYSCFG时钟
  • ** EXTI和 NVIC的时钟默认是打开的

第二步:配置GPIO
第三步:配置SYSCFG

  • 配置函数:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
  • 功能:选择中断引脚

第四步:初始化EXTI

  • 初始化函数:EXTI_Init();

第五步:配置NVIC

  • 1) 设置优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//整个⼯程只设置⼀次
  • 2) 初始化:NVIC_Init();

第六步:编写中断函数

 

#include "stm32f4xx.h"                  // Device headervoid EXTI3_IRQHandler(void){//判断是否有中断if(EXTI_GetITStatus(EXTI_Line3)==SET){GPIO_SetBits(GPIOF,GPIO_Pin_9);GPIO_SetBits(GPIOF,GPIO_Pin_10);EXTI_ClearITPendingBit(EXTI_Line3);}
}
void EXTI4_IRQHandler(void){//判断是否有中断if(EXTI_GetITStatus(EXTI_Line4)==SET){GPIO_ResetBits(GPIOF,GPIO_Pin_9);GPIO_ResetBits(GPIOF,GPIO_Pin_10);EXTI_ClearITPendingBit(EXTI_Line4);}
}int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);GPIO_InitTypeDef GPIO_InitTypeDefStruct;GPIO_InitTypeDef GPIO_InitTypeDefStruct1;//初始化按键GPIO_InitTypeDefStruct.GPIO_Mode = GPIO_Mode_IN;//GPIO_InitTypeDefStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitTypeDefStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3;GPIO_InitTypeDefStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitTypeDefStruct.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOE,&GPIO_InitTypeDefStruct);//初始化LEDGPIO_InitTypeDefStruct1.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitTypeDefStruct1.GPIO_OType = GPIO_OType_PP;GPIO_InitTypeDefStruct1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitTypeDefStruct1.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitTypeDefStruct1.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOF,&GPIO_InitTypeDefStruct1);//配置SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);//EXTI_InitTypeDef EXIT_STRUCT;EXIT_STRUCT.EXTI_Line=EXTI_Line4;EXIT_STRUCT.EXTI_Mode=EXTI_Mode_Interrupt;EXIT_STRUCT.EXTI_Trigger=EXTI_Trigger_Falling;EXIT_STRUCT.EXTI_LineCmd=ENABLE;EXTI_Init(&EXIT_STRUCT);EXTI_InitTypeDef EXIT_STRUCT1;EXIT_STRUCT1.EXTI_Line=EXTI_Line3;EXIT_STRUCT1.EXTI_Mode=EXTI_Mode_Interrupt;EXIT_STRUCT1.EXTI_Trigger=EXTI_Trigger_Falling;EXIT_STRUCT1.EXTI_LineCmd=ENABLE;EXTI_Init(&EXIT_STRUCT1);//设置中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_struct;nvic_struct.NVIC_IRQChannel=EXTI4_IRQn;nvic_struct.NVIC_IRQChannelPreemptionPriority=0;nvic_struct.NVIC_IRQChannelSubPriority=1;nvic_struct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&nvic_struct);NVIC_InitTypeDef nvic_struct1;nvic_struct1.NVIC_IRQChannel=EXTI3_IRQn;nvic_struct1.NVIC_IRQChannelPreemptionPriority=1;nvic_struct1.NVIC_IRQChannelSubPriority=2;nvic_struct1.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&nvic_struct1);while(1){EXTI3_IRQHandler();EXTI4_IRQHandler();}
}

 

相关文章:

94.STM32外部中断

目录 1.什么是 NVIC? 2.NVIC寄存器 3.中断优先级 4.NVIC的配置 设置中断分组​编辑 配置某一个中断的优先级 5.什么是EXTI 6.EXTI和NVIC之间的关系 7.SYSCFG 的介绍 1.什么是 NVIC? NVIC是一种中断控制器,主要用于处理 ARM Cort…...

【Linux】快速上手自动化构建工具make/makefile

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.什么是make / makefile 2…...

HarmonyOS

基本概念 1、ARKTS是由ArkUI框架提供,它是声明式UI 2、声明式UI的思想:- 关心描述UI的呈现结果,而不关心过程;- 状态驱动视图更新自定义组件的组成 关键字说明举例struct声明组件名struct ToDolist 代办组件EntryComponent装饰…...

Docker安装Oracle18c 坑已排完,放心食用

Docker安装Oracle18c 坑已排完,放心食用 0、有问题可邮件我1、拉取 oracle18c 镜像, 推荐使用 zhengqing版本的镜像2、启动容器3、等待容器启动完成, 这一步很慢很慢, 别着急4、进入容器5、修改管理员密码6、查看并设置环境变量7、设置监听模式支持以SID方式连接PDB数据库8、使…...

2023年第十二届数学建模国际赛小美赛C题雪崩防范求解分析

2023年第十二届数学建模国际赛小美赛 C题 雪崩防范 原题再现: 雪崩是极其危险的现象。现在,我们对雪崩是如何形成的已经有了很好的理解,但是我们还不能详细地预测雪崩发生的原因、时间和地点。村庄和道路可以通过各种方式防止雪崩。避免在脆…...

Nginx Openresty通过Lua+Redis 实现动态封禁IP

需求 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单中的 IP ,我们将拒绝提供服务。并且可以设置封禁失效时间 环境准备 linux version: centos7 / ubuntu 等 redis version: 5.0.5 nginx version: nginx…...

.Net 字符集与编解码

0 .NET 字符集编解码 .Net 内部使用的字符集是Unicode,如果需要编码为其他诸如GBK、UTF8编码,可以通过Encoding 类来实现。 using System.Text;void PrintBytes(byte[] bytes) {foreach (var b in bytes){Console.Write("{0:X} ", b);}Conso…...

Spinnaker 基于 jenkins 触发部署

jenkins job 触发部署 将 Jenkins 设置为 Spinnaker 中的持续集成 (CI) 系统可让您使用 Jenkins 触发管道、向管道添加 Jenkins 阶段或向管道添加脚本阶段。 前置要求: 已在kubernetes中部署spinnaker已准备可用的jenkins实例 启用 jenkins触发器 官方文档&…...

FLASK博客系列6——数据库之谜

我们上一篇已经实现了简易博客界面,你还记得我们的博客数据是自己手动写的吗?但实际应用中,我们是不可能这样做的。大部分程序都需要保存数据,所以不可避免要使用数据库。我们这里为了简单方便快捷,使用了超级经典的SQ…...

Clickhouse UPDATE 和 DELETE操作

历史: 在OLAP数据库中,可变数据(Mutable data)通常是不被欢迎的,Clickhouse也是如此,早期版本不支持UPDATE和DELTE操作。在Clickhouse 1.1.54388版本之后才支持UPDATE和DELETE操作,适用于Merge…...

golang channel执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的chan调度代码 package mainimport "fmt"func main() {ch : make(chan struct{})go func() {ch <- struct{}{}ch <- struct{}{}}()fmt.Println("xiaochuan", <-ch)data, ok : <-chfmt.Println(&…...

OpenCvSharp从入门到实践-(04)色彩空间

目录 1、GRAY色彩空间 2、从BGR色彩空间转换到GRAY色彩空间 2.1色彩空间转换码 2.2实例 BGR色彩空间转换到GRAY色彩空间 3、HSV色彩空间 4、从BGR色彩空间转换到HSV色彩空间 4.1色彩空间转换码 4.2实例 BGR色彩空间转换到HSV色彩空间 1、GRAY色彩空间 GRAY色彩空间通常…...

100.有序数组的平方(力扣)

代码解决一 class Solution { public:// 函数接受一个整数数组&#xff0c;返回每个元素平方值排序后的结果vector<int> sortedSquares(vector<int>& nums) {int len nums.size(); // 获取数组的长度vector<int> v; // 创建一个新的数组&#xff0c;用…...

微服务--01--简介、服务拆分原则

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 微服务微服务架构&#xff0c;是服务化思想指导下的一套最佳实践架构方案。服务化&#xff0c;就是把单体架构中的功能模块拆分为多个独立项目。 单体架构微服务架构…...

IntelliJ IDEA安装使用教程

IntelliJ IDEA是一个流行的Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它是一款全功能的IDE&#xff0c;支持多种编程语言&#xff0c;如Java、Kotlin、Groovy、Scala、Python、JavaScript、HTML、CSS等等。IntelliJ IDEA 提供了高效的代码…...

校园门禁可视化系统解决方案

随着科技的持续进步&#xff0c;数字化校园在教育领域中的地位日益上升&#xff0c;各种智能门禁、安防摄像头等已遍布校园各个地方&#xff0c;为师生提供安全便捷的通行体验。然而数据收集分散、缺乏管理、分析困难等问题也逐渐出现&#xff0c;在这个数字化环境中&#xff0…...

rest_framework_django学习笔记一(序列化器)

rest_framework_django学习笔记一(序列化器) 一、引入Django Rest Framework 1、安装 pip install djangorestframework2、引入 INSTALLED_APPS [...rest_framework, ]3、原始RESTful接口写法 models.py from django.db import models 测试数据 仅供参考 INSERT INTO de…...

面试题:什么是负载均衡?常见的负载均衡策略有哪些?

文章目录 一、负载均衡二、负载均衡模型分类三、CDN负载均衡四、LVS负载均衡4.1 LVS 支持的三种模式4.1.1 DR 模式4.1.2 TUN 模式4.1.3 NAT 模式 4.2 LVS 基于 Netfilter 的框架实现 五、负载均衡策略是什么六、常用负载均衡策略图解6.1 轮询6.2 加权轮询6.3 最少连接数6.4 最快…...

精通Git(第2版)读书笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言第 1章 入门 11.1 关于版本控制 11.1.1 本地版本控制系统 1 第 2章 Git基础 132.1 获取Git仓库 132.1.1 在现有中初始化Git仓库 132.1.2 克隆现有仓库 14 2.2 在…...

XUbuntu22.04之OBS30.0设置录制音频降噪(一百九十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...