linux驅動中鎖的使用

2021-08-04 15:33:34 字數 1741 閱讀 2488

一、atomic用法

tp**中每個判斷

irq_enable

的地方全部換成

atomic_cmpxchg

,對比和設值一起做完,避免在

disable

已經判斷完畢,但是還沒給

flag

賦值時,被中斷打斷,再次執行

disable,

中斷函式結束後又執行一次

disable

,每次執行

disable

都會對desc->depth++,

所以連續加兩次。之後

enable++

一次,無法正常使能中斷,

tp失效。

#include

static atomic irq_enabled=atomic_init(0);

void gtp_irq_disable(void)

if(atomic_cmpxchg(&irq_enabled,1,0))//比較「1」和

irq_enabled

的值,如果相等,把「

0」賦值給原子變數,返回

irq_enabled的值

disable_irq(touch_irq);

void gtp_irq_enable(void)

if(atomic_cmpxchg(&irq_enabled,1,0))//比較「1」和

irq_enabled

的值,如果相等,把「

0」賦值給原子變數,返回

irq_enabled的值

enable_irq(touch_irq);

void tpd_irq_registration(void)

atomic_set(&irq_enabled,1);

二、spinlock用法

busy-waiting,鎖定臨界區小,自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是 否該自旋鎖的保持者已經釋放了鎖。(防止被中斷打斷)

更保險的方法或許是先(保守的)使用 mutex,然後如果對效能還有進一步的需求,可以嘗試使用

spin lock

進行調優

#include

static define_spinlock(test_lock);

int init_test_lock(void)

spin_lock_init(&test_lock);

return 0;

}//在自旋鎖使用之前呼叫,可以寫

probe裡

int test(void)

spin_lock(&test_lock);

***xx;

***xx;

spin_unlock(&test_lock);

三、mutex

的用法

mutex是

sleep-waiting,

不會一直等待,程序級別的,程序呼叫時間較長時使用

#include

static define_mutex(text_lock);//在

mutex

中,如果

config_debug_mutexes

定義了,會自動

init

int test(void)

mutex_lock(&test_lock);

************;

************;

mutex_unlock(&test_lock);

Linux驅動 互斥鎖mutex測試

linux驅動 互斥鎖mutex測試 環境 主機 fedora12 目標板 mini6410 目標板linux核心版本 2.6.38 互斥鎖主要函式 建立互斥鎖 define mutex mutexname 加鎖,如果加鎖不成功,會阻塞當前程序 void mutex lock struct mute...

Linux驅動 互斥鎖mutex測試

linux驅動 互斥鎖mutex測試 環境 主機 fedora12 目標板 mini6410 目標板linux核心版本 2.6.38 互斥鎖主要函式 建立互斥鎖 define mutex mutexname 加鎖,如果加鎖不成功,會阻塞當前程序 void mutex lock struct mute...

Linux驅動中定時器的使用

linux timer.h 定義乙個struct timer list的結構體全域性變數,即定時器 static struct timer list buttons timer 初始化該定時器 init timer buttons timer 設定定時器函式,當定時器計數到達時,該函式將被呼叫 bu...