嵌入式驱动自学者的亲身感受,有什么建议?
點擊下方卡片,關注公眾號
ID:技術讓夢想更偉大
整理:李肖遙
嵌入式驅動自學者的感受
?
學習嵌入式,或者說學習現代的計算機編程,如果你想學好,有一個比較要求,那就是你能接受它的設定、它的模式。反過來說,當你真正接受它的設定、它的模式,并記住它們時,我認為,你已經學好了。
?
昨天,我又置之死地而后生了一次。最近一直在搞驅動,一個LCD驅動搞得我幾乎要放棄繼續走嵌入式這條路。昨夜,睡不覺,打開嵌入學習視頻,躺在已關燈很久的房間的床上,大概凌晨3,4點吧。之前我一直都是學習著驅動自編源碼的教學,是那種幾乎和裸板程序沒多大區別的編程方式,只是多使用了一些向內核注冊的接口函數。
?
而最近我想換一下,因為很多設備驅動,內核都是自帶的,而且是各種平臺的設備驅動都有,我想如果能熟悉掌握內核自帶驅動的編程,那以后要做某個設備的驅動時,我只需要在自帶驅動中修改一下便好了,通過學習LCD平臺設備的驅動,我了解了其編程想法,同時也認同這種想法,甚至讓我疑惑,學習資料中教自編驅動的意義,為何不直接教如果修改內核源碼驅動?
?
于是,繼續按著書去修改內核驅動源碼,但問題是,書中說他們這種修改,代碼成功運行了,但我這,無論怎么調試都失敗,我反復檢測,我的修改是否與書中一致,檢測了很多遍依然沒發現哪一步不同,不過,有一點發現是,書中的內核源碼和我內核使用的源碼有一點點區別(當然書里并沒有把所有的源碼都貼上,只是修改部分附近會聯帶著一些,這就是發現,這些聯帶的沒需要修改的源碼和我的源碼有點區別,比如,我的源碼中多了一些設置(看似無關緊要的設置))。
?
與書核對無誤但失敗后,我又與成功運行的自編驅動核對,我陸續發現我修改的內涵源碼中,沒有去啟動設備,也更沒有去點亮背光,而在顯存分配后的寄存器設置似乎也有問題,因為這里的地址使用各種宏定義不同的累加或計算,最后算得地址和我的寄存器地址也不知是否吻合,因為驅動源碼中最后計算得到的是虛擬地址。于是我對比自編驅動,一點點修改嘗試,到睡覺前都沒成功。
?
我是想學得理直氣壯一點的,最后是能一眼就能找到問題,并迅速輕松解決問題的,我也承認自己確實是有些浮躁。但是經過了昨晚床上的一點絕望的思考掙扎后,我好像想通了:為什么嵌入式學習視頻老師要教自編驅動。
?
下面我說下自編驅動與內核驅動源碼各自的問題:
自便驅動:
程序簡單簡潔,它只能驅動特定的某個設備。如果設備換了需要支持另一款設備,那么你需要重新修改該驅動;如果需要系統同時支持兩種LCD,那么它就會變成復雜并且對于內核驅動的簡潔優勢會削弱不少;如果你想驅動支持多種設備,那自編驅動,相對了內核驅動源碼的簡潔優勢會變成了劣勢,因為編程思想的適用范圍不同而產生的結果。
內核自帶驅動源碼:
?
①從系統層次去考量,變量、宏定義使用多,甚至有些宏定義的值為了方便能讓各種在不同的階段需要不同的值調用,把簡單的一個賦值調用變成了需要進行多次運算才能檢測到該值是否滿足使用要求,因為我們不是該驅動的編碼者,不清楚這樣做的好處,也或許是內核驅動源碼的開發者從整個系統的編程簡潔性去考量,這樣做或許也是為了讓整個系統代碼更少,簡潔的一種做法,因為每個設備你都給它賦具體的值的話,整個系統中有幾百種驅動設備源碼,給所有設備的這個位置參數都賦一個值的話,那各設備關于這個值的代碼就要多了幾百行了,所以還不如,讓各設備根據各種平臺去對某個宏進行各自的計算來得到合適的值,但某些計算中相同的算法的也整合在一起,這樣就減少了系統不少行代碼。所以系統中驅動源碼是系統開發者對系統源碼的整合,是基于系統層的整合。所以,對于我這種對單個設備驅動編碼的人,就會覺得系統源碼有好多不人性化的地方,會覺得簡單的地方也被弄得很復雜。
?
②內核自帶驅動還有一些代碼是為了兼容以前的版本而添加了,比如以前硬件內存資源稀少,需要使用調色板的方法來減少程序運行時的內存使用量,這也會真假代碼的復雜性,這一步雖不是必要的,但如果沒弄好,那LCD驅動也不能正常使用。
?
③程序復雜,為了適用在多種設備型號,更簡單地添加不同型號的設備驅動,內核對驅動抽象分離,把驅動分為平臺管理部分,驅動代碼部分(與硬件無關碼),和設備代碼部分(硬件相關代碼)。用戶添加新型號設備驅動時,只需要在平臺管理部分檢查添加設備的匹配信息,和提供一個硬件設備相關的代碼(有格式)文件即可。
?
現在,站在驅動開發者而非系統開發者的角度去衡量。
?
①自編的驅動,簡潔,要點明確。這個對于驅動開發者的用處就是:無論你使用的是哪個版本的內核,哪個芯片平臺,你可以通過自編碼比較簡單方便地就可以確認硬件設備的情況,是否正常。如果自編碼通過,那可以試用自編碼上使用的參數去與內核進行核對、修改,然后再去測試。如果不成功,對于內核中多余的設置(這些大多可能是提供內核用做基本判斷的變量)可以先屏蔽,編譯出錯了,根據提示,找到出錯的位置修改添加。因為這些多余的設置,設置對了還行,設置錯了,你又不好去定位錯在哪。
?
自編的驅動在此處的用處,調試時,可以讓你排除多余的失敗可能性問題,在較少的代碼去查出錯誤位置,如果你確定你的設置滿足了該設備的必需設置,還是失敗,你可以比較放心地去懷疑是硬件問題了。如果自編碼成功,那個又可以當做你修改內核驅動的一個標準。
?
②內核驅動源碼支持管理多種型號的設備的優勢是我用使用它的原因。先了解本版本本平臺的設備驅動結構,如果是添加型號支持,那就根據自編驅動的參數與設置即可,如果是第一次啟動這類設備,你就還需要檢測結構是完整性,如果結構完整,參數無誤依舊錯誤,那就把內核驅動源碼精簡到自編碼的簡單粗暴設置吧。最終就變成了在基于內核驅動架構下的自編驅動。如果還不行,那無疑是結構性問題了。
?
所以自編驅動,還是有其存在價值的。內核驅動源碼內容會變,平臺會變,但自編驅動是變得最小的一個,也是最容易實現驅動目的的一個。是一碼打天下不可缺少的重要組成部分。
對于嵌入式驅動開發的建議
1)?為了今后的發展,你除了考慮廣度以外,更重要的是注意知識的深度。
譬如,做過網絡驅動,那么是不是只停留在會寫驅動的表層上,有沒有對Linux內核的網絡結構,TCP/IP協議作過深入的了解。
2)?在Linux下開發很多時候都要利用現成的東西,沒必要什么都自己搞。關鍵是變成自己的驅動后是否了解原作者編寫時背后的一些東西。你應該不止是簡單的讓它工作。寫驅動的時候就要考慮它的性能問題,并給出測試的方法(當然可以利用現成的許多工具,譬如測試網絡性能的netperf等)。
當你寫過Flash驅動,可能會知道Flash的性能有時候有多重要。
3)?C程序的自我修煉,是否考慮到軟件工程方面的一些東西,程序的可維護性和擴展性,譬如LCD驅動,是不是從Sharp到NEC的只需要集中修改很少的幾個地方?
對于不同品牌的Flash,如果使得Flash的驅動做的更具有靈活性。
4)?如果有時間結余,可以關注Linux內核的發展。譬如LCD的驅動有沒有考慮到V4L2通用架構,譬如網絡驅動用到了NAPI了嗎?當然在此之前,假設已經對LDD3, ULK2理解的比較熟了。
5)?現在所作的這些驅動還算不得非常核心的東西。如果你想有更好的發展,可以考慮往audio,video,net方面發展,你應該多注意真個行業需要什么樣的人才,上述每一項都需要很厚的底蘊,譬如video,需要了解MPEG4, H264等,怎么也要個1到2年才能算個入行阿,所以我建議不要只顧悶頭做東西,要適當關注目前的一些應用。
6)?對硬件知識的補給,做嵌入式Linux這一行不可能不讀硬件的Spec,如果你對硬件的工作機制理解的比較透,會有助你寫出性能好的驅動程序。
順便提一點,適時的提高你的英語水平,對你的職業生涯絕對有幫助。(不要等需要的時候再補,來不及)
7)?如果有時間,平時注意對Linux應用程序編寫的了解/積累,也將有助于你寫出很好功能很好的驅動程序。
8)?永遠不能以為自己做了很多東西,就驅動而言,像TVIN/TVOUT, USB, SDIO等等,好多未知領域呢。在問題還沒有解決之前很難說清是哪里不對了。
有時候是datasheet里面的一句話沒有注意,還有好幾次調不出來最后查到是PCB的問題,所以有時候特別暈。
-END-
猜你喜歡(點擊下劃線閱讀)
春晚上的“拓荒牛”
芯片荒!2020年花3000億進口芯片...
全球芯片IC設計Top10巨頭最新排名:美國包攬前三,華為跌出前十,英偉達增幅最大。
??最 后??
?若覺得文章不錯,轉發分享,也是我們繼續更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!
點擊下方卡片,在公眾號內回復「更多資源」,即可免費獲取。
總結
以上是生活随笔為你收集整理的嵌入式驱动自学者的亲身感受,有什么建议?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果又一最新专利公布 可利用穿戴设备进行
- 下一篇: 基于 GPT-4 的新版 ChatGPT