中断过程简述

一般来说,PC机有两种类型的中断:  
      1.软中断,也称内中断,是由执行某些指令引起的  
      2.硬中断,也称外中断,是由外部接口设备引起的  
  对于软中断,一般是由下列这4种情况引发的:  
      1):DIV或IDIV指令  
            当执行这些除法指令,若除数为0或商溢出,则一定会产生中断,这叫0型中断  
      2):INT指令  
            当执行int   n   时,则产生n型中断  
      3):INTO指令      
            若指令序列执行过程中,前面指令的执行结果使溢出标志位O=1,接着若执行INTO指令,则会引起内  
            部中断,称为4型中断  
      4):单步执行(这就不用说了~~)  
  对于硬中断:  
              80x86有两条中断请求线:非屏蔽中断NMI线和可屏蔽中断INTR线,当这两条线上收到中断请求   信号而引起中断时,称这类中断为硬中断.(NMI线直接接CPU引脚,INTR线接8259A中断控制器)  
      现分述如下:  
      1.非屏蔽中断  
            当NMI线上出现一个由低上跳的高电平中断请求信号后(持续时间须大于两个时钟周期),不管标志 位状态如何,当前指令执行完后,X86CPU马上转入中断处理.  
            此类型中断有三种来源;系统板上RAM产生奇偶错,协处理器上来的中断请求,I/O通道检查出错.  
      2.可屏蔽中断  
              当INTR线上出现一个高电平中断请求信号后(必须保持到当前执行的指令结束为止),CPU是否响   应该中断,取决于标志信I的状态,若I=0,则不响应.(INTR线接8259A中断控制器) 
       硬中断的过程可以简单描述为:
第一步,设备驱动程序通过写设备寄存器(设备控制器用于通信的寄存器)通知设备控制器做什么,设备控制器启动该设备。
第二步,当设备完成工作后,如传送完毕被告之的要读写的字节数量后,使用特定的总线发送信号给中断控制器芯片。
第三步,如果中断控制器已经准备好接收中断(如果忙于更高级的中断就有可能不接收),中断控制器向CPU一个引脚声明。
第四步,中断控制器把设备编号放到总线上,让CPU知道哪个设备完成了工作。
        一旦CPU决定取中断,通常程序计数器(保存下一条指令内存地址)和PSW(程序状态字)等信息被保存(压入堆栈),CPU切换到内核态,设备编号成为部分内存的索引,用于寻找该设备的中断处理程序的地址。这部分内存就是中断向量表。
       中断经常在不合适的时候发生,比如一个中断程序正在执行,CPU有办法禁止中断并在稍后重启。在中断禁止时,任何已经发出中断的设备可以继续保持中断信号,直到再次被启用

### STM32 中断处理过程详解 STM32 的中断处理主要依赖于嵌套向量中断控制器 (NVIC),它是基于 ARM Cortex-M 架构的核心组件之一。以下是关于 STM32 中断处理制的具体说明: #### 1. NVIC 的功能概述 NVIC 是一个专门用于管理异常和中断的硬件模块,它支持多达 68 个可屏蔽中断通道[^1]。这些通道涵盖了多种外设中断源,例如 EXTI(外部中断)、TIM(定时器)、ADC(模数转换器)、USART(串口通信)、SPI 和 I2C 等。 #### 2. 中断优先级配置 每个中断通道都可以通过软件编程分配到 16 个不同的优先级级别中。此外,还可以对优先级进行分组,分为抢占优先级和子优先级两部分。这种分组允许开发者灵活定义哪些中断可以打断当前执行中的中断服务程序 (ISR)[^2]。 - **抢占优先级**:决定某个高优先级中断是否能够打断低优先级中断的服务程序。 - **子优先级**:在同一抢占优先级下的多个中断之间提供更细粒度的选择依据。 #### 3. 中断触发流程 当中断事件发生时,整个处理过程如下: - 当某一外设请求中断时,对应的标志位会被置位。 - 如果该中断未被禁用,并且其优先级高于当前正在运行的任务或 ISR,则 CPU 将停止当前操作并跳转至相应的中断向量表位置。 - 向量表指向具体的 ISR 地址,在这里会调用预先编写好的中断服务函数来完成特定的功能逻辑。 #### 4. 实际应用案例分析 假设存在两个 USART 外设都需要启用其中断功能,但不希望它们互相干扰的情况下,可以通过合理设置优先级实现这一目标。具体做法是将两者置于相同的抢占优先级之下,仅调整各自的子优先级数值。这样即使其中一个设备处于繁忙状态,另一个也不会强行介入从而破坏数据传输完整性。 ```c // 配置 NVIC 优先级分组为 Group 0 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置 USART1 的优先级 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 设置 USART2 的优先级 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级 NVIC_Init(&NVIC_InitStructure); ``` 以上代码片段展示了如何利用 ST 提供的标准库 API 来初始化不同 UART 接口的中断属性。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值