驅動互斥中斷

2021-07-15 06:33:45 字數 1709 閱讀 3263

互斥機制:

1、遮蔽中斷

2、原子操作

定義原子變數  atomic_t v;

初始化        atomic_t v = atomic_init(0);

操作atomic_t v = atomic_init(1);

open

else

}release

自旋鎖使用:

自旋鎖是忙鎖:系統開銷較大,為了減小系統開銷,需要減少等待時間而減少等到時間的唯一方法就是讓持有鎖的程序盡快釋放鎖,

而想要盡快釋放鎖,臨界區**要短小(執行時間短)

可以用在中斷上下文中

通過關搶占實現:臨界區**中不能有可能引起睡眠的操作

定義 spinlock_t lock;

初始化 spin_lock_init(spinlock_t *);

spin_lock_init(&lock);

加鎖  spin_lock(spinlock_t *);

spin_lock(&lock);

解鎖  spin_unlock(spinlock_t *);

spin_unlock(&lock);

自旋鎖實現訪問控制:

spinlock_t lock;

spin_lock_init(&lock);---->載入函式

int flag = 1;

open

else

}release

對比訊號量                                             自旋鎖

睡眠                                               忙

臨界區可以很大                                     臨界區要小

臨界區可以有可能引起睡眠的操作                     不能有可能引起睡眠的操作

(但盡量避免睡眠引起的死鎖)

不能用在中斷上下文中                               可以用在中斷上下文中

訊號量的使用:

1、定義訊號量

struct semaphore sema;

2、初始化

sema_init(struct semaphore *sema, int val);

sema_init(&sema, 1);

3、p操作

down(struct semaphore *sema);

down_interruptible(struct semaphore *sema);

down_trylock(struct semaphore *sema);

4、v操作

up(struct semaphre *sema);

struct semaphore sema;

sema_init(&sema, 1); ----> 載入函式

open

release

原子操作

原子操作(cont)

自旋鎖自旋鎖(cont)(防止中斷的影響)

讀寫鎖讀寫鎖(cont.)

順序鎖順序鎖(cont)

訊號量的使用:

down_interruptible(struct semaphore *sema) ;

當被其他訊號喚醒的時候返回    

retrun -erestartsys;

互斥體

裝置驅動 中斷

1 關於裝置驅動中的中斷問題 作業系統為了使得快速裝置和慢速裝置合適工作,需要中斷來提高效率,乙個外設要使用乙個中斷就必須註冊中斷號,獲得跟這個中斷號相關的一些資源,並且在中斷發生的時候核心可以進行一些處理,例如 呼叫中斷處理例程來真正的處理裝置中斷。linux處理中斷的方式很大程度上與它在使用者空...

UIO 驅動中斷

uio 是怎麼工作的?乙個裝置驅動的主要任務有兩個 1.訪問裝置的記憶體 2.處理裝置產生的中斷 對於第乙個任務,uio 核心實現了mmap 可以處理物理記憶體 physical memory 邏輯記憶體 logical memory 虛擬記憶體 virtual memory uio驅動的編寫是就不...

驅動中斷程式設計

1.編寫乙個外部中斷 1.獲取外部中斷編號 int gpio to irq unsigned int gpio 功能 通過io口編號轉換成對應的外部中斷編號 引數 gpio 要獲取的io口編號 返回值 成功 中斷編號 失敗 einval 2.註冊中斷函式 int request irq unsign...