串口中断的相关概念和原理
单片机串口发送中断

单片机串口发送中断
从硬件角度来看,单片机串口发送中断通常是由串口控制器内
部的发送缓冲寄存器为空触发的。
当发送缓冲寄存器为空时,串口
控制器会产生一个中断请求,通知处理器发送操作已经完成。
处理
器在接收到这个中断请求后,会暂停当前任务,执行串口发送中断
服务程序,完成相关的发送完成操作,然后继续执行之前的任务。
从软件角度来看,处理器在接收到串口发送中断请求后,需要
执行相应的中断服务程序来处理发送完成事件。
在中断服务程序中,通常会进行一些清除中断标志、发送下一个数据、更新发送计数器
等操作,以确保串口发送的连续性和正确性。
在实际的应用中,我们需要合理设置串口发送中断的优先级,
确保及时响应发送完成事件,同时不影响其他重要的任务。
另外,
还需要注意处理器在中断服务程序中的执行时间,避免影响实时性
要求较高的系统。
总的来说,单片机串口发送中断是一种有效的处理发送完成事
件的机制,能够提高系统的实时性和并发性。
在使用时,需要充分
理解其工作原理,合理设置中断优先级,编写高效的中断服务程序,以确保系统的稳定性和可靠性。
串口中断的相关概念和原理

串口中断的相关概念和原理一、问题上一篇讲述了串口轮询方式的发送和接收流程和相关寄存器。
通过发送和接收函数的编程实践,我们发现轮询发送和接收时,应用程序需要不停息地轮询:轮询发送缓冲区是否为空可以发送新数据,或者接收缓冲区是否有新数据可接收。
一旦发送轮询中止,发送动作也无法开启;一旦接收轮询中止、或者接收被打断或不及时,新到的大量数据可能因接收缓冲区溢出而遭丢失。
故轮询访问方式只是一种试验性的粗糙访问方式,其适用场景很有限,且占用CPU和应用程序的大量时间、让设备忙得团团转。
要想从容不迫和得心应手地访问串口,还得采用中断方式。
中断机制的采用既是迫不得已的应用需要,也是CPU设计大师们为满足现实需求而积极主动创造发明的一个妙招。
对中断的深入理解直至完美掌控可以说是IT人员绝技中的必备一招,把它掌控好了,就一切如羽扇纶巾运筹于帷幄之中,就可以像浪尖上的弄潮儿一样风里来雨里去流连于浪花里之中蓝天白云之间如庄子一样逍遥;否则,就好比一个人只会紧抱着泳圈在岸边的浑水里趟着和摸着什么;而许多疑难杂症的出现大致都与中断的控制不善有着千丝万缕的干系。
这一篇就讲述串口中断的有关概念和基本原理,但不会涉及具体的操作(留待下一讲)。
这些概念和原理中,有的是串口模块特有的,有的是所有中断模块通用的。
对于我们测试人员来说,深入理解中断的技术细节、概念的来龙去脉、明白其中哪些地方容易出现设计错误,将有助于我们制定更完备的测试方案、牢牢地把控测试重点、恰当分配测试时间和精力、提高测试效率。
二、中断的类型以不同的角度或层次来划分,一个事物的分类就不一样,中断的分类也是如此。
不同体系的CPU技术手册中,对中断的分类均按照有利于自身、与自身的硬件结构相匹配的方式来进行。
这丰富了世界的多样性,却使得很多这个行当里初来乍到的人昏头转向、如理乱麻剪不断理还乱。
而有些行当里,有才能和雄心的管事者们就制定一个本行当的标准,以避免或结束混乱局面。
python 串口 中断方式

