__disable_irq();
时间: 2024-04-25 20:24:14 浏览: 15
__disable_irq(); 是一个用于禁用中断的函数或宏。在嵌入式系统中,中断是一种机制,允许外部事件或优先级较高的任务中断正在执行的程序。通过禁用中断,可以阻止其他中断干扰当前的程序执行,从而确保某些关键代码的原子性和确定性。
__disable_irq(); 函数或宏的具体实现会根据所使用的嵌入式系统和编译器而有所不同。它可能会关闭所有中断,或者只是禁用特定的中断源。一旦调用了__disable_irq();,中断将被禁用,直到调用了相应的__enable_irq(); 函数或宏来重新启用中断。
需要注意的是,在禁用中断期间,系统将无法响应其他中断请求,包括时钟中断和外部设备的中断。因此,在使用__disable_irq(); 和__enable_irq(); 函数或宏时,需要谨慎处理,确保不会导致系统功能异常或死锁等问题。
相关问题
local_irq_disable irq_disable
local_irq_disable是一个宏定义,用于禁用中断。它的实现代码如下:
```c
#define local_irq_disable() do { raw_local_irq_disable(); } while (0)
#define raw_local_irq_disable() arch_local_irq_disable()
#define arch_local_irq_disable() 与CPU架构有关
```
其中,raw_local_irq_disable()是一个函数,用于具体执行禁用中断的操作。而arch_local_irq_disable()是与CPU架构相关的函数,用于在特定的CPU架构上执行禁用中断的操作。具体的实现代码会根据不同的CPU架构而有所不同。
local_irq_disable的实现代码中,先调用raw_local_irq_disable()函数,然后再调用arch_local_irq_disable()函数。这样的设计是为了将具体的中断禁用操作与CPU架构相关的实现分离开来,提高代码的可移植性。
总结起来,local_irq_disable的实现代码是通过调用raw_local_irq_disable()和arch_local_irq_disable()函数来实现中断的禁用操作。具体的实现代码会根据不同的CPU架构而有所不同。\[1\]\[2\]
#### 引用[.reference_title]
- *1* [local_irq_enable 与 local_irq_disable 不支持嵌套](https://blog.csdn.net/u012385733/article/details/90483495)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* *3* [Linux Kernel中local_irq_enable()和local_irq_disable()的实现](https://blog.csdn.net/weixin_42135087/article/details/123174867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
__set_PRIMASK __disable_irq
__set_PRIMASK和__disable_irq是CMSIS提供的用来操作中断的接口。__set_PRIMASK用于设置PRIMASK寄存器的值,可以用来开启或关闭中断。__disable_irq是调用了__set_PRIMASK来关闭所有中断。通过调用__disable_irq,CPU将不再响应中断请求,但并不会屏蔽中断的触发。如果在关闭总中断后有中断触发,中断标志将被置位。当调用__enable_irq来开启总中断后,之前触发的中断将会立即被处理。要想禁止所有中断,可以对每个模块的中断进行Disable操作,或者通过清除中断标志或清除寄存器状态的方法来达到目的。这样在__enable_irq开启总中断后,MCU就不会响应之前触发的中断了。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [STM32中断相关概念阐述](https://blog.csdn.net/qq153471503/article/details/126177103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [STM32关于开关总中断的问题](https://blog.csdn.net/weixin_42224980/article/details/105654722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]