驅動筆記(3)

2021-05-28 10:34:40 字數 2223 閱讀 3992

併發:多個執行單元同時被執行

竟態:併發的執行單元對共享資源(硬體資源或全域性變數等)的共享訪問

通過semaphore機制和spin_lock機制實現

獲取訊號量不成功 該阻塞或者睡眠

1.      定義訊號量  struct semaphore sem;

2.      初始化訊號量  void sema_init(structsemaphore *sem ,int val) 初始化訊號量的初值為val

3.      void init_mutex(structsemaphore *sem)初始化乙個互斥鎖,把sem的值設為1

4.      void init_mutex_locked(structsemaphore *sem) 初始化乙個互斥鎖,把sem的值設為0

定義與初始化工作可由如下巨集一步完成

declare_mutex(name)定義乙個訊號量,並初始化為1

declare_mutex_lock(name)定義乙個訊號量,並初始化為0,為已鎖狀態

5.      獲取訊號量void down(struct semaphore *sem)可能會導致程序睡眠,故不能在中斷上下文中使用,如果sem非負直接返回,否則掛起(task_uninterruptible),不建議使用

6.      void down_interrruptible(structsemaphore *sem)訊號量不可用 ,置為task_interruptible

7.      void down_killable(structsemaphore *sem)訊號量不可用 ,置為task_killable

8.      void up(struct semaphore *sem) 釋放訊號量

自旋鎖不會引起呼叫者的睡眠,執行緒會移植忙迴圈,移植等待下去

1.      spin_lock_init(x)初始化自旋鎖

2.      spin_lock(lock)獲取自旋鎖,不成功自旋在那

3.      spin_trylock(lock)不會一直等待

4.      spin_unlock

訊號量可以有多個持有者(1個互斥訊號量),自旋鎖只有乙個持有者

訊號量適合保持時間較長,自旋鎖適合保持時間較短

ioctl對硬體進行控制(改變波特率,報告錯誤資訊)

使用者使用方法:intioctl(int fd, unsigned long cmd, …) 點表示可選引數

int(*ioctl)(struct inode *inode, structfile *filp, unsigned int cmd, unsigned long arg)

cmd使用者空間傳下來的,arg使用者傳下來的引數

ioctl命令實現方法:1.定義命令  2.實現命令

documentation/ioctl-number.txt定義了使用的幻數

ioctl被劃分為幾個位段,include/asm/ioctl.h定義了這些字段:

1. 型別(幻數):8位寬,屬於哪一類裝置

2. 序號:表明裝置命令的第幾個

3. 傳送方向:可能的值是_ioc_none , _ioc_read, _ioc_write是從應用程式的觀點來看的

4 .引數的大小(資料的型別)

核心提供下列巨集來幫助定義命令

_io(type,nr)沒有引數傳遞

_ior(type, nr, datatype)從驅動中讀資料

_i0w(type, nr, datatype)從資料到驅動

_iowr(type, nr, datatype)type和number成員作為引數被傳遞

ioctl函式的實現 1. 返回值  2. 引數使用  3. 命令操作

通常是個switch語句,不支援的返回 –einval

使用ioctl中的引數:整數可以直接使用, 指標則使用前需進行正確的檢查

引數檢查

不需要檢測的函式:copy_from_user,copy_to_user, get_user, put_user

需要檢測的函式:__get_user,__put_user

int access_ok(int type,  const void *addr, unsingned long size)

第一引數是verify_read或者verify_write, addr是要操作的使用者記憶體的位址,size是操作的長度。access_ok返回乙個布林值:1.訪問沒問題 0. 失敗,如果返回失敗,

則ioctl應當返回-efault. 

LINUX SPI驅動筆記

spi匯流排由miso 序列資料輸入 mosi 序列資料輸出 sck 序列移位時鐘 cs 使能訊號 4個訊號線組成 linux下spi驅動開發 首先明確spi驅動層次,如下圖 我們以上面的這個圖為思路 spi bus spi匯流排對應的匯流排型別為spi bus type,在核心的drivers s...

linux裝置驅動筆記

雖然並不做linux有關的東西,但是記錄下點點滴滴,以備不時之需 驅動程式的編譯 make 驅動程式按模組安裝 inmod ko 執行這個命令之前首先要獲得root許可權,否則會報錯,1 operation not permmitt 檢視模組安裝情況 lsmod 解除安裝相關模組 rmmod 安裝或...

字元裝置驅動筆記

在所有linux裝置驅動中,字元裝置驅動最為基礎,本筆記將講解linux字元裝置驅動的結構,並解釋其主要組成部分的程式設計方法。cdev結構 struct cdev cdev結構體的dev t成員定義了裝置號,為32位,其中12bit為主裝置號,20bit為次裝置號。使用如下巨集可以從dev t獲得...