驅動中的同步互斥阻塞之原子量

2021-07-27 16:36:21 字數 2369 閱讀 7435

1.原子操作

原子操作指的是在執行過程中不會被別的**路徑所中斷的操作

常用原子操作函式舉例

atomic_v  v=atomic_init(0);  //定義原子變數v並初始化為0

atomic_read(atomic_t *v); //返回原子變數的值

void atomic_inc(atomic_t *v);//原子變數增加1

void atomic_dec(atomic_t *v);//原子變數減少1

int atomic_dec_and_test(atomic_t *v);//自減操作後測試其是否為0,為0返回true,否則返回false

範例**如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int key_id;

struct cdev cdev;

dev_t devno;

static atomic_t canopen=atomic_init(1); //定義原子變數,並初始化為1

static declare_wait_queue_head(key_qaq);

/*等待佇列頭*/

/*中斷事件標誌,中斷服務程式將它置為1,read函式將它置為0*/

unsigned int wait_val=0;

struct class *my_class;

static irqreturn_t key_func(int irq,void *dev_id)

static int key_open(struct inode *inode,struct file *file)

request_irq(irq_eint(16),key_func,irqf_trigger_falling,"k1",1);

request_irq(irq_eint(17),key_func,irqf_trigger_falling,"k2",2);

request_irq(irq_eint(18),key_func,irqf_trigger_falling,"k3",3);

request_irq(irq_eint(19),key_func,irqf_trigger_falling,"k4",4);

request_irq(irq_eint(24),key_func,irqf_trigger_falling,"k5",5);

request_irq(irq_eint(25),key_func,irqf_trigger_falling,"k6",6);

request_irq(irq_eint(26),key_func,irqf_trigger_falling,"k7",7);

request_irq(irq_eint(27),key_func,irqf_trigger_falling,"k8",8);

return 0;

}static int key_close(struct inode *inode,struct file *file)

ssize_t key_read(struct file *filp, char __user *buf, size_t size,loff_t *pos)

static unsigned key_poll(struct file *file, poll_table *wait)

static struct file_operations key_fops =

;static int __init key_atomic_init(void)

device_create(my_class, null, devno,null,"key_atomic_driver");

return 0;

}static void key_atomic_exit(void)

module_init(key_atomic_init);

module_exit(key_atomic_exit);

module_license("gpl");

module_author("eight_five");

測試程式如下

#include

#include

#include

#include

#include

int main(int argv,char **argc)

while(1)

close(fd);

return 0;

}

按鍵驅動之原子操作 訊號量 阻塞

include include include include include include include include include include include include static struct class sixthdrv class static struct class...

Linux中的同步技術之互斥量

互斥量從本質上說就像是一把鎖,提供資源的保護訪問,互斥量有兩種狀態,鎖住 lock 與解鎖狀態 unlock 用來保證一段時間內只有乙個執行緒使用該共享資源。互斥量的資料型別為pthread mutex t,如果互斥鎖變數是靜態分配的,那麼一般將其初始化為常值pthread mutex initia...

作業系統中的同步互斥(鎖與訊號量)

作業系統的同步與互斥可以從執行緒和程序兩個角度進行理解。如果從執行緒的角度理解,這裡本文以兩個執行緒為例,需要考慮這兩個執行緒是否屬於同乙個程序,對於不同程序的執行緒來說,它們本質上和從兩個程序的角度進行理解是一樣的,在之後討論兩個程序間的同步互斥時會詳細說明。對於同一程序的兩個執行緒,假設有這樣一...