嵌入式软件开发学习三:中断

2024-09-03 23:04

本文主要是介绍嵌入式软件开发学习三:中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tips:

        资料来源:[5-1] EXTI外部中断_哔哩哔哩_bilibili

一、什么是中断?

        中断是计算机系统中的一个重要机制,用于在程序执行过程中响应外部事件。中断机制允许CPU暂停当前正在执行的任务,转而处理更高优先级的事件,处理完成后返回到被中断的任务继续执行。这种机制对于提高系统的响应速度和效率至关重要。

        Tips:中断响应是非常快非常迅速的,基本不会影响主程序的正常运行。当然因此中断当中放进延时函数是大忌。

STM32的中断:  

        68个可屏蔽中断通道,包含EXTITIMADCUSARTSPII2CRTC等多个外设。

        使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。

中断可以按照不同的标准进行分类,常见的分类方式如下:

按照来源分类:

  1. 硬件中断(硬中断)

    • 这类中断是由外部硬件设备触发的,例如键盘按下键、磁盘完成读写操作等。
    • 硬件中断通常通过专门的中断控制器管理,并通过中断请求线(IRQ)向CPU发出信号。
    • 硬件中断可以进一步细分为可屏蔽中断(Maskable Interrupts)和非屏蔽中断(Non-Maskable Interrupts)。
      • 可屏蔽中断可以在某些情况下被操作系统禁止或延迟处理。
      • 非屏蔽中断则总是会被立即处理,通常用于紧急情况,如电源故障。
  2. 软件中断(软中断)

    • 软中断是由软件指令触发的中断,如除法错误、非法指令等。
    • 软中断也可以是操作系统为了执行特定任务(如调度进程)而故意触发的。
    • 在某些系统中,软件中断可以用来模拟硬件中断的功能。

按照处理方式分类:

  1. 同步中断

    • 这种中断是在指令执行期间由处理器内部产生的,如算术溢出。
    • 同步中断通常是由于执行了一条特定的指令而引发的。
  2. 异步中断

    • 异步中断可以在任何时刻发生,与当前正在执行的指令无关。
    • 异步中断通常是由外部硬件设备触发的,如定时器中断或外部设备完成数据传输。

中断处理流程:

  1. 中断请求:硬件设备通过中断控制器向CPU发送中断请求。
  2. 中断响应:CPU保存当前上下文(寄存器状态等),并跳转到预定义的中断服务程序。
  3. 中断服务:中断服务程序执行必要的处理,如读取设备状态、更新内存中的数据等。
  4. 中断返回:中断服务程序执行完毕后,CPU恢复被中断前的状态,继续执行原来的任务。

        中断机制是现代操作系统和嵌入式系统的核心部分之一,它使得系统能够高效地处理各种事件和故障,从而保证了系统的稳定性和可靠性。

 中断优先级:

        中断优先级是指在一个系统中有多个中断源时,根据中断的重要程度或紧急程度对其进行排序的一种机制。当多个中断同时发生时,具有较高优先级的中断将被优先处理。中断优先级的管理有助于避免低优先级中断长时间占用CPU资源,从而导致高优先级中断无法及时响应的情况。

中断优先级的实现

  • NVIC (Nested Vectored Interrupt Controller):在ARM Cortex-M系列微控制器中,NVIC控制器负责管理中断优先级。
  • ISR (Interrupt Service Routine):每个中断都有一个对应的中断服务程序,用于处理中断事件。
  • 抢占优先级和响应优先级:在STM32等微控制器中,中断优先级分为抢占优先级和响应优先级两个维度。
    • 抢占优先级决定了中断是否可以打断另一个正在执行的中断服务程序。
    • 响应优先级决定了同优先级中断之间的执行顺序。
  • 优先级分组:可以通过配置NVIC来决定抢占优先级和响应优先级之间的分配比例。

二、NVIC中断优先级管理器

        NVIC (Nested Vectored Interrupt Controller) 是一种嵌套向量中断控制器,它主要用于 ARM Cortex-M 系列微控制器中,负责管理和控制中断请求。以下是关于 NVIC 的一些关键点:

  • 功能: NVIC 负责中断的管理和调度,使得处理器能够响应外部或内部事件而暂停当前的任务,并转去执行相应的中断服务程序(ISR)来处理这些事件。
  • 嵌套: 当一个高优先级的中断请求在另一个中断服务程序执行期间到来时,NVIC 可以安排高优先级中断嵌套到当前正在处理的中断之中,从而提高系统的响应速度。
  • 向量: 每个中断都有一个与之关联的中断向量,这个向量指向中断服务程序的入口地址。当处理器接收到中断请求时,它会根据中断向量跳转到正确的 ISR 地址。
  • 可编程: NVIC 是完全可编程的,可以通过软件配置不同的中断优先级,使某些中断比其他中断更优先得到处理。
  • 数量: NVIC 支持多达 32 个中断源(IRQ[31:0]),每个中断源可以被分配不同的优先级。
  • 优先级: NVIC 支持多个优先级级别,允许开发者根据应用程序的需求来调整中断的响应顺序。

        NVIC 在现代嵌入式系统设计中扮演了重要的角色,因为它可以帮助开发者有效地管理中断,优化系统的实时性能。

NVIC基本结构

NVIC优先级分组 

        NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为n位的抢占优先级4-n位的响应优先级

        抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队

三、EXTI(Extern Interrupt)外部中断

        EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

        支持的触发方式:上升沿/下降沿/双边沿/软件触发

        支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

        通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

        触发响应方式:中断响应(申请中断,让CPU去执行中断函数)/事件响应(中断信号通向外设,触发其他操作,例如ADC转化or DMA等)

四、中断例程

功能效果:

        通过红外反射传感器/红外对射传感器等响应式传感器,触发中断,并执行中断函数。

例程代码:

/*** 函    数:计数传感器初始化* 参    数:无* 返 回 值:无*/
void CountSensor_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		//开启AFIO的时钟,外部中断必须开启AFIO的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB14引脚初始化为上拉输入/*AFIO选择中断引脚*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚/*EXTI初始化*/EXTI_InitTypeDef EXTI_InitStructure;                        //定义结构体变量EXTI_InitStructure.EXTI_Line = EXTI_Line14;					//选择配置外部中断的14号线EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中断线为下降沿触发EXTI_Init(&EXTI_InitStructure);                             //将结构体变量交给EXTI_Init,配置EXTI外设/*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2//即抢占优先级范围:0~3,响应优先级范围:0~3//此分组配置在整个工程中仅需调用一次//若有多个中断,可以把此代码放在main函数内,while循环之前//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		//选择配置NVIC的EXTI15_10线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);                             //将结构体变量交给NVIC_Init,配置NVIC外设
}/*** 函    数:获取计数传感器的计数值* 参    数:无* 返 回 值:计数值,范围:0~65535*/
uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}/*** 函    数:EXTI15_10外部中断函数* 参    数:无* 返 回 值:无* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行*           函数名为预留的指定名称,可以从启动文件复制*           请确保函数名正确,不能有任何差异,否则中断函数将不能进入*/
void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET)		//判断是否是外部中断14号线触发的中断{/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){CountSensor_Count ++;					//计数值自增一次}EXTI_ClearITPendingBit(EXTI_Line14);		//清除外部中断14号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发,导致主程序卡死}
}

这篇关于嵌入式软件开发学习三:中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134297

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来