您好,登錄后才能下訂單哦!
今天有人問我,關(guān)于linux設備驅(qū)動是否使用全局變量的問題,為什么說盡量不使用全局變量?
其實這個問題從兩方面說:
1)使用全局變量,那么破壞了函數(shù)的重入性,為了實現(xiàn)函數(shù)重入,又不得不使用鎖來保護全局變量。這個效率變得低下了。
函數(shù)重入,主要是使用局部變量,即變量放在線程的棧中,各自使用自己的,就不會沖突。另外一種是使用鎖來保護,保證數(shù)據(jù)的完整性。
2)使用全局變量,那么就違背了linux驅(qū)動的編寫原則。即一個驅(qū)動程序應該支持驅(qū)動多個設備同時工作。例如馬達,一個馬達驅(qū)動程序可能同時操作多個馬達,多個軸的方向轉(zhuǎn)動,一個馬達控制一個軸向,例如x軸,y軸,z軸。 如果驅(qū)動程序里使用全局變量來保存設備信息,那么沒法做到同時支持保存多個設備信息了。如果使用鏈表方式,一個鏈表節(jié)點保存一個設備信息,雖然可行,但是每次內(nèi)核操作你的驅(qū)動的api時傳入的struct device(例如struct i2c_client,內(nèi)含了struct device),你不得不遍歷鏈表并比較對象指針才能找到操作的設備的信息。顯然效率低。
所以其實正確的方法是:
在probe時,分配一個私有結(jié)構(gòu)體作為保存此設備的狀態(tài)信息。然后調(diào)用dev_set_drvdata系列函數(shù),把你分配的結(jié)構(gòu)體和probe時傳入的struct device進行綁定。 struct device是總線驅(qū)動在探查到新設備插入時創(chuàng)建的。
后面系統(tǒng)調(diào)用你的驅(qū)動的api函數(shù)時,傳入的struct device,你通過dev_get_drvdata系列函數(shù)取回你的為此設備分配的私有結(jié)構(gòu)體(內(nèi)含具體設備的狀態(tài)信息,例如i2c地址等),從而知道是操作哪個具體設備。
具體請參考我的《linux設備驅(qū)動模型》視頻,
https://edu.51cto.com/course/17159.html
還有我的《如何編寫設備驅(qū)動》或《深入linux內(nèi)核》視頻
https://edu.51cto.com/course/17132.html
https://edu.51cto.com/course/17155.html
另外我的相關(guān)培訓視頻請看:
歡迎觀看我發(fā)布的各個課程: https://edu.51cto.com/lecturer/8896847.html
我的新的更多優(yōu)惠的打包課程鏈接如下:
https://edu.51cto.com/sd/0a9d4
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。