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

stm32入门-----EXTI外部中断(下——实践篇)

目录

前言

 一、硬件介绍

1.对射红外线传感器

2.旋转编码器

二、EXTI外部中断C编程

1.开启RCC时钟

2.配置GPIOK口初始化

3.配置AFIO

4.配置EXIT

5.配置NVIC

三、EXIT外部中断项目实操

1.对射红外传感器计数

2.选择编码器计数


前言

        本期接着上一期的内容继续学习stm32的外部中断系统(上一期链接:stm32入门-----EXTI外部中断(上 ——理论篇)-CSDN博客)。本期的主要是进行实践操作stm32的外部中断,分为两个部分:红外线传感器进行计数和转动旋转编码器进行计数。(视频:[5-2] 对射式红外传感器计次&旋转编码器计次_哔哩哔哩_bilibili)

 一、硬件介绍

1.对射红外线传感器

工作电压:3.3V-5V
 输出形式:数字开关量D0输出(0 和 1),模拟输出A0引脚无效

使用方式: 接好VCC和GND,模块电源指示灯会亮,模块槽中无遮挡时,接收管导通,模块DO输出低电平,开关指示灯亮;遮挡时,DO输出高电平,开关指示灯灭。模块DO可与继电器相连,组成限位开关等功能,也可以与有源蜂鸣器模块相连,组成报警器。DO输出接口可以与单片机I0口直接相连,一般接外部中断,检测传感器是否有遮档,如用电机码盘则可检测电机的转速。 

硬件电路:

2.旋转编码器

  • 旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
  • 类型:机械触点式/霍尔传感器式/光栅式

硬件电路:

这里可以看到旋转编码器有两个输出口分别是A和B口,当没有进行旋转的时候此时两个输出口都会被拉升为高电平,当逆时针转动的时候A口的电路与GND导通,此时A口拉倒低电平,输出为低电平,但B处不变,顺时针就刚好反过来。(想了解详细可查看:江协科技STM32——旋转编码器计次(软件消抖)_旋转编码器消抖-CSDN博客)

二、EXTI外部中断C编程

我们可以用C语言的库函数来取调用这些外部中断,实际上只需要按照上一期理论的知识去进行相关的初始化设置就行了。大体上分为5步。

 EXIT外部中断结构图:

1.开启RCC时钟

        设置时钟包括GPIO口的时钟和AFIO的时钟,GPIO的时钟我们前面学习GPIO口的时候就已经学习过了,如果没有去指定开启GPIO的时钟,那么这个GPIO口是无法使用的。同样的AFIO的时钟如果不开的话也是无法使用的。

        对于EXIT外部中断,这两个时钟都要开启,GPIO是作为输入口,二AFIO是作为中断引脚的选择口。这里我们就使用APB2外设的时钟

示例如下: 

 // 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

2.配置GPIOK口初始化

这个的我们之前就已经学习过了,这里就不多讲了,不过要注意的是配置GPIOK口的工作方式最好选择上拉输入或者下拉输入或者浮空输入,以保证输入的电平是保持稳定的,当且仅当外部硬件输入变化才产生变化。

示例如下: 

//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU;//选择上拉输入GPIO_initstruct.GPIO_Pin=GPIO_Pin_14; //选用14号引脚GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct); //GPIOB口初始化

3.配置AFIO

这里要用到void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)这个函数,这个函数是用来去配置AFIO,不过这个函数的名称连AFIO都没出现反而出现了EXIT,我觉得也挺奇怪的,但是这个函数的内部是实际对AFIO进行操作的。

AFIO配置GPIO线路关系图如下:

相关定义如下:

示例如下: 

//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);   //AFIO打到GPIOB处的14号引脚

4.配置EXIT

配置EXIT包括配置工作方式(中断模式还是事件模式)、触发方式、以及配置外部中断的中断线路,上面我们配置好了AFIO与GPIO之间的线路,这里我们只需要去配置AFIO与EXIT之间的线路就行了。如下图所示:

 下图是EXIT在C语言中的结构体定义:

 代码的写法跟配置GPIO口的基本上是一模一样的,示例如下:

//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;//定义EXIT结构体EXTI_initstruct.EXTI_Line=EXTI_Line14;//选择中断线,这里选择外部中断14号线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用,进行使能操作,这里是设置ENABLE,进行使能EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式,这里选择中断模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等,这里选择下降沿触发EXTI_Init(&EXTI_initstruct);//初始化

5.配置NVIC

配置NVIC包括配置优先级(抢占优先级和响应优先级)、EXIT通道(也就是NVIC与上面配置好的EXIT之间的通道)、分组情况。

