锁 2> 自旋锁

2250阅读 0评论2015-06-14 lsxuan驱动
分类:嵌入式

1> 概述:
                自旋锁:自旋就是当进程不能获得锁时,它会while(1);循环。
                2种方式退出:1》进程时间片消耗完。 2》得到锁。
所以spin lock属于非睡眠锁,可用于中断上下文。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2> 进程间使用:
            1》定义锁:   spinlock_t lsx_lock;
            2》初始化锁:spin_lock_init(spinlock_t  *lock);
            /*定义并初始化*/
            DEFINE_SPINLOCK(lsx_lock)
            3》上锁: spin_lock(spinlock_t  *lock);
            4》开锁:spin_unlock(spinlock_t  *lock);
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

3> 进程与中断间:
     1>> 定义初始化锁:同上。
      2>> 上锁:spin_lock_irqsave(spinlock  *lock,   unsigned long flags);  //用flags保存先前的中断状态, 并关闭处理器所有中断。
/*spin_lock_irqsave()调用了arch_local_irq_save())禁用cpsr 的第i位*/

点击(此处)折叠或打开

  1. static inline unsigned long arch_local_irq_save(void)
  2.   {
  3.           unsigned long flags;
  4.  
  5.           asm volatile(
  6.                   " mrs %0, cpsr   @ arch_local_irq_save\n"
  7.                   " cpsid i"
  8.                  
  9.                   : "=r" (flags)
  10.                   :
  11.                   : "memory", "cc"
  12.         );
  13.           return flags;
  14.   }
       3>> 开锁:void spin_unlock_irqrestore(spinlock_t  *lock,   unsigned  long  flags);    //并开中断
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

4> 中断下半部:
     1>>定义并初始化:同上;
     2>>上锁:void  spin_lock_bh(spinlock_t  *lock);      //只关软件中断,不关硬件中断
     3>>开锁:void  spin_unlock_bh(spinlock_t  *lock);  

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
补充:
         进程上下文:
         中断上下文:
         
          软件中断:
           硬件中断:




上一篇:锁 1>互斥锁
下一篇:时间管理 1> 内核定时器