linux驅動編寫之程序獨佔驅動

2021-10-14 15:45:56 字數 2279 閱讀 9859

一、描述

嵌入式開發系統中,有各種硬體資源,而有些硬體資源使用時候是需要程序獨佔的。也就是說,同一時刻只有乙個程序允許使用這個硬體資源,其他的程序只能放棄執行或者掛起等待。在設計其對應驅動的時候,就需要做獨佔處理。

example:

led燈驅動,4盞led燈,在open的時候呼叫驅動,對其引腳進行配置。如果沒有程序獨佔驅動的處理機制,效果如下:

根據測試結果可以得到結論,呼叫了4次應用程式led_test,每一次呼叫open("/dev/leds", 0),都返回了乙個/dev/leds的fd,fd是相同的,都是3。應用程式led_test的4次執行,都成功得到了執行,程序pid號分別為680、681、682、683。當呼叫open("/dev/leds", 0)時候,對應的就會呼叫驅動的leds_open函式,然後進行4次初始化。

所以要實現只有乙個程序使用該leds驅動,就需要在驅動模組的leds_open函式動手腳,具體實現方法如下。

二、原子操作

1、定義乙個全域性原子變數

static atomic_t open_ability = atomic_init(1);
2、修改drivers_open函式

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

............

}

如果是第一次開啟或者處於關閉之後未開啟狀態,那麼可以開啟,if判斷為false,執行之後的open**段;如果已經開啟了,就不能開啟,返回-ebusy.

3、修改drivers_close函式

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

開啟之後,關閉驅動檔案,就需要釋放open_ability.

4、實現思路總結

通過引入乙個變數open_ability,為硬體驅動設計乙個鎖,只允許乙個程序對其獨佔;當程序使用完驅動之後,就可以釋放這個資源,以提供給其他應用程式來使用。

5、測試效果

可以看到第一次開啟驅動成功,但是第二次開啟驅動失敗了。而且,這種方法實現的效果是,直接由驅動程式返回開啟失敗的訊息-ebusy.

、訊號量--互斥鎖

1、定義乙個互斥鎖,並將互斥鎖初始值設為1

static declare_mutex(leds_lock);  //利用巨集來實現定義,並初始化
2、修改drivers_open函式

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

3、修改drivers_close函式

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

4、實現思路總結

利用互斥鎖,來實現對硬體驅動的獨佔,顯然是很適合的,因為互斥鎖設計的初衷就是來解決這類問題。

5、測試效果

可以看到第一次成功開啟了驅動,第二次進入了不可中斷的休眠狀態。也就是說,當pid號645的應用程式led_test呼叫呼叫open("/dev/leds", 0)時候,驅動程式中的down(leds_lock)令程序進入了不可中斷的休眠狀態,直到第一次執行pid號644的應用程式led_test釋放互斥鎖,才能夠重新得到執行。

備註:stat一欄中的,s代表「休眠狀態」;d代表「不可中斷的休眠狀態」。

6、與原子操作實現的區別

原子操作,當第二次開啟驅動檔案的時候,直接返回-ebusy,也就是說是非阻塞的;而互斥鎖的這種方法,當第二次開啟驅動檔案的時候,由驅動程式中的down()函式迫使程序進入不可中斷的休眠狀態,可以說是阻塞的。

不過,如果將down()函式換成down_trylock()函式,實現的效果也是非阻塞的。

Linux驅動基礎 platform裝置驅動

以高通平台為例,會在kernel arch arm mach msm下的相應的board c檔案裡邊用 dt machine start 這個巨集定義一系列的晶元。以高通8916為例 在kernel arch arm mach msm board 8916.c檔案裡定義了 當然下面使用哪個要看一下。...

linux驅動編寫(音效卡驅動之asoc移植)

linux下面的音效卡驅動很複雜,根本不是一篇部落格能夠說清楚的。所以,本片文章的目的就是讓同學門快速入門。或者,換句話說,它可以幫助大家在基本了解linux音效卡框架的條件下完成音效卡移植工作。1 linux音效卡驅動在哪個目錄 sound 2 oss alsa asoc是什麼關係 oss是最老的...

linux驅動編寫之poll機制

1.poll情景描述 以按鍵驅動為例進行說明,用阻塞的方式開啟按鍵驅動檔案 dev buttons,應用程式使用read 函式來讀取按鍵的鍵值。這樣做的效果是 如果有按鍵按下 了,呼叫該read 函式的程序,就成功讀取到資料,應用程式得到繼續執行 倘 若沒有按鍵按下,則要一直處於休眠狀態,等待這有按...