Arduino UNO R3自学笔记17 之 Arduino为啥要用中断?

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。

前言:学习Arduino中断的概念及其功能。

1.什么是中断?

        单片机在执行程序时,发生一些其它紧急的事情,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。这个过程称之为中断

        举个通俗易懂的例子:当你在看电视的时候,突然电话响了,你去接电话。接完电话回来继续看电视,这就是一个中断过程。我们以此为例分析一下:

                                          主进程:看电视;

                                          中断触发源:电话响了;

                                          中断服务子程序:接电话;

   通过上述例子我们了解了一些术语,以及中断这个过程。

        思考一个问题,当在上述接电话的时候厨房的燃气报警器突然报警,是不是我们会立即挂掉电话去处理燃气的报警问题,在这个过程中出现了,在中断中又发生了中断,我们称之为中断嵌套,燃气报警器突然报警这个事件的后果很严重,因此我们挂了电话去执行检查开窗通风等操作,在这个过程中,我们认识到这个燃气报警器突然报警这个事件更加需要紧急处理,电话事件次之,看电视事件 紧急程度最低,这种紧急处理的排序就称之为  中断优先级

2.为什么要用中断?

        中断系统的主要目的:

                ●提高系统效率。

                ●维持系统可靠正常工作。

                ●满足实时处理要求。

                ●提供故障现场处理手段。

          为什么要用中断?为此我们继续做一个程序案例进行分析。

3.实验硬件及代码测试

硬件连接图:

代码:

void setup()
{  Serial.begin(115200); //初始化串口,使用波特率115200,其余默认
Serial.println("Hello, I'm in a terminal!");
Serial.println();
pinMode(2, INPUT);
}
void loop()
{static uint32_t lastMillis = 0; //用于存储第一次获取的运行时间static uint32_t time0 = 0;      //用于存储时间差//A
/*lastMillis = micros();          //获取运行时间for(unsigned int m=0;m<10000;m++)  //一个嵌套,消耗CPU时间{for(unsigned int n=0;n<10000;n++){__asm__ __volatile__ ("nop"); //这是一个空指令,但是会花费一个周期去执行}}
//B
*/time0=micros() - lastMillis;  //计算A到B的执行时间差Serial.print("程序A点运行到B点耗时:  ");Serial.print(time0/1000000);Serial.println("秒");
if(digitalRead(2)==0) Serial.println("按钮被按下!");delay(200);
}

  测试视频如下:

        通过视频我们看出按钮硬件及软件上监测是没有问题的(我们屏蔽了A到B 的代码是为了测试其余代码的正确)。

4.案例分析

直接给出如下代码:

void setup()
{  Serial.begin(115200); //初始化串口,使用波特率115200,其余默认
Serial.println("Hello, I'm in a terminal!");
Serial.println();
}
void loop()
{static uint32_t lastMillis = 0; //用于存储第一次获取的运行时间static uint32_t time0 = 0;      //用于存储时间差//AlastMillis = micros();          //获取运行时间for(unsigned int m=0;m<10000;m++)  //一个嵌套,消耗CPU时间{for(unsigned int n=0;n<10000;n++){__asm__ __volatile__ ("nop"); //这是一个空指令,但是会花费一个周期去执行}}
//Btime0=micros() - lastMillis;  //计算A到B的执行时间差delay(200);Serial.print("程序A点运行到B点耗时:  ");Serial.print(time0/1000000);Serial.println("秒");
}

仿真运行效果:上述程序执行后,程序A点运行到B点耗时: 31秒。

        也就是说当有扫描式按钮在主程序等待被监测按下按钮这个动作时,至少会被阻塞31秒,也就是说,在那31秒内按钮按下也不会被监测到!当然一般程序不会有这种情况存在(阻塞31秒),这里将阻塞时间做了放大,实际可能阻塞有几秒钟,但是这种阻塞是非常不利于程序的实时性。

        此时我们再做一个按钮按下监测实验,不屏蔽阻塞代码,看阻塞代码对此按键扫描的影响。

        调整后代码如下:

void setup()
{  Serial.begin(115200); //初始化串口,使用波特率115200,其余默认
Serial.println("Hello, I'm in a terminal!");
Serial.println();
pinMode(2, INPUT);
}
void loop()
{static uint32_t lastMillis = 0; //用于存储第一次获取的运行时间static uint32_t time0 = 0;      //用于存储时间差//AlastMillis = micros();          //获取运行时间for(unsigned int m=0;m<1600;m++)  //一个嵌套,消耗CPU时间{for(unsigned int n=0;n<10000;n++){__asm__ __volatile__ ("nop"); //这是一个空指令,但是会花费一个周期去执行}}
//Btime0=micros() - lastMillis;  //计算A到B的执行时间差Serial.print("程序A点运行到B点耗时:  ");Serial.print(time0/1000000);Serial.println("秒");
if(digitalRead(2)==0) Serial.println("按钮被按下!");delay(200);
}

