IF标志位与中断的关系

在Linux中,中断分类如下:
中断分类

但Linux系统中只有一个中断向量表,所以,在中断类型与中断向量表里中断号的关系如下:

中断向量号中断内容中断类型中断描述符类型
0(0x0)除出错Fault陷阱门
1(0x1)调试Fault/Trap陷阱门
2(0x2)NMI中断Nonmaskable陷阱门
3(0x3)断点Trap系统调用门
4(0x4)溢出Trap系统调用门
5(0x5)边界范围超出Fault系统调用门
6(0x6)无效操作码Fault陷阱门
7(0x7)设备不存在Fault陷阱门
8(0x8)双重出错Abort陷阱门
9(0x9)协处理器段超越Fault陷阱门
10(0xA)无效的任务状态段Fault陷阱门
11(0xB)段不存在Fault陷阱门
12(0xC)堆栈段错误Fault陷阱门
13(0xD)一般保护错误Fault陷阱门
14(0xE)页面错误Fault陷阱门
15(0xF)保留陷阱门
16(0x10)浮点错误Fault陷阱门
17(0x11)对齐检查Fault陷阱门
18(0x12)机器检查Fault陷阱门
19(0x13)SIMD浮点异常Fault陷阱门
20-31保留陷阱门
32(0x20)时钟中断Maskable中断门
33(0x21)键盘中断Maskable陷阱门
34(0x22)连接从芯片Maskable陷阱门
35(0x23)串行口2Maskable中断门
36(0x24)串行口1Maskable中断门
37(0x25)并行口2Maskable陷阱门
38(0x26)软盘驱动器Maskable陷阱门
39(0x27)并行口1Maskable陷阱门
40(0x28)实时钟中断Maskable陷阱门
41(0x29)保留Maskable陷阱门
42(0x2A)保留Maskable陷阱门
43(0x2B)保留Maskable陷阱门
44(0x2C)鼠标口中断Maskable陷阱门
45(0x2D)数学协处理器Maskable陷阱门
46(0x2E)硬盘中断Maskable中断门
47(0x2F)保留Maskable陷阱门
128(0x80)系统调用系统调用门


上表给出的中断描述符类型参考Linux 0.11中的代码。后续Linux版本可能把0x20-0x2f的中断都设为了中断门。

中断门和陷阱门的区别,就在于他们对标志寄存器EFLAGS中的中断允许标志位IF的影响。由中断门描述符执行的中断会复位IF标志(IF=0);而通过陷阱门执行的中断不会影响IF标志。
IF标志复位可以避免其他中断干扰当前中断的处理,而随后的中断结束指令iret会从堆栈上恢复IF标志的原值(IF=1)。
而在代码中,汇编指令cli可以清除IF标志(IF=0),汇编指令sti可以设置IF标志(IF=1)。

经过上述描述,可以看到,如果在软件中清除了IF标志,那么肯定不会触发中断门的中断,那么此时会不会影响陷阱门的中断呢?
根据《Linux内核完全注释》,“EFLAGS中的IF标志不能屏蔽使用INT指令从软件中产生的中断”,“IF标志并不影响发送到NMI引脚的非屏蔽中断,也不影响处理器产生的异常”。

这说明清除IF标志后,可以触发陷阱门的中断(即异常)。

### 正确清除STM32F4定时器中断标志位的方法 对于STM32F4系列微控制器而言,正确管理定时器中断标志位至关重要。为了防止意外的重复触发或丢失事件,每次响应中断服务程序(Interrupt Service Routine, ISR)时应当及时清除相应的中断标志位。 在处理定时器溢出或其他类型的中断之后,可以通过写入特定值到状态寄存器(Status Register, SR)或者事件生成寄存器(Event Generation Register, EGR),以此来清除对应的中断请求标志[^1]。具体来说: - 对于更新事件(即计数器回零),应向`TIMx_SR`寄存器的UIF位置0。 ```c TIMx->SR &= ~TIM_SR_UIF; ``` - 如果涉及到捕获/比较通道,则需针对CCRxIF位执行相同操作,其中x代表具体的通道编号(比如CCR1IF对应通道1)。 另外需要注意的是,在某些情况下可能还需要考虑自动重装载预分频功能的影响;如果启用了该特性,则每当发生一次更新事件后都会重新加载ARR寄存器的内容并重启计数值。因此建议开发者仔细阅读官方文档中关于所使用的定时器模块部分,并根据实际应用场景调整代码逻辑以确保最佳性能表现[^2]。 最后提醒一点,当存在多个不同优先级别的外设共享同一个NVIC线号时,可能会遇到更复杂的情况——例如低级别ISR尚未完成而高级别又产生了新请求。此时应该遵循良好的编程实践原则,合理安排各任务之间的关系以及资源分配策略,从而有效避免潜在冲突的发生[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值