NVIC是分为5组的,不同的分组指定的抢占优先级和响应优先级的个数是不同的,分组配置的注释如下:

代码示例如下: 

 //5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;//定义结构体NVIC_initstruct.NVIC_IRQChannel= EXTI15_10_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);//初始化

三、EXIT外部中断项目实操

1.对射红外传感器计数

先看现象:

对射红外传感器计数

硬件连线图:

工程文件:

可以看到我们要编写的是下图两个箭头指向的文件,然后将结果在OLED显示屏上显示出来。

C编程代码如下

Countsensor.c代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
uint16_t count;//初始化
void Countsensor_init(){// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_initstruct.GPIO_Pin=GPIO_Pin_14;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);   //AFIO打到GPIOB处的14号引脚//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;//定义EXIT结构体EXTI_initstruct.EXTI_Line=EXTI_Line14;//选择中断线,这里选择外部中断14号线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用,进行使能操作EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式,这里选择中断模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等,这里选择下降沿触发EXTI_Init(&EXTI_initstruct);//初始化//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;//定义结构体NVIC_initstruct.NVIC_IRQChannel= EXTI15_10_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);//初始化}//返回count的值
uint16_t count_get()
{return count;
}
//中断函数,其函数的名字是固定的,参数为空
void EXTI15_10_IRQHandler(){//中断标志位判断,这个中断是EXTI 10~15的,我们要的是EXTI14的,所以要去判断一下是不是当前需要的中断if(EXTI_GetITStatus(EXTI_Line14)==SET){  //判断,返回值为set就表示确定当前没有错误是执行这个if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)//消抖count++;//程序进入到中断的时候会产生中断标志位,强制进入中断//执行完成了之后要去清除中断的标志位,不然就会一直执行中断函数EXTI_ClearITPendingBit(EXTI_Line14);}}

Countsensor.h代码 :

#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H
void Countsensor_init();
uint16_t count_get();#endif // !__COUNT_

main.c代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Countsensor.h"int main(void)
{	Countsensor_init();OLED_Init();OLED_ShowString(1,1,"count:");while(1){OLED_ShowNum(1,7,count_get(),4);Delay_ms(500);}
}

2.选择编码器计数

还是一样,我们先看现象:

选择编码器读取

电路连接图:

工程文件:

C语言代码如下

Encode.c代码

#include "stm32f10x.h"
int16_t count;
int16_t turn;//转动方向void Encode_init(){// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU; //默认设置为高电平GPIO_initstruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_0;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;EXTI_initstruct.EXTI_Line=EXTI_Line1 | EXTI_Line0;//选择中断线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等EXTI_Init(&EXTI_initstruct);//初始化//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;NVIC_initstruct.NVIC_IRQChannel= EXTI0_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);NVIC_initstruct.NVIC_IRQChannel= EXTI1_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=2;//设置响应优先级NVIC_Init(&NVIC_initstruct);
}
//返回转动方向的值,0表示逆时针,1表示顺时针
int16_t Turn_get(){return turn;
}
//返回数值的变化值
int16_t Encode_get(){int16_t temp=count;count=0;return temp;
}void EXTI0_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line0)==SET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0&&GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){count--;turn=0; //0表示逆时针旋转}EXTI_ClearITPendingBit(EXTI_Line0);}
}void EXTI1_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line1)==SET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0&&GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0){count++;turn=1; //1表示顺时针}EXTI_ClearITPendingBit(EXTI_Line1);}
}

Encode.h代码:

#ifndef __ENCODE_H
#define __ENCODE_H
void Encode_init();
int16_t Encode_get();
int16_t Turn_get();#endif // !__ENCODE_H

main.c代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encode.h"int16_t num;int main(void)
{	OLED_Init();Encode_init();OLED_ShowString(1,1,"time:");while(1){num+=Encode_get();OLED_ShowSignedNum(1,6,num,4);OLED_ShowSignedNum(2,1,Turn_get(),1);}
}

 相关的问题可查看:问题详情 (jiangxiekeji.com)

以上就是本期的全部内容了,我们下次见!

今日壁纸:

相关文章:

stm32入门-----EXTI外部中断(下——实践篇)

目录 前言 一、硬件介绍 1.对射红外线传感器 2.旋转编码器 二、EXTI外部中断C编程 1.开启RCC时钟 2.配置GPIOK口初始化 3.配置AFIO 4.配置EXIT 5.配置NVIC 三、EXIT外部中断项目实操 1.对射红外传感器计数 2.选择编码器计数 前言 本期接着上一期的内容继续学习stm3…...