python 串口中断方式摘要:一、引言二、Python串口通信原理1.查询方式2.中断方式三、Python实现串口中断方式通信1.硬件配置2.软件实现3.实例演示四、中断方式的优势与不足1.优势2.不足五、总结正文:一、引言在Python编程中,串口通信是一种常用的通信方式。
通常,我们可以通过查询或中断方式来实现串口通信。
本文将主要介绍如何使用中断方式实现Python串口通信,并讨论其优势和不足。
二、Python串口通信原理2.1 查询方式查询方式是通过不断地轮询设备的状态来获取数据。
在串口通信中,查询方式需要不断地检查串口缓冲区是否有新的数据。
这种方式较为简单,但效率较低,适用于数据传输较为简单的情况。
2.2 中断方式中断方式是当有数据到达串口时,处理器自动触发中断,从而实现数据的接收。
相比于查询方式,中断方式更加高效,适用于实时性要求较高的场景。
三、Python实现串口中断方式通信3.1 硬件配置要实现串口中断方式通信,首先需要配置硬件设备。
例如,可以使用Python库`pySerial`来连接串口硬件。
此外,还需要配置中断引脚,以便在有数据到达时触发中断。
3.2 软件实现接下来,我们需要编写软件程序来实现中断服务函数。
在中断服务函数中,我们可以读取串口缓冲区的数据,并进行相应的处理。
同时,需要设置触发中断的条件,例如当有数据到达或串口空闲时触发中断。
3.3 实例演示以下是一个简单的Python串口中断方式通信实例:```pythonimport serialimport timeser = serial.Serial("COM3", 9600, timeout=1)def interrupt_handler(ser):data = ser.readline().strip()print("Interrupt triggered, received data:", data)ser.set_interrupt_handler(interrupt_handler)while True:time.sleep(1)```在这个实例中,我们设置了一个中断服务函数`interrupt_handler`,当有数据到达时,该函数会被自动调用。
串口dma空闲中断 处理数据

串口dma空闲中断处理数据串口(Universal Asynchronous Receiver/Transmitter,简称UART)是一种常见的串行通信接口。
DMA(Direct Memory Access,直接内存访问)是一种数据传输方式,它可以在CPU的参与下完成数据传输。
DMA空闲中断是指在DMA传输完成后触发的中断,用于处理接收到的数据。
本文将介绍串口DMA空闲中断的原理、应用场景以及实现方法。
一、串口DMA空闲中断的原理在传统的串口通信中,数据的接收通常由CPU轮询方式完成。
即时数据到达,CPU也需要花费较多的时间才能处理。
而在高速数据传输的场景下,这种方式可能导致数据丢失或者延迟较高。
为了解决这个问题,可以使用DMA方式进行数据传输。
DMA是一种通过DMA控制器来完成数据传输而无需CPU参与的方式。
DMA控制器可以直接从外设读取数据,并将数据存放到内存中,或者直接从内存中取数据,并发往外设。
串口DMA空闲中断的原理是基于DMA传输的方式实现的。
当串口接收到数据后,DMA控制器会将数据从串口缓冲区读取,并存储到内存中。
当DMA传输完成后,会触发一个空闲中断,通知CPU接收完成。
CPU可以在这个中断中处理接收到的数据。
二、串口DMA空闲中断的应用场景串口DMA空闲中断适用于高速数据传输的场景,比如串口通信中的大数据传输、高速数据采集等。
在串口通信中的大数据传输场景中,传统的CPU轮询方式可能导致接收到的数据丢失或者延迟较高。
使用串口DMA空闲中断可以提高数据传输的效率和稳定性。
在高速数据采集场景中,传感器数据的采集频率可能很高,传统的CPU轮询方式处理数据可能无法满足实时性的要求。
使用串口DMA空闲中断可以提高数据采集的效率和准确性。
三、串口DMA空闲中断的实现方法实现串口DMA空闲中断的方法如下:1. 配置串口DMA传输。
首先,需要提前配置好串口的波特率、数据位、停止位、校验位等参数。
串口接收回中断调函数

串口接收回中断调函数串口接收回中断调函数是一种常见的嵌入式系统编程技术,它可以在接收到串口数据时自动触发中断,从而实现对数据的快速处理。
在本文中,我们将介绍串口接收回中断调函数的基本原理和使用方法,帮助读者更好地理解和应用这一技术。
我们需要了解什么是中断。
中断是一种硬件或软件机制,用于在计算机执行过程中暂停当前任务,转而执行另一个任务。
中断可以分为硬件中断和软件中断两种类型。
硬件中断是由外部设备触发的,例如串口接收数据、定时器到达等;而软件中断则是由程序内部触发的,例如系统调用、异常处理等。
在嵌入式系统中,串口接收回中断调函数通常是由硬件中断触发的。
当串口接收到数据时,硬件会向CPU发送一个中断请求,CPU会暂停当前任务,转而执行中断服务程序。
中断服务程序是一段特殊的代码,用于处理中断请求。
在串口接收回中断调函数中,我们可以读取串口接收缓冲区中的数据,并进行相应的处理,例如解析数据、存储数据等。
下面是一个简单的串口接收回中断调函数的示例:void USART1_IRQHandler(void){if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){// 读取串口接收缓冲区中的数据uint8_t data = USART_ReceiveData(USART1);// 进行数据处理// ...}}在上面的代码中,我们使用了STM32的标准库函数来实现串口接收回中断调函数。
首先,我们通过USART_GetITStatus函数判断是否接收到了数据。
如果接收到了数据,我们就使用USART_ReceiveData函数读取数据,并进行相应的处理。
需要注意的是,串口接收回中断调函数需要在初始化时进行配置。
具体来说,我们需要设置串口的中断使能位,以及中断优先级等参数。
在STM32中,可以使用以下代码来配置串口接收回中断:NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);在上面的代码中,我们使用了NVIC_Init函数来配置串口接收回中断。
gd32f4 串口空闲中断问题

