實現
使驅動程式只能同時被乙個應用程式操作。
幕後:m+1
①把變數m載入到暫存器
②執行暫存器運算,並把運算結果儲存到
③把運算結果寫回記憶體
單任務系統
當應用程式open某個驅動時,只需使用乙個全域性變數標記,再有其他應用程式開啟這個驅動時,則直接退出(開啟失敗)。
多工系統
由於修改變數的值,並不是一步到位的,而是需要使用多個指令,才能完成最終的操作;
在多工系統中,實現使驅動程式只能同時被乙個應用程式操作的方法:原子操作、訊號量
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。
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);
3. 阻塞
阻塞操作
是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。
被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。
非阻塞操作
6410之同步互斥阻塞
同步互斥 目的 在同一時間只有乙個應用程式開啟裝置節點 dev buttons。linux是乙個多工系統,在讀寫同乙個節點的時候,可能會有多個應用程式。這就需要進行同步操作,保證應用程式的完整執行。方法1 在linux中使用原子操作 1.原子操作 原子操作指的是在執行過程中不會被別的 路徑所中斷的操...
linux驅動學習筆記 同步互斥阻塞
linux驅動如果多個程序同時訪問,會導致不可預料的後果,所以需要一些機制來限制這種情況發生 atomic dec and test函式執行的時候,不會跳轉到別的執行緒執行,所以是安全的 1 定義乙個原子變數,並初始化為1 atomic t v atomic init 1 2 原子變數自減1 ato...
NIO同步阻塞與同步非阻塞
io與nio區別 其本質就是阻塞和非阻塞的區別。阻塞概念 應用程式在獲取網路資料的時候,如果網路傳輸資料很慢,就會一直等待,直到傳輸完畢為止。非阻塞概念 應用程式直接可以獲取已經準備就緒好的資料,無需等待。io為同步阻塞形式,nio為同步非阻塞形式,nio並沒有實現非同步,在jdk1.7公升級nio...