- 中断屏蔽
local_irq_disable();/* 临界代码*/local_irq_enable();
2.原子操作
整形原子操作:void atomic_set(atomix_t *v,int i) //设置原子变量值为iatomic_t v = ATOMIC_INIT(2); //设原子变量v值为2atomic_read(atomic_t *v);void atomic_add(int i,atomic_t *v) //把原子变量增加ivoid atomic_sub(int i,atomic_t *v)void atomic_inc(atomic_t *v); //原子变量自增void atomic_dec(atomic_t *v); //原子变量自减static atomic_t xxx_mic=ATOMIC(2); //定义原子变量
static int xx_fun(void)
{if(!atomic_dec_and_test(&xxx_mic)){ //测试自减1后是否为0atomic_inc(&xxx_mic); //还原return -EBUSY;}/*临界代码*/return 0;}
3.自旋锁
保证对资源的互斥访问
spinlock_t lock; //定义一个自旋锁spin_lock_init(lock); //初始化一个自旋锁spin_lock(lock); //上锁 获得一个自旋锁//若未获得则一直原地等待spin_trylock(lock); //获得一个自旋锁//若未获得者返回falsespin_unlock(lock); //开锁 释放自旋锁