串口空闲中断是指当串口接收完一帧数据后,数据线上无数据时产生的中断。
在GD32F4系列的微控制器中,我们可以利用串口空闲中断来实现高效的数据接收和处理。
本文将详细介绍GD32F4串口空闲中断的原理和使用方法。
1. 串口空闲中断原理在串口通信中,数据通过数据线上的高低电平传输。
当数据传输完成后,数据线会保持在一个稳定的电平上,即称为“空闲”状态。
GD32F4系列的串口模块可以通过检测数据线上的电平变化来判断数据的传输状态,并在数据传输完成后产生空闲中断。
串口空闲中断的产生流程如下: 1. 数据接收开始后,串口模块会不断检测数据线上的电平变化。
2. 当连续一段时间内数据线上保持空闲状态时,串口模块会判断数据传输完成,并产生空闲中断。
3. 空闲中断会唤醒中断服务程序,用户可以在中断服务程序中对接收到的数据进行处理。
2. GD32F4串口空闲中断配置为了使用串口空闲中断功能,我们需要进行以下配置:2.1 使能串口空闲中断首先,我们需要在NVIC中使能串口空闲中断。
在NVIC中有一个USART1_IRQn的中断向量,我们要将其使能。
NVIC_EnableIRQ(USART1_IRQn);2.2 配置串口空闲中断使能位其次,我们需要在串口模块中配置空闲中断使能位。
对于GD32F4系列的UART模块,我们可以通过设置USART_CTL0寄存器中的IDLEIE位来使能空闲中断。
USART_CTL0(USART1) |= USART_CTL0_IDLEIE;2.3 编写串口空闲中断服务程序当串口产生空闲中断时,中断服务程序会被调用。
我们需要编写中断服务程序来处理接收到的数据。
void USART1_IRQHandler(void){if(USART_INT_FLAG(USART1, USART_INT_FLAG_IDLE) != RESET){USART_ClearFlag(USART1, USART_INT_FLAG_IDLE); // 清除空闲中断标志位// 数据处理逻辑}}3. 使用串口空闲中断实现高效数据接收通过以上配置,我们可以使用串口空闲中断来实现高效的数据接收。
51单片机串口中断原理

51单片机串口中断原理51单片机是一种非常常见的单片机,它的串口中断功能也是非常重要的。
本文将介绍51单片机串口中断的原理。
串口中断是指当串口接收到数据时,单片机会自动中断当前的程序,转而去执行串口中断服务程序。
这样可以避免程序一直等待串口接收数据,浪费CPU资源。
在51单片机中,串口中断可分为接收中断和发送中断。
接收中断是指当串口接收到数据时,单片机会自动中断当前程序,转而去执行串口接收中断服务程序。
发送中断则是在发送数据时,当数据发送完成后,单片机会自动中断当前程序,转而去执行串口发送中断服务程序。
在使用51单片机进行串口通信时,首先需要设置串口的波特率、数据位、停止位和校验位等参数。
然后需要开启串口中断,并编写相应的串口接收和发送中断服务程序。
串口接收中断服务程序通常包括以下步骤:1. 判断是否接收到数据2. 读取接收缓冲区中的数据3. 处理接收到的数据4. 清除接收中断标志位串口发送中断服务程序通常包括以下步骤:1. 判断是否发送完成2. 将下一个数据发送到发送缓冲区3. 清除发送中断标志位需要注意的是,在编写串口中断服务程序时,需要将其放在特定的地址处,并使用特定的关键字进行声明。
具体的实现方法可以参考51单片机的相关手册和资料。
除了使用串口中断进行数据传输外,还可以使用定时器中断来完成一些周期性任务。
例如,可以使用定时器中断来实现定时发送数据、定时检测传感器等功能。
总之,51单片机串口中断是一种非常重要的功能,可以大大提高单片机的性能和效率。
掌握了其原理和实现方法,可以使我们更加灵活地应用51单片机进行各种任务。
串口中断原理

串口中断原理
串口中断是一种硬件中断,用于处理串口数据传输时的事件。
当串口接收到新的数据时,会触发中断信号,使控制器立即停止当前任务,转而执行中断服务程序。
中断服务程序的目的是读取接收缓冲区中的数据,并对其进行处理。
在串口通信中,发送方会将数据按照一定的格式发送给接收方。
接收方通过串口接收数据,并将其存储在接收缓冲区中。
当接收缓冲区中有新的数据到达时,串口控制器会产生一个中断请求,通知处理器执行中断服务程序。
中断服务程序首先会读取接收缓冲区中的数据,并对其进行处理。
处理的方式可以根据具体应用需求而定,例如检查数据的正确性、进行数据解析等。
处理完成后,中断服务程序可以将数据送往其他模块进行进一步处理,或者将处理结果返回给发送方。
中断服务程序执行完成后,控制权会返回到之前被中断的任务上。
通过使用中断,可以使处理器能够即时响应串口数据的到达,提高系统的实时性和数据的可靠性。
总之,串口中断是一种通过硬件中断机制实现的串口数据传输处理方式。
通过中断服务程序的执行,可以及时处理接收到的串口数据,提高系统的并发性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串口中断的相关概念和原理一、问题上一篇讲述了串口轮询方式的发送和接收流程和相关寄存器。
通过发送和接收函数的编程实践,我们发现轮询发送和接收时,应用程序需要不停息地轮询:轮询发送缓冲区是否为空可以发送新数据,或者接收缓冲区是否有新数据可接收。
一旦发送轮询中止,发送动作也无法开启;一旦接收轮询中止、或者接收被打断或不及时,新到的大量数据可能因接收缓冲区溢出而遭丢失。
故轮询访问方式只是一种试验性的粗糙访问方式,其适用场景很有限,且占用CPU和应用程序的大量时间、让设备忙得团团转。
要想从容不迫和得心应手地访问串口,还得采用中断方式。
中断机制的采用既是迫不得已的应用需要,也是CPU设计大师们为满足现实需求而积极主动创造发明的一个妙招。
对中断的深入理解直至完美掌控可以说是IT人员绝技中的必备一招,把它掌控好了,就一切如羽扇纶巾运筹于帷幄之中,就可以像浪尖上的弄潮儿一样风里来雨里去流连于浪花里之中蓝天白云之间如庄子一样逍遥;否则,就好比一个人只会紧抱着泳圈在岸边的浑水里趟着和摸着什么;而许多疑难杂症的出现大致都与中断的控制不善有着千丝万缕的干系。
这一篇就讲述串口中断的有关概念和基本原理,但不会涉及具体的操作(留待下一讲)。
这些概念和原理中,有的是串口模块特有的,有的是所有中断模块通用的。
对于我们测试人员来说,深入理解中断的技术细节、概念的来龙去脉、明白其中哪些地方容易出现设计错误,将有助于我们制定更完备的测试方案、牢牢地把控测试重点、恰当分配测试时间和精力、提高测试效率。
二、中断的类型以不同的角度或层次来划分,一个事物的分类就不一样,中断的分类也是如此。
不同体系的CPU技术手册中,对中断的分类均按照有利于自身、与自身的硬件结构相匹配的方式来进行。
这丰富了世界的多样性,却使得很多这个行当里初来乍到的人昏头转向、如理乱麻剪不断理还乱。
而有些行当里,有才能和雄心的管事者们就制定一个本行当的标准,以避免或结束混乱局面。
51系列(如A T89C51)的8位单片机中,只是简单地将中断分为片内中断和片外中断两种,片内中断又仅包括两路定时器中断和一路串口中断。
51系列单片机曾经如日中天、不可一世,却已是这一时代的遗老遗少,在此就一笔带过。
这里重点讲述S80CPU ZA9L0的中断分类。
ZA9L0使用的是ARM9处理器(由英国ARM公司提供),该处理器文档将我们通常所称的中断命名为exception(异常),而不是interrupt。
我们还是以常规的“中断”来称呼吧。
该处理器将中断划分成如下7类:1.复位硬件复位引起的中断,用于系统重启。
2.数据中止(Data Abort)非法访问不允许访问的地址或者非对齐的地址时,就产生该中断。
所谓不允许访问的地址,是指MMU配置表中未列出的供当前模式访问的地址区间。
非对齐的地址,是针对短整数和长整数而言的地址。
ARM规定,短整数(2字节)应从2的整数倍位置开始存取,长整数(4字节)应从4的整数倍位置开始存取。
3.快速中断请求(FIQ,Fast Interrupt Request)用于发起比IRQ能得到更快响应的中断请求。
ARM规定,系统中最多只为一个模块开这样的小灶。
FIQ由谁来触发呢?这是可以设定的,即可软件配置从32个触发通道中的某一个来触发,例如:定时器0通道。
4.中断请求(IRQ,Interrupt Request)用于发起常规的内部设备或外部设备的中断请求,它是我们最需要关注的一类中断。
由于总线宽度是32位,很自然地,最多可支持固定的32个通道的子中断请求。
请注意,这里说的是32个通道/channel。
由于单个GPIO中断通道(GPIO0A~GPIO2B)是很多口线合用的中断,即多个模块可合用一个GPIO中断通道,故实际的最大中断源模块个数大于32。
除IC卡以外的常见模块(如:串口、定时器、打印机、MODEM、以太网控制器)的中断都包含在这一中断类型中。
ZA9L0的32种IRQ中断列示如下:图1:ZA9L0的32种IRQ 中断在上面的表格中,能看到9个定时器中断(TM0~TM8)、三个串口中断(UART0~UART2),却没有看到打印机、MODEM 、以太网控制器等模块的中断。
这三个模块难道不需要中断吗?其实,这三个模块的中断主要是以GPIO (GPIO0A ~GPIO2B )的形式存在的,根据实际的硬件连接对应到相应的GPIO 端口上。
此外,这些模块还同时使用到了定时器中断,这也是ZA9L0大手笔地设计了9个定时器中断的原因。
由于GPIO 中断是很多口线合用的中断、不像各定时器中断均是独用的中断,串口中断还可进一步细分为发送中断、接收中断、状态中断等,其它子中断也可能有类似细分,故从IRQ 来看,ARM 的中断层次最多分为三层。
每一层均可再进行分类。
图2:IRQ 的三个中断层次示意图 复位 IRQ FIQ ...... TMR0 UART0GPIO1A GPIO1发送中断 ......接收中断状态变化中断5.预取指中止(Prefetch Abort)当程序带错误运行时,就可能因预取指地址非法而出现预取指中止的错误和中断。
因ARM取指是采用流水线的机制,所以取指都是比实际运行超前几条指令的预取指。
6.未定义指令当程序带错误运行或故意执行ARM未定义或不能处理的机器指令时,就可能或必定出现未定义指令的错误和中断。
7.软中断(SWI,Software Interrupt)软中断是非常实用和重要的一个中断。
软中断基本上被众多API函数用来进行安全、受限、可控的系统调用,从而间接地、有限度地访问CPU内核资源(如:各种模块的内部寄存器、核心内存)。
故,有些CPU直接将这种中断命名为SysCall,即系统调用。
发起软中断的各API函数,在发起该中断之前,需要在系统约定的内存区域填写上API编号以及对应入口参数;接着,就通过一条asm("SWI")的嵌入式汇编指令触发一次软中断;CPU硬件探测到软中断后,就调用软中断服务例程。
在软中断服务例程中,先到约定的内存区域读取请求相关信息:是哪个API请求、它的参数是哪些。
再携着这些参数调用相应模块的API服务函数。
最后,软中断执行完毕,程序返回到之前系统调用处的下句继续执行。
这7类中断的划分,是第一层次上的划分,不仅是逻辑概念上的划分,更是硬件结构上的划分;后面将要看到:ARM的硬件中断向量表中有7行,每行即对应各个中断的入口代码。
当出现数据中止、预取指、未定义指令等中断时,相应的中断服务程序可通过串口、屏幕等输出断点信息(如:断点地址、断点指令、断点工作模式、有关变量等),以便分析和追踪出错原因。
三、中断的并发、嵌套与优先级单个中断的响应过程有些中断是应用程序通过API有意发起的,如:软中断、串口的发送中断,发起后CPU 将跳转到相关中断服务程序中运行;更多的中断不是应用程序直接发起的,而是人机接口、某些模块或外部设备触发的。
中断触发后,CPU一旦执行完当前的机器指令,就开始从软硬件上响应该中断。
先是硬件上的响应(由ARM内核自动完成):1.保存断点地址到专用的断点寄存器中。
2.保存CPU的断点状态到专用的状态备份寄存器中。
3.切换到中断模式;对于IRQ、FIQ来说,还要关闭相应IRQ或FIQ总中断控制位(位于状态寄存器中)。
4.固定地跳转到相应的中断服务程序首句。
之前总结了第一层次上ARM共有7类中断,“固定地”意味着每类中断都规定着一个唯一的中断服务程序首句地址,不可由软件来重设置和更改,该地址上只能存放相应中断服务程序的首个语句,不能作其它任何用途。
这一点是ARM CPU的特有固定规则。
这个中断向量表的地址列示如下:图3:ARM中断向量表可见,中断向量表是从0地址开始顺序存放的,有7个可用的,另外1个保留未用的。
特别提请注意和区别,ARM的中断向量表中不像其他CPU那样是存放中断服务程序的入口地址,而是存放的语句;由于对每个中断均只有一个语句的空间,不可能把中断服务程序的整体放进来,故存放的语句只能是跳转语句。
例如,复位中断对应的汇编语句为:LDR PC, ResetHandler这句话等同于C语言中的:ResetHandler();其中,ResetHandler()是复位中断的服务函数名。
接着,软件上的响应即是中断服务程序的执行过程,一般有如下内容:1.对于IRQ来说,打开相应IRQ总中断控制位(位于状态寄存器中),便于更高子优先级的IRQ中断能被响应。
对于FIQ来说,在该服务期间相应FIQ总中断控制位一直处于关闭状态、不会打开。
2.执行数据的搬移,操作对象为:数据缓冲区、模块寄存器等。
3.对于IRQ和FIQ来说,响应和确认中断,以便从中断控制器中解除该中断的挂置(Pending)状态、确定本次中断服务结束。
4.从中断服务中跳回到断点。
对于FIQ来说,相应FIQ总中断控制位会同时被复原和打开。
●并发中断的响应对于任何CPU来说,可以执行的最小指令单位是一条机器指令,机器指令好比一个原子,不可再切分,即使中断也无法切分它。
这意味着,中断可以切割和打断一个进程的执行、一个函数的执行、一条高级语言语句的执行,但是,当一条机器码正在执行时,中断也只能眼睁睁地等着它执行完毕后才能被响应。
在CPU执行一条机器码的期间,也许有两个中断源先后(例如相差0.5个纳秒)触发了中断,我们认为这样的两个中断源相对于一个机器指令的整体来说是并发的。
ARM规定,对并发的中断先响应固定级别更高的中断。
以下是ARM规定的优先响应级别(从高到低排列):图4:ARM的固定中断优先级这里,7种中断只有6个优先级,是因为未定义中断和软中断是不会同时发生的中断。
●中断的抢占与嵌套当一个中断正在响应尚未结束时,另一个中断是否可被响应?注意,这里仅从第一层为着眼点来考虑。
有如下两种情况需要考虑:⏹不同中断源一个中断正响应时,另一不同的中断是否可被响应?按照上述图3所示的优先级,一个中断响应时,另一更高优先级的中断会被响应,而同等和更低优先级的中断不会被响应。
例如:IRQ(优先级4)中断期间,FIQ中断(优先级3)可被响应,而软中断(优先级6)却不会被响应。
这种更高优先级的不同中断打断更低优先级中断的执行,称为中断的抢占。
同一中断源一个中断正响应时,同一中断是否可再被响应?对于7种中断中除IRQ和FIQ之外的其它5种中断,正响应时,同一中断源不会再引起触发。
对于IRQ,由于它包含32个通道的子中断请求、且这些子中断也有优先级,故在相应IRQ总中断控制位被开启后,更高优先级的子中断会被响应、同等和更低的不会被响应。
对于FIQ,由于它只能包含1个通道的中断请求,故只有在该中断被响应和确认且FIQ 总中断控制位被开启后,同一FIQ中断才能再被响应。