stm32学习笔记-5EXIT外部中断
5 EXIT外部中断
[toc]
注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。
注:工程及代码文件放在了本人的Github仓库。
5.1 STM32中断系统
中断 是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。使用中断系统,可以极大程度地提高程序的效率,就像是给自己定闹钟,可以不用担心错过时间而可以安心睡觉。在这个过程中,有如下概念:
- 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
- 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
stm32的F1系列总共有68个可屏蔽中断通道(中断源),包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。所有的中断使用 嵌套向量中断控制器NVIC 统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。具体到某一个型号的芯片可能不会有这么多中断,具体需要查看的芯片手册。下面是手册中的中断向量表节选:
- 地址(最后一列):存储中断地址,这个地址列表也称为 中断向量表。因为程序中的中断函数地址由编译器来分配,所以中断函数地址不固定。但是由于硬件的限制,中断跳转只能跳转到固定的地址执行程序。所以为了让硬件能跳转到一个地址不固定的中断函数里,就需要在内存中定义一个固定的地址列表。当中断发生后,首先跳转到这个固定的地址列表,编译器会在这个固定的位置加上一条跳转到中断函数的代码,于是中断跳转就可以跳转到任意位置了。C语言编程无需关注中断向量表,汇编语言需要。
上图给出了 嵌套向量中断控制器NVIC 的基本结构示意图。在stm32中,NVIC用于统一管理中断和分配中断优先级,属于内核外设,是CPU的小助手,可以让CPU专注于运算。从上图可以看出:
- NVIC有很多输入口,每个都代表一个中断线路,如EXIT、TIM、ADC等。
- 每个中断线路上的斜杠n表示n条线,因为一个外设可能会同时占用多个中断通道。
- NVIC只有一个输出口,通过中断优先级确定中断执行的顺序。
NVIC的中断优先级 由优先级寄存器的4位二进制(十进制0~15)决定,这4位可以进行切分,分为 高n位 的抢占优先级和 低(4-n)位 的响应优先级。抢占优先级高的可以 中断嵌套,响应优先级高的可以 优先排队,抢占优先级和响应优先级均相同的按 中断号 排队。这个中断号就是指中断向量表的第二列“优先级”。
用医院的叫号系统来举例子。假设医生正在给某个病人看病,外面还有很多病人排队:
- 新来的病人 抢占优先级高 就相当于直接进屋打断医生,给自己看病。
- 新来的病人 响应优先级高 就相当于不打扰医生,但直接插队,排在队伍的第一个。
分组方式 | 抢占优先级 | 响应优先级 |
---|---|---|
分组0(n=0) | 0位,取值为0 | 4位,取值为0~15 |
分组1(n=1) | 1位,取值为0~1 | 3位,取值为0~7 |
分组2(n=2) | 2位,取值为0~3 | 2位,取值为0~3 |
分组3(n=3) | 3位,取值为0~7 | 1位,取值为0~1 |
分组4(n=4) | 4位,取值为0~15 | 0位,取值为0 |
注:NVIC是内核外设,更多关于NVIC的介绍参考“STM32F10xxx Cortex-M3编程手册”。
- NVIC中断分组的配置寄存器,在SCB_AIRCR中,PRIGROUP这三位就是用于配置中断分组的。
5.2 STM32外部中断EXTI
中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一,而EXTI就是其中之一,上图给出了外部中断的中断向量表。EXTI(Extern Interrupt)外部中断 可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
- 支持的触发方式:上升沿/下降沿/双边沿/软件触发。
- 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断。
- 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒。
注:后面这四个功能是为了实现一些特殊的功能,比如想实现某个时间让stm32退出停止模式,由于外部中断可以在低功耗模式的停止模式下唤醒stm32,就可以在GPIO口上连接一个RTC时钟作为外部中断。
- 触发响应方式:中断响应/事件响应。
注:中断响应就是正常的中断流程,申请中断让CPU执行中断函数;事件响应就是外部中断发生时,不把外部中断信号给CPU,而是选择触发一个事件,将这个信号通向其他外设,来触发其他外设的操作,可以实现外设之间的联合工作。
- 最左侧:GPIO口的外设,每个外设都有16个引脚。
- AFIO中断引脚选择:本质上就是数据选择器,从前面16*n个引脚中选择16根端口号不重复的引脚出来,连接到后面的EXTI通道中。在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。下面是中断引脚选择的AFIO示意图:
- PVD、RTC、USB、ETH:四个特殊功能的外设。
- EXTI边沿检测及控制:20个输入通道、两类输出。一类输出到NVIC中,并且将这20路输出的95、1510路外部中断合并在一起以节省通道;另一类输出到其他外设,直接就是20路输出。
注:上面这个EXTI的基本结构也是编写代码时的主要参考图!
上图给出了参考手册中的EXTI框图。基本逻辑与“EXTI的基本结构”中所述相同,另外还有一些细节:
- 边沿检测电路+软件中断事件寄存器:这个几个进行或门输出,便可以实现“上升沿/下降沿/双边沿/软件触发”这四种触发方式。
- 请求挂起寄存器:相当于一个中断标志位,通过读取该寄存器可以判断是哪个通道触发的中断。
- 中断屏蔽寄存器/事件屏蔽寄存器:相当于开关,只有置1,中断信号才能继续向左走。
- 脉冲发生器:产生一个电平脉冲,用于触发其他外设的动作。
最后一个问题,到底什么样的设备需要用到外部中断呢?
答:对于stm32来说,若想获取一个由外部驱动的很快的突发信号,就需要外部中断。
- 如旋转编码器,平常不会有什么变化,但是一旦拧动时,会产生一段时间变化很快的突发信号,就需要stm32能在短时间内快速读取并处理掉这个数据。
- 再如红外遥控接收头,平常也不会有什么变化,但是一旦接收到信号时,这个信号也是转瞬即逝的。
- 但是不推荐按键使用外部中断。因为外部中断不能很好的处理按键抖动和松手检测的问题,所以要求不高时,还是建议在主函数内部循环读取。
5.2 旋转编码器介绍
对射式红外传感器就是一种通用传感器模块,已经在第三节“GPIO通用输入输出口”中介绍过,不再赘述。本实验只介绍旋转编码器。
旋转编码器 是一种用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向。
如上图,旋转编码器主要有三种类型:光栅式 / 机械触点式 / 霍尔传感器式。下面是这三种形式的介绍:
- 光栅式(老款鼠标):配合对射式红外传感器使用,在旋转过程中光栅编码盘会不断地 阻挡/透过 红外射线,于是模块便会输出高低电平交替的方波,方波的频率便代表了旋转速度。缺点是只有一路输出,无法判断转动方向。
- 机械触点式:内部使用机械触点检测通断,A口和B口输出的方波正交,具体看下面的介绍。当然,也有机械触点式编码器可以一个引脚输出速度信息、一个引脚输出旋转方向信息。
- 霍尔传感器式:直接附在电机后面的编码器,中间是一个圆形磁铁,旋转时两侧的霍尔传感器便可输出正交的方波信号。
- 独立的编码器元件:输入轴转动时,输出便有波形。
注:触点式不适合高速旋转的场景,常用于音量调节。非接触形式的电机可以用于电机测速。
- 图片右侧是旋转编码器的旋钮,可以看到下面是一圈可以导电的金属片。
- 中间有一个大的按键开关结构,也可以检测通断,但是该旋转编码器模块没有使用到该功能。
- 左右两组金属触点。内部实际的连线如红线标注,C口接地,于是旋钮在旋转过程中就可以使A口、B口输出高低交替的方波。方波频率表示旋转速度。
- A口、B口配合旋钮,可以产生相位相差90°的方波,称为正交信号。顺时针旋转A口相位超前,逆时针旋转B口相位超前。
- R1、R2:上拉电阻。
- R3、R4:输出限流电阻,防止引脚电流过大。
- C1、C2:滤波电容,滤除高频不稳定纹波。
注:C口已经默认接地,只需关心A口、B口的高低变化及相位差即可。
5.3 实验:对射式红外传感器计次
需求:利用stm32的外部中断,对 对射式红外传感器 产生的下降沿进行计次。
代码展示:OLED.h
、OLED.c
、OLED_Font.h
代码见第四节“OLED调试工具”,本节省略。
- main.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "CountSensor.h"int main(void){//OLED初始化OLED_Init();OLED_ShowString(1,1,"Neg-edge:");OLED_ShowNum(2,1,0,5); CountSensor_Init();while(1){OLED_ShowNum(2,1,CountSensor_Get(),5); };
}
- CountSensor.h
#ifndef __COUNTERSENSOR_H
#define __COUNTERSENSOR_Hvoid CountSensor_Init(void);
uint16_t CountSensor_Get(void);#endif
- CountSensor.c
#include "stm32f10x.h" // Device headeruint16_t CountSensor_Count = 0;//中断触发次数/*** @brief 对射式红外传感器起初始化-PB14*/
void CountSensor_Init(void){//EXIT初始化//1. 开启GPIO、AFIO的外设时钟(EXTI和NVIC的时钟是一直打开的)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2. 配置GPIO-PB14上拉输入GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//3. 配置AFIO(库函数在GPIO中)GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//数据选择器//4. 配置NVICEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);//5. 配置NVIC(库函数在misc.h文件中)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断的优先级分组,每个工程只能出现一次!!NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);
}/*** @brief 输出中断触发的次数* @retvl 无符号16位整型,范围0~65535*/
uint16_t CountSensor_Get(void){return CountSensor_Count;
}//中断函数的名字从启动文件“stratup_stm32f10x_md”中来
//中断函数都是无参无返回值的
void EXTI15_10_IRQHandler(void){//中断标志位判断if(EXTI_GetITStatus(EXTI_Line14)==SET){CountSensor_Count++;EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位}
}
编程感想:
- 下降沿触发(移除遮挡触发)。传感器无遮挡时,DO输出低电平;传感器有遮挡时,DO输出高电平。所以放入遮挡意味着上升沿,移除遮挡相当于下降沿。采用上升沿触发计数可能不准确,下降沿触发计数准确。
- 中断函数的名字从启动文件“stratup_stm32f10x_md”中来,并且中断函数都是无参无返回值的。
5.4 实验:旋转编码器计次
需求:利用stm32的外部中断,对旋转编码器的转动进行计次,顺时针加、逆时针减,并显示在OLED显示屏上。
代码展示:OLED.h
、OLED.c
、OLED_Font.h
代码见第四节“OLED调试工具”,本节省略。
- main.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "RotaryEncoder.h"int main(void){//配置中断的优先级分组,每个工程只能出现一次!!NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//OLED显示屏初始化OLED_Init();OLED_ShowString(1,1,"RE_Count:");OLED_ShowSignedNum(2,1,0,5);//传感器初始化RotaryEncoder_Init();while(1){OLED_ShowSignedNum(2,1,RotaryEncoder_GetCount(),5);if(RotaryEncoder_GetChange()==1) {OLED_ShowString(3,1,"Clockwise. ");}else if(RotaryEncoder_GetChange()==-1){OLED_ShowString(3,1,"anti-Clockwise.");}};
}
- RotaryEncoder.h
#ifndef __ROTARYENCODER_H
#define __ROTARYENCODER_Hvoid RotaryEncoder_Init(void);
int16_t RotaryEncoder_GetCount(void);
int16_t RotaryEncoder_GetChange(void);#endif
- RotaryEncoder.c
#include "stm32f10x.h" // Device header//旋转编码器计次
int16_t RotaryEncoder_Count_cur = 0;
int16_t RotaryEncoder_Count_pre = 0;/*** @brief 旋转编码器(Rotary Encoder)初始化-A口PB0、B口PB1*/
void RotaryEncoder_Init(void){//开启外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//配置GPIOB-PB0、PB1上拉输入GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//配置AFIO(库函数在GPIO中)GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);//配置EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&EXTI_InitStructure);//配置NVIC(库函数在misc.h文件中)NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStructure);
}/*** @brief 获取从程序复位开始的计次* @retvl int16_t变量,范围-32768~32767*/
int16_t RotaryEncoder_GetCount(void){return RotaryEncoder_Count_cur;
}/*** @brief 获取状态变化值* @retvl int16_t变量,-1表示逆时针转、0初始化状态、1表示顺时针转*/
int16_t RotaryEncoder_GetChange(void){return (RotaryEncoder_Count_cur - RotaryEncoder_Count_pre);
}/*** @brief A口下降沿中断函数*/
void EXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)==SET){if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0){RotaryEncoder_Count_pre = RotaryEncoder_Count_cur;RotaryEncoder_Count_cur--;//B口超前减计数}EXTI_ClearITPendingBit(EXTI_Line0);}
}/*** @brief B口下降沿中断函数*/
void EXTI1_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line1)==SET){if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==0){RotaryEncoder_Count_pre = RotaryEncoder_Count_cur;RotaryEncoder_Count_cur++;//A口超前加计数}EXTI_ClearITPendingBit(EXTI_Line1);}
}
编程感想:
- 管理Hardware文件夹。本次实验继承的是“OLED显示屏”实验的代码,而非“对射式红外传感器计次”。猜测是因为驱动文件的命名不规范,本人的实验文件均按照模块的英文名来命名。
- 注意每个模块在使用的时候都要进行初始化。
- 注意进入中断函数的时候要检查中断标志位,退出的时候清零中断标志位。
- 注意主函数和中断函数不要操控同一个硬件,避免不必要的硬件冲突。中断函数一般执行简短快速的代码,如操作中断标志位等。
相关文章:
stm32学习笔记-5EXIT外部中断
5 EXIT外部中断 [toc] 注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 5.1 STM32中断系统 图5-1 中断及中断嵌套示意图 中断 是指在主程序运行过程中,出现了特定…...
MySQL Workbench 图形化界面工具
Workbench 介绍 MySQL官方提供了一款免费的图形工具——MySQL Workbench,它是一款功能强大且易于使用的数据库设计、管理和开发工具,总之,MySQL Workbench是一款非常好用的MySQL图形工具,可以满足大多数MySQL用户的需求。 目录 W…...
雪花算法(SnowFlake)
简介现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表…...
Linux防火墙
一、Linux防火墙Linux的防火墙体系主要在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,因…...
网络安全系列-四十七: IP协议号大全
IP协议号列表 这是用在IPv4头部和IPv6头部的下一首部域的IP协议号列表。 十进制十六进制关键字协议引用00x00HOPOPTIPv6逐跳选项RFC 246010x01ICMP互联网控制消息协议(ICMP)RFC 79220x02IGMP...
HTTP协议格式以及Fiddler用法
目录 今日良言:焦虑和恐惧改变不了明天,唯一能做的就是把握今天 一、HTTP协议的基本格式 二、Fiddler的用法 1.Fidder的下载 2.Fidder的使用 今日良言:焦虑和恐惧改变不了明天,唯一能做的就是把握今天 一、HTTP协议的基本格式 先来介绍一下http协议: http 协议(全称为 &q…...
自动写代码?别闹了!
大家好,我是良许。 这几天,GitHub 上有个很火的插件在抖音刷屏了——Copilot。 这个神器有啥用呢?简单来讲,它就是一款由人工智能打造的编程辅助工具。 我们来看看它有啥用。 首先就是代码补全功能,你只要给出函数…...
项目心得--网约车
一、RESTFULPost:新增Put:全量修改Patch:修改某个值Delete: 删除Get:查询删除接口也可以用POST请求url注意:url中不要带有敏感词(用户id等)url中的名词用复数形式url设计:api.xxx.co…...
【二叉树广度优先遍历和深度优先遍历】
文章目录一、二叉树的深度优先遍历0.建立一棵树1. 前序遍历2.中序遍历3. 后序遍历二、二叉树的广度优先遍历层序遍历三、有关二叉树练习一、二叉树的深度优先遍历 学习二叉树结构,最简单的方式就是遍历。 所谓二叉树遍历(Traversal)是按照某种特定的规则ÿ…...
Spring Cloud微服务架构必备技术
单体架构 单体架构,也叫单体应用架构,是一个传统的软件架构模式。单体架构是指将应用程序的所有组件部署到一个单一的应用程序中,并统一进行部署、维护和扩展。在单体架构中,应用程序的所有功能都在同一个进程中运行,…...
TCP三次握手与四次挥手(一次明白)
TCP基本信息 默认端口号:80 LINUX中TIME_WAIT的默认时间是30s TCP三次握手 三次握手过程:每行代表发起握手到另一方刚刚收到数据包时的状态 客户端服务端客户端状态服务端状态握手前CLOSELISTEN客户端发送带有SYN标志的数据包到服务端一次握手SYN_SENDLISTEN二次握手服务端发送…...
pyside6@Mouse events实例@QApplication重叠导致的报错@keyboardInterrupt
文章目录报错内容鼠标事件演示报错内容 在pyside图形界面应用程序开发过程中,通常只允许运行一个实例 假设您重复执行程序A,那么可能会导致一些意向不到的错误并且,从python反馈的信息不容易判断错误的真正来源 鼠标事件演示 下面是一段演示pyside6的鼠标事件mouseEvent对象…...
订单30分钟未支付自动取消怎么实现?
目录了解需求方案 1:数据库轮询方案 2:JDK 的延迟队列方案 3:时间轮算法方案 4:redis 缓存方案 5:使用消息队列了解需求在开发中,往往会遇到一些关于延时任务的需求。例如生成订单 30 分钟未支付࿰…...
< 开源项目框架:推荐几个开箱即用的开源管理系统 - 让开发不再复杂 >
文章目录👉 SCUI Admin 中后台前端解决方案👉 Vue .NetCore 前后端分离的快速发开框架👉 next-admin 适配移动端、pc的后台模板👉 django-vue-admin-pro 快速开发平台👉 Admin.NET 通用管理平台👉 RuoYi 若…...
内网渗透-基础环境
解决依赖,scope安装 打开要给cmd powershell 打开远程 Set-ExecutionPolicy RemoteSigned -scope CurrentUser; 我试了好多装这东西还是得科学上网,不然不好用 iwr -useb get.scoop.sh | iex 查看下载过的软件 安装sudo 安装git 这里一定要配置bu…...
Go语言学习的第一天(对于Go学习的认识和工具选择及环境搭建)
首先学习一门新的语言,我们要知道这门语言可以帮助我们做些什么?为什么我们要学习这门语言?就小wei而言学习这门语言是为了区块链,因为自身是php出身,因为php的一些特性只能通过一些算法模拟的做一个虚拟链,…...
C和C++到底有什么关系
C++ 读作”C加加“,是”C Plus Plus“的简称。顾名思义,C++是在C的基础上增加新特性,玩出了新花样,所以叫”C Plus Plus“,就像 iPhone 6S 和 iPhone 6、Win10 和 Win7 的关系。 C语言是1972年由美国贝尔实验室研制成功的,在当时算是高级语言,它的很多新特性都让汇编程序…...
14个Python处理Excel的常用操作,非常好用
自从学了Python后就逼迫用Python来处理Excel,所有操作用Python实现。目的是巩固Python,与增强数据处理能力。 这也是我写这篇文章的初衷。废话不说了,直接进入正题。 数据是网上找到的销售数据,长这样: 一、关联公式:…...
async/await 用法
1. 什么是 async/await async/await 是 ES8(ECMAScript 2017)引入的新语法,用来简化 Promise 异步操作。在 async/await 出 现之前,开发者只能通过链式 .then() 的方式处理 Promise 异步操作。示例代码如下: import …...
好意外,发现永久免费使用的云服务器
原因就不说了,说一下过程,在百度搜pythonIDE的时候,发现了一个网站 https://lightly.teamcode.com/https://lightly.teamcode.com/ 就是这个网站,看见这个免费试用,一开始觉得没什么,在尝试使用的过程中发…...
VSCode使用技巧,代码编写效率提升2倍以上!
VSCode是一款开源免费的跨平台文本编辑器,它的可扩展性和丰富的功能使得它成为了许多程序员的首选编辑器。在本文中,我将分享一些VSCode的使用技巧,帮助您更高效地使用它。 1. 插件 VSCode具有非常丰富的插件生态系统,通过安装插…...
SQL执行过程详解
1 、用户在客户端执行 SQL 语句时,客户端把这条 SQL 语句发送给服务端,服务端的进程,会处理这条客户端的SQL语句。 2 、服务端进程收集到SQL信息后,会在进程全局区PGA 中分配所需内存,存储相关的登录信息等。 3 、客…...
【物联网NodeJs-5天学习】第四天存储篇⑤ ——PM2,node.js应用进程管理器
【NodeJs-5天学习】第四天存储篇⑤ ——PM2,node.js应用进程管理器1. 前言2. 官方说明3. 安装PM24. PM2常用命令4.1 启动命令4.2 重新启动命令4.3 热重载命令4.4 停止命令4.5 删除命令4.6 查看进程运行状态4.4 显示某一个进程的具体信息4.8 显示日志信息4.9 终端监控…...
【C++学习】【STL】deque容器
dequeDouble Ended Queues(双向队列)deque和vector很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内…...
当 App 有了系统权限,真的可以为所欲为?
看到群里发了两篇文章,出于好奇,想看看这些个 App 在利用系统漏洞获取系统权限之后,都干了什么事,于是就有了这篇文章。由于准备仓促,有些 Code 没有仔细看,感兴趣的同学可以自己去研究研究,多多…...
vue3.js的介绍
一.vue.js简述 Vue是一套用于构建用户开源的MVVM结构的Javascript渐进式框架,尤雨溪在2015年10月27日发布了vue.js 1.0Eavangelion版本,在2016年9月30日发布了2.0Ghost in the Shell版本,目前项目由官方负责 vue的核心只关注图层࿰…...
【Three.js】shader特效 能量盾
shader特效之能量盾前言效果噪点图主要代码index.htmldepth-fs.jsdepth-vs.jsshield-fs.jsshield-vs.js相关项目前言 效果噪点图 为了可以自定义能量球的效果,这里使用外部加载来的噪点图做纹理,省去用代码写特效的过程。 主要代码 index.html <…...
【6000字长文】需求评审总是被怼?强烈推荐你试试这三招
前段时间和一个合作部门的产品新人沟通需求,结束的时候,他问了我一个问题,“你在产品新人阶段,最害怕做的事情是什么”? 我不假思索的回答说,“需求评审,是曾经最不想面对的环节,甚至在评审之前几个小时就开始心跳加速了。当然这也是产品修炼路上的必经之路,其实只要掌…...
Hive介绍及DDL
1.OLTP和OLAP OLTP: 联机事务处理系统。在前台接收的用户数据可以立即传送到后台进行处理,并在很短的时间内给出处理结果。关系型数据库是OLTP典型应用,如MySQL OLTP环境开展数据分析是否可行? 为了更好的开展数据分析&#x…...
Simulink 自动代码生成电机控制:在某国产ARM0定点MCU上实现自动代码生成无感电机控制
目录 前言 开发流程 定点化的技巧 代码生成运行演示 总结 前言 这次尝试了在国产arm0内核的MCU上实现Simulink自动代码生成永磁同步电机无传感控制。机缘巧合之下拿到了一块国产MCU的电机控制板和一个5000RPM的小电机。最后实现了无传感控制,在这里总结下一些经…...
wordpress第三方客户端/百度在线客服
内联函数 1、内联函数的引出 背景----预处理宏会出现2个问题 1)宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误; 2)预处理器不允许访问类的成员,也就是说预处理器宏不能用作类的成员函数。 为了保持预处理器…...
邯郸企业做网站报价/百度移动点击排名软件
哈希概念 常规搜索: 数据杂乱无章——->顺序查找—–>时间复杂度0(n)。 数据有序—–>二分查找——>时间复杂度0(log(n))。 建立二叉搜索树—–>时间复杂度0(n)(单支树)。 理想的搜索方法是:可以…...
网上购物哪个平台最好货真价实/优化网站seo
上文提到python可以干很多事,很多时候生活中的很多问题都可以用代码解决,尤其是那些反复重复的事。今天就拿读研的时候的一个例子给大家说说,如何用代码解决生活中的问题。问题:导师带了3个班的图形学(100多号人),期末…...
定制小程序网站开发公司/cpu优化软件
全球领先的企业级和移动软件公司Sybase, Inc. (NYSE: SY)近日宣布,旗下最新一代著名的开发工具—PowerBuilder 12正式面市。PowerBuilder一直备受赞誉,其最新版本使开发者能更便捷、快速且高效地在Microsoft® .NET架构上构建或迁移业务应用软件&…...
亚马逊全球开店官方网站/拉新app渠道
最近一直在学习hapiJs,有点koa2的基础以为会容易呢,但是全英文的API,不同于koa2的实现方式,看起来大写的懵啊,整理此文,希望能够帮助到一些想要入门hapi的新人。 1、搭建项目 1.1 首先我们创建一个目录‘ha…...
做网站用什么比较好/网络优化工程师是做什么的
消息传递机制: 在OC中,方法的调用不再理解为对象调用其方法,而是要理解成对象接收消息,消息的发送采用‘动态绑定’机制,具体会调用哪个方法直到运行时才能确定,确定后才会去执行绑定的代码。方法的调用实际就是告诉对…...