常用的中断使用和禁止函数如下所示:
void enable_irq(unsigned int irq)
void disable_irq(unsigned int irq)
enable_irq
和disable_irq
用于使能和禁止指定的中断,irq就是要禁止的中断号。disable_irq
函数要等到当前正在执行的中断处理函数执行完才返回,因此使用者需要保证不会产生新的中断,并且确保已经开始执行的中断处理程序已经全部退出。在这种情况下,可以使用另外一个中断禁止函数:
void disable_irq_nosync(unsigned int irq)
disable_irq_nosync
函数调用以后立即返回,不会等待当前中断处理程序执行完毕。上面三个函数都是使能或者禁止某一个中断,有时候我们需要关闭当前处理器的整个中断系统(全局中断),这个时候可以使用如下两个函数:
local_irq_enable()
local_irq_disable()
local_irq_enable
用于使能当前处理器中断系统,local_irq_disable
用于禁止当前处理器中断系统。假如A任务调用local_irq_disable
关闭全局中断10S,当关闭了2S的时候B任务开始运行,B任务也调用local_irq_disable
关闭全局中断3S,3秒以后B任务调用local_irq_enable
函数将全局中断打开了。此时才过去2+3=5秒的时间,然后全局中断就被打开了,此时A任务要关闭10S全局中断的愿望就破灭了,然后A任务就“生气了”,结果很严重,可能系统都要被A任务整崩溃。为了解决这个问题,B任务不能直接简单粗暴的通过local_irq_enable
函数来打开全局中断,而是将中断状态恢复到以前的状态,要考虑到别的任务的感受,此时就要用到下面两个函数:
local_irq_save(flags)
local_irq_restore(flags)
这两个函数是一对,local_irq_save
函数用于禁止中断,并且将中断状态保存在flags
中。local_irq_restore
用于恢复中断,将中断到flags
状态。