一、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...