中断线屏蔽与禁用什么区别?

总结自http://bbs.chinaunix.net/thread-3628928-1-1.html


基本上每个CPU在其关键控制寄存器有一位用于控制中断enable/disable

中断禁用,就是把这个bit disable;如果这一bit被清掉了,整个系统中断就不可能发生

中断控制器里有个寄存器叫中断屏蔽寄存器MASK;基本上每一个中断源在MASK寄存器里有一个屏蔽位;如果这一位被设置,这个中断源就被屏蔽了。即使这个中断源产生了有效的中断信号,它也不会被处理。程序运行就不会受这一中断影响


local_irq_disable就是调用的汇编指令 cli,所以是屏蔽中断。(屏蔽当前处理器上的本地中断,会产生中断信号,但不处理
disable_irq是将相应的irq的desc->status |= IRQ_DISABLE, 所以是禁止中断。(关闭指定中断线在所有处理器上的中断,不产生中断信号)

### 挂起寄存器中断屏蔽寄存器的作用及使用方法 #### 中断屏蔽寄存器 (ISER ICER) 中断屏蔽寄存器用于控制特定中断源的使能状态。总共有8个 `uint32` 类型的寄存器,即 `ICER[8]`,用来清除某个中断的使能[^1]。 - **功能描述** - 当写入 `1` 到某一位时,对应的中断禁用;写入 `0` 不会产生任何效果。 - **使用场景** - 如果希望停止响应某一类别的中断请求,则可以通过向相应位置位来关闭这类中断。 ```c // 假设要关闭第5号中断线 NVIC->ICER[0] = (1 << 5); ``` #### 挂起寄存器 (SETPEND CLRPEND) 挂起寄存器负责管理中断的发生否以及手动触发或取消某些中断事件。通过设置 SETPEND 寄存器可以强制产生一次指定编号的异常;反之,利用 CLRPEND 可以撤销已经发生的但还未处理完毕的同类型异常信号[^3]。 - **功能描述** - 对于 SETPEND 来说,当往其中某一位写入 `1` 后,即使当前并没有实际硬件产生的中断请求也会激活相应的ISR(如果该中断未被屏蔽的话)。对于 CLRPEND ,则是将已有的待决状态复位成初始情况。 - **使用场景** - 开发者可以在调试过程中人为制造中断来进行测试验证工作流程是否正常运作;也可以主动清除不再需要继续执行下去的任务队列项。 ```c // 手动触发第7号中断线 NVIC->STIR = 7; // 清除第7号中断线上的挂起状态 NVIC->ICPR[0] = (1 << 7); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值