注意:上述代码,我把阻塞时间调整了一下,由原来31秒调整到了5秒,好录测试视频。

测试视频如下:

        通过上述仿真视频看到,阻塞非常严重,你在设备端不断按按钮,但是系统却没检测到!这样的系统实时性就非常的差,操作体验感不佳!

        我们修改代码,用中断的方式监测按钮按下,硬件不变,代码如下:

void btn_press();
void setup()
{  Serial.begin(115200); //初始化串口,使用波特率115200,其余默认
Serial.println("Hello, I'm in a terminal!");
Serial.println();
attachInterrupt(0, btn_press, LOW);//引脚20外部中断
}
void loop()
{static uint32_t lastMillis = 0; //用于存储第一次获取的运行时间static uint32_t time0 = 0;      //用于存储时间差//AlastMillis = micros();          //获取运行时间for(unsigned int m=0;m<10000;m++)  //一个嵌套,消耗CPU时间{for(unsigned int n=0;n<10000;n++){__asm__ __volatile__ ("nop"); //这是一个空指令,但是会花费一个周期去执行}}
//Btime0=micros() - lastMillis;  //计算A到B的执行时间差Serial.print("程序A点运行到B点耗时:  ");Serial.print(time0/1000000);Serial.println("秒"); delay(200);
}
void btn_press()
{Serial.println("按钮被按下!");  
}

测试视频如下:

按钮中断实时性测试

可以看到实时性非常强,基本和按下是同步检测到的!,这就是中断的优势。这也就是为什么用中断的缘故,Arduino的中断相关知识下一篇细讲。

上一篇:Arduino UNO R3自学笔记16 之 Arduino的定时器介绍及应用

下一篇:Arduino UNO R3自学笔记18 之 Arduino的外部中断、定时中断介绍及应用

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

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

相关文章

2024年10月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同 新版题库&#xff1a;单选题40题 多选题20题 注意选项答案顺序不一样&#xff0c;大家记得看选项…

停止模式下USART为什么可以唤醒MCU?

在MCU的停止模式下&#xff0c;USART之类的外设时钟是关闭的&#xff0c;但是USART章节有描述到在停止模式下可以用USART来对MCU进行唤醒&#xff1a; 大家是否会好奇在外设的时钟被关闭的情况下&#xff0c;USART怎么能通过接收中断或者唤醒事件对MCU进行唤醒的呢&#xff1…

SpringGateway(网关)微服务

一.启动nacos 1.查看linux的nacos是否启动 docker ps2.查看是否安装了nacos 前面是你的版本&#xff0c;后面的names是你自己的&#xff0c;我们下面要启动的就是这里的名字。 docker ps -a3.启动nacos并查看是否启动成功 二.创建网关项目 1.创建idea的maven项目 2.向pom.x…

【Python】探索自然语言处理的利器:THULAC 中文词法分析库详解

THULAC&#xff08;THU Lexical Analyzer for Chinese&#xff09;是清华大学开发的一款中文词法分析工具&#xff0c;集成了分词和词性标注两大功能。THULAC 拥有强大的分词能力和高效的词性标注&#xff0c;适用于多种中文文本处理场景。该工具能够在保证高准确率的同时保持较…

计算机网络-系分(5)

目录 计算机网络 DNS解析 DHCP动态主机配置协议 网络规划与设计 层次化网络设计 网络冗余设计 综合布线系统 1. 双栈技术 2. 隧道技术 3. 协议转换技术 其他网络技术 DAS&#xff08;Direct Attached Storage&#xff0c;直连存储&#xff09; NAS&#xff08;Net…

应用于人形手机器人超小型HarmonicDrive哈默纳科减速机

人形手机器人需要高度的精准性和灵活性以完成各种复杂的任务。减速机的应用&#xff0c;为其提供了关键的动力传输和运动控制支持&#xff0c;它能够将电机的高速旋转转换为适合人形手机器人动作的低速高扭矩输出&#xff0c;确保机器人的动作平稳、准确。HarmonicDrive哈默纳科…

HTML粉色烟花秀

