6410之同步互斥阻塞

2021-06-17 23:54:30 字數 2465 閱讀 8793

同步互斥:

目的:在同一時間只有乙個應用程式開啟裝置節點/dev/buttons。linux是乙個多工系統,在讀寫同乙個節點的時候,可能會有多個應用程式。這就需要進行同步操作,保證應用程式的完整執行。

方法1:在linux中使用原子操作:

1. 原子操作

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

常用原子操作函式舉例:

atomic_t 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。

基於之前的**,修改如下:

static atomic_t canopen = atomic_init(1); 

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

printk("buttons_drv_open \n");

request_irq(irq_eint(0),button_irq_handle,irqf_trigger_falling|irqf_trigger_rising, "pad1", &pins_desc[0]);

request_irq(irq_eint(1),button_irq_handle,irqf_trigger_falling|irqf_trigger_rising, "pad2", &pins_desc[1]);

request_irq(irq_eint(2),button_irq_handle,irqf_trigger_falling|irqf_trigger_rising, "pad3", &pins_desc[2]);

request_irq(irq_eint(3),button_irq_handle,irqf_trigger_falling|irqf_trigger_rising, "pad4", &pins_desc[3]);

return 0;

}在釋放的時候:

int buttons_drv_release(struct inode *inode, struct file *file)

現象如下:

方法2:訊號量:

訊號量(semaphore)是用於保護臨界區的一種常用方法,只有得到訊號量的程序才能執行臨界區**。當獲取不到訊號量時,程序進入休眠等待狀態。

定義訊號量

struct semaphore sem;

初始化訊號量

void sema_init (struct semaphore *sem, int val);

void init_mutex(struct semaphore *sem);//初始化為0

static declare_mutex(button_lock);     //定義互斥鎖

獲得訊號量

void down(struct semaphore * sem);

int down_interruptible(struct semaphore * sem);

int down_trylock(struct semaphore * sem);

釋放訊號量

void up(struct semaphore * sem);

**修改如下:

static declare_mutex(button_lock);

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

int buttons_drv_release(struct inode *inode, struct file *file)

現象如下:

執行兩次./synctest &

ps命令:

其中乙個會進行休眠,當前面的synctest結束後,後面的synctest會立即從休眠中喚醒立即執行。

阻塞與非阻塞:

阻塞操作

是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。

非阻塞操作

程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停地查詢,直至可以進行操作為止。

fd = open("...", o_rdwr | o_nonblock);

同步 互斥 阻塞

實現 使驅動程式只能同時被乙個應用程式操作。幕後 m 1 把變數m載入到暫存器 執行暫存器運算,並把運算結果儲存到 把運算結果寫回記憶體 單任務系統 當應用程式open某個驅動時,只需使用乙個全域性變數標記,再有其他應用程式開啟這個驅動時,則直接退出 開啟失敗 多工系統 由於修改變數的值,並不是一步...

linux驅動學習筆記 同步互斥阻塞

linux驅動如果多個程序同時訪問,會導致不可預料的後果,所以需要一些機制來限制這種情況發生 atomic dec and test函式執行的時候,不會跳轉到別的執行緒執行,所以是安全的 1 定義乙個原子變數,並初始化為1 atomic t v atomic init 1 2 原子變數自減1 ato...

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

1.原子操作 原子操作指的是在執行過程中不會被別的 路徑所中斷的操作 常用原子操作函式舉例 atomic v v atomic init 0 定義原子變數v並初始化為0 atomic read atomic t v 返回原子變數的值 void atomic inc atomic t v 原子變數增加...