对内核同步机制的一个疑问
我们用GPIO模拟一段硬件时序时,为了避免时序被中断打断,通常会将中断关闭,等操作完成再打开中断。但在看一些参考书籍的时候说用自旋锁会更好,有的自旋锁接口会关闭中断,即spin_lock_irq()接口,这个接口实现如下:
#define spin_lock_irq(lock) _spin_lock_irq(lock)
static inline void __spin_lock_irq(spinlock_t *lock)
{
local_irq_disable();
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
}
这里不仅关闭了中断,还关闭了内核的抢占功能,在单核的情况下,该书的作为认为实现我说的这个功能不仅要关闭中断,同样需要关闭抢占,我觉得单核情况下关闭中断了就不会出现抢占的情况了,就用local_irq_disable()就可以了,不知道为什么还要再关闭抢占?
luguo
12 years, 6 months ago