深度学习落地实战:基于UNet实现血管瘤超声图像分割

前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...

Python进阶(4)--正则表达式

正则表达式 在Python中,正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前,还记得之前我们是通过什么方法分割…...

RCA连接器是什么?一文读懂

RCA连接器,也就是我们在电视机、DVD播放器、通讯设备、立体声设备和游戏设备后面常见的彩色插头,其历史可以追溯到近一个世纪以前。这种现今广泛使用的电缆接口,最初是由美国无线电公司(RCA)开发并命名的,在…...

【linux】服务器安装NVIDIA驱动

【linux】服务器安装NVIDIA驱动 【创作不易,求点赞关注收藏】😀 文章目录 【linux】服务器安装NVIDIA驱动一、关闭系统自带驱动nouveau二、下载英伟达驱动三、安装英伟达驱动1、禁用X服务器和相关进程2、在TTY终端安装驱动3、验证是否安装成功4、重新启…...

【达梦数据库】关于用户、模式、表空间等如何理解?

与MySQL的用户有所区别,MySQL是单实例多库,DM7以上版本是单库多实例架构, MySQL访问方式: 一个root访问多个库,访问前切换一下就ok 比如MySQL到DM的迁移是,MySQL的一个库对应dm中的一个表空间和一个用户。比…...

一篇就够mysql高阶知识总结

一、事务的ACID原则 序号原则说明1原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做2一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一…...

CTF-Web习题:[BJDCTF2020]ZJCTF,不过如此

题目链接:[BJDCTF2020]ZJCTF,不过如此 解题思路 访问靶场链接,出现的是一段php源码,接下来做一下代码审阅,发现这是一道涉及文件包含的题 主要PHP代码语义: file_get_contents($text,r); 把$text变量所…...

【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)

第四届能源工程与电力系统国际学术会议(EEPS 2024) 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网:www.iceeps.com 大会时间:2024年8月9-11日 大会…...

浅谈Vue:text-align: center、align-items: center、justify-content: center三种居中的区别和用法

text-align: center、align-items: center 和 justify-content: center 是用于不同布局场景下的CSS属性。它们在水平和垂直居中元素方面有所不同,具体取决于你使用的布局模型(如块级元素、Flexbox、Grid)。以下是它们的区别和适用场景&#x…...

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展,移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢?UI设计师负责什么?UI设计的发展趋势和就业前景如何?这些都是许多…...

关键字 internal

在C#中,internal 关键字是一个访问修饰符,它用于限制类型或类型成员的访问性。当一个类型(类、结构体、接口、枚举等)或类型成员(字段、属性、方法、事件等)被声明为 internal 时,它只能在同一程…...

C学习(数据结构)-->单链表习题

目录 一、环形链表 题一:环形链表 思路: 思考一:为什么? 思考二:快指针一次走3步、4步、......n步,能否相遇 step1: step2: 代码: 题二: 环形链表 I…...

MATLAB6:M文件和控制流

文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉运用MATLAB的控制指令。   2. 理解M脚本文件和函数文件的本质区别。   3. 能够运用所学知识,编制程序解决一般的计算问题。 二、实验内容 1.for循环结构及注…...

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代,网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持,成为了进行网页数据抓取的首选语言。在众多的爬虫库中,BeautifulSoup和Scrap…...

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机; CS结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。 例如&…...

白骑士的C++教学实战项目篇 4.3 多线程网络服务器

系列目录 上一篇:白骑士的C教学实战项目篇 4.2 学生成绩管理系统 在这一节中,我们将实现一个多线程网络服务器项目,通过该项目,我们将学习套接字编程的基础知识以及如何使用多线程处理并发连接。此外,我们还将实现一个…...

Go语言并发编程-Context上下文

Context上下文 Context概述 Go 1.7 标准库引入 context,译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括:取…...

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1,介绍举例 2,原理和实现实现 3,注意点 1,介绍 一般情况下,action 是一个平面对象,并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…...

【Qt】QTcpServer/QTcpSocket通信

这里写目录标题 1.pro文件2.服务器3.客户端 1.pro文件 QT network2.服务器 h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class MainW…...

【时时三省】单元测试 简介

目录 1,单元测试简介 2,单元测试的目的 3,单元测试检查范围 4,单元测试用例设计方法 5,单元测试判断通过标准 6,测试范围 7,测试频率 8,输出成果 经验建议: 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,单元测试简介 单元测试在以V模型…...

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…...

中介者模式(行为型)

目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;又成为调停者模式&#xff0c;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用&#xff0c;从而使其耦合…...