目录 系列文章 写在前面 完整代码 下载代码 代码分析 写在最后 系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4

cocos打包后发布web,控制台报错.plist资源下载404

web加载报错 download failed: assets/main/native/0a/0a1a5e41-7d91-4a5d-9552-2c10e5fc5867.plist, status: 404&#xff0c; 应该是MIME属性没有设置允许下载.plist后缀的文件。 对于linux应该改nginx或apache&#xff0c;允许下载该类文件。 我部署在了windows服务器上&am…

基于element+vue,结合el-select,自定义内置筛选框的下拉框组件

基于elementvue&#xff0c;结合el-select&#xff0c;自定义内置筛选框的下拉框组件 效果如下&#xff1a; 代码如下&#xff1a; <template><div class"m-t50 m-l50"><el-select class"phoneAreaCodeSelect" popper-class"selec…

设计模式之门面(Facade)模式

前言 在组建构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题、甚至跟本无法实现。采用添加一层&#xff08;间接&#xff09;稳定接口&#xff0c;来隔离本来互相紧密关联的接口是一种常见的解决方案 定义 “接口隔离” 模式。为子系统中的一组接口提供一个一…

在掌控板中加载人教版信息科技教学指南中的educore库

掌控板中加载educore库 人教信息科技数字资源平台&#xff08;https://ebook.mypep.cn/free&#xff09;中的《信息科技教学指南硬件编程代码说明》文件中提到“本程序说明主要供教学参考。需要可编程主控板须支持运行MicroPython 脚本程序。希望有更多的主控板在固件中支持ed…

【测试类文档整理】软件项目测试方案(word)

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.…

【华为HCIP实战课程一】OSPF相关基础介绍及基础配置,网络工程师必修

一、OSPF介绍 开放式最短路径优先协议OSPF(Open Shortest Path First),IPv4使用的OSPFv2,针对IPv6使用OSPFv3协议。 二、为什么需要OSPF OSPF出现之前,网络广泛使用RIP路由协议,RIP由于最大16跳数限制无法适应大型网络,RIP是基于距离矢量算法的路由协议,应用在大型网…

你以为瀑布流布局很复杂?Vue-Waterfall让你秒变前端高手

你以为瀑布流布局很复杂&#xff1f;Vue-Waterfall让你秒变前端高手 Vue-Waterfall 是一个轻量级的 Vue.js 组件&#xff0c;专为实现灵活的瀑布流布局设计。如果你需要在页面上呈现动态、响应式的布局&#xff0c;那这个组件绝对能帮到你&#xff01;本文将带你快速了解这个组…

开源模型应用落地-模型微调-语料采集-数据核验(三)

一、前言 在自然语言处理(NLP)的快速发展中,语料采集作为基础性的步骤显得尤为重要。它不仅为机器学习模型提供了所需的训练数据,还直接影响模型的性能和泛化能力。随着数据驱动技术的不断进步,如何有效并高效地收集、清洗和整理丰富多样的语料,已成为研究者和工程师们亟…

.Net 基于IIS部署blazor webassembly或WebApi

1.安装IIS(若安装&#xff0c;请忽略) 选择:控制面板–>程序–>程序和功能 选择:启动或关闭Windows功能&#xff0c;勾选相关项&#xff0c;再点击确定即可。 2.安装Hosting Bundle 以.net6为例&#xff0c;点击连接https://dotnet.microsoft.com/en-us/download/dot…

★ C++进阶篇 ★ map和set

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C进阶篇第四章----map和set ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 C基础篇专栏&#xff1a;★ C基础篇 ★_椎名澄嵐的博客-CSDN博…

scrapy 爬取微博(五)【最新超详细解析】: 爬取微博文章

1 读取配置参数 爬取微博文章首先需要读取settings.py中的设置的配置变量&#xff0c;然后编写爬虫&#xff0c;读取的配置变量主要有爬取的关键词、时间范围、爬取区域等。 class WeiboSearchSpider(scrapy.Spider):name weibo_searchallowed_domains [weibo.com]settings…

Windows 环境下 MySQL5.5 安装与配置详解

Windows 环境下 MySQL5.5 安装与配置详解 目录 Windows 环境下 MySQL5.5 安装与配置详解一、MySQL 软件的下载二、安装 MySQL三、配置 MySQL1、配置环境变量2、安装并启动 MySQL 服务3、设置 MySQL 字符集4、为 root 用户设置登录密码 一、MySQL 软件的下载 1、登录网址&#…

基于Springboot+Vue的《计算机基础》网上考试系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…