中断中的锁不能进入睡眠,所以一般都用自旋锁。
但是在中断中使用自旋锁时,必须禁止当前CPU的其他中断,如可以使用:
spin_lock_irqsave();
//临界区
spin_unlock_irqrestore();
这个自旋锁函数,可以保存进入自旋锁前的当前CPU的中断状态,然后禁止本地中断(local_irq_disable -- 即禁止当前CPU的中断),出临界区之后,又会还原回进入临界区之前的中断状态。
下面这对自旋锁,进入临界区之前,会禁止所有中断,出临界区之后,会使能所有中断。
spin_lock_irq()
// 临界区
spin_unlock_irq()