定个小目标之刷LeetCode热题(45)

32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()"有事…...

golang 实现负载均衡器-负载均衡原理介绍

go 实现负载均衡器 文章目录 go 实现负载均衡器代码实现介绍负载均衡的核心组件与工作流程核心组件工作流程 总结 算法详细描述&#xff1a;1. 轮询&#xff08;Round Robin&#xff09;2. 最少连接&#xff08;Least Connections&#xff09;3. IP散列&#xff08;IP Hash&…...

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…...

大模型预训练优化参数设置

文章目录 基于批次数据的训练学习率优化器稳定优化技术与传统神经网络的优化类似,通常使用批次梯度下降算法来进行模型参数的调优。同时,通过调整学习率以及优化器中的梯度修正策略,可以进一步提升训练的稳定性。为了防止模型对数据产生过度拟合,训练中还需要引入一系列正则…...

PHP pwn 学习 (2)

文章目录 A. 逆向分析A.1 基本数据获取A.2 函数逆向zif_addHackerzif_removeHackerzif_displayHackerzif_editHacker A.3 PHP 内存分配 A.4 漏洞挖掘B. 漏洞利用B.1 PHP调试B.2 exp 上一篇blog中&#xff0c;我们学习了一些PHP extension for C的基本内容&#xff0c;下面结合一…...

【Python学习笔记】:Python爬取音频

【Python学习笔记】&#xff1a;Python爬取音频 背景前摇&#xff08;省流可以不看&#xff09;&#xff1a; 人工智能公司实习&#xff0c;好奇技术老师训练语音模型的过程&#xff0c;遂请教&#xff0c;得知训练数据集来源于爬取某网页的音频。 很久以前看B站同济子豪兄的《…...

4 C 语言控制流与循环结构的深入解读

目录 1 复杂表达式的计算过程 2 if-else语句 2.1 基本结构及示例 2.2 if-else if 多分支 2.3 嵌套 if-else 2.4 悬空的 else 2.5 注意事项 2.5.1 if 后面不要加分号 2.5.2 省略 else 2.5.3 省略 {} 2.5.4 注意点 3 while 循环 3.1 一般形式 3.2 流程特点 3.3 注…...

最新网站架构/他达拉非的副作用和危害

用过数据库的都知道&#xff0c;数据库索引与书籍的索引类似&#xff0c;都是用来帮助快速查找的。MongoDB的索引跟关系型数据库的索引几乎一致。1. 索引的创建mongodb采用ensureIndex来创建索引&#xff0c;如&#xff1a;db.user.ensureIndex({"name":1})表示在use…...

长沙百度做网站多少钱/推广软件赚钱的平台

手机上有好用的时钟APP&#xff0c;时钟软件哪个好用? 每个人的手机屏幕都有着自己独特的设计&#xff0c;而时钟软件能够为用户的手机再增添一些风采和魅力&#xff0c;更有专为来年人设计的大字体桌面时钟&#xff0c;更加的清晰直观&#xff0c;各种特色的桌面时钟app中都有…...

深圳燃气公司怎么样/博客优化网站seo怎么写

前言&#xff1a;在之前已经梳理了微信的热修复Tinker的接入使用流程&#xff0c;这么牛逼的东西勾起了我的兴趣&#xff0c;因此走上了探究其实现原理的道路。Tinker支持Dex、资源文件、so文件的热更新&#xff0c;此次分析过程也将一步步的从这三个方面对Tinker进行源码解析&…...

网站怎么做短信接口/武汉做搜索引擎推广的公司

分析比较执行时间计划读取情况1. 查看执行时间和cpu set statistics time on select * from Bus_DevHistoryData set statistics time off 执行后在消息里可以看到 2. 查看查询对I/O的操作情况 set statistics io on select * from Bus_DevHistoryData set statistics io off 执…...

网站的二级页面在哪里做/网站seo快速排名

提起openstack的安装&#xff0c;整个人感觉都不好了&#xff0c;搞了将近一周时间也没能搞定Redhat、CentOS 6.5系统的安装&#xff0c;最后换到CentOS7.0上一次安装成功。为了以后少走弯路&#xff0c;记下自己愚钝的脚步。 第一次安装openstack&#xff0c;拿到的服务器是Re…...

新疆做网站哪家好/海外市场推广做什么的

我有一个Thread-extends类,它应该一次只运行一个实例(跨进程).为了实现这一点,我正在尝试使用文件锁.以下是我的代码&#xff1a;class Scanner(Thread):def __init__(self, path):Thread.__init__(self)self.lock_file open(os.path.join(config.BASEDIR, "scanner.lock…...