新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 如何玩轉(zhuǎn)linux驅(qū)動(dòng)

如何玩轉(zhuǎn)linux驅(qū)動(dòng)

作者:machinnneee 時(shí)間:2014-09-09 來源:電子產(chǎn)品世界 收藏

  說玩轉(zhuǎn)這話,其實(shí)有點(diǎn)過頭,玩是個(gè)長期積累的過程,寫出來是一回事,調(diào)試起來也是一種磨練。為了讓大家明白玩的樂趣和掌握編寫驅(qū)動(dòng)的捷徑,我分享一些經(jīng)驗(yàn),算是拋磚引玉。不過正所謂一口吃不了個(gè)胖子,只有寫夠了足夠多的代碼,調(diào)試了足夠多的模塊,玩轉(zhuǎn)驅(qū)動(dòng)也不再話下。希望今天的嘮叨對想踏入或者即將踏入驅(qū)動(dòng)行業(yè)的你有些幫助。

本文引用地址:http://2s4d.com/article/262706.htm

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

  我們很明白 設(shè)備驅(qū)動(dòng)的學(xué)習(xí)是一項(xiàng)浩大的工程,正是由于這個(gè)原因,一些人不免望而生畏,其實(shí),只要我們有足夠的積累和全面的知識(shí),玩轉(zhuǎn)驅(qū)動(dòng),也是早晚的事。閑話少說,開始來干貨。

  對于驅(qū)動(dòng)工程師來說,首先要明白驅(qū)動(dòng)在整個(gè)系統(tǒng)中的作用,

  大家從上圖中可以看出,linux驅(qū)動(dòng)②在這個(gè)構(gòu)架中起到承上硬件①啟下應(yīng)用程序③的作用。在程序的編寫中,我們常用高內(nèi)聚低耦合的標(biāo)準(zhǔn),因此,驅(qū)動(dòng)的引入顯得意義更加重大:一方面,使嵌入式應(yīng)用工程師不用考慮過多的硬件差異,另一方面,通過將設(shè)備驅(qū)動(dòng)融入內(nèi)核,面向操作系統(tǒng)內(nèi)核的接口,這樣的接口由操作系統(tǒng)規(guī)定,對一類設(shè)備而言結(jié)構(gòu)一致,獨(dú)立于具體的設(shè)備。同時(shí)由于linux操作系統(tǒng)有內(nèi)存管理和進(jìn)程管理,因此對于多任務(wù)并發(fā)的要求時(shí),操作系統(tǒng)和驅(qū)動(dòng)的引入使得任務(wù)變得簡單。但是對于不需要多任務(wù)調(diào)度、文件系統(tǒng)、內(nèi)存管理等復(fù)雜功能時(shí),在一個(gè)大while(1)循環(huán)中既可以完成相關(guān)的任務(wù)。

  上面分析了驅(qū)動(dòng)的意義,那么,玩轉(zhuǎn)linux驅(qū)動(dòng)需要那方面的知識(shí)呢,現(xiàn)在羅列下:

  ? 第一、 驅(qū)動(dòng)工程師要有良好的硬件基礎(chǔ)。

  這個(gè)要求不言而喻,linux驅(qū)動(dòng)工程師的主要任務(wù)就是隱藏硬件的差異,給應(yīng)用工程師一個(gè)統(tǒng)一的接口,因此需要能看懂電路圖,理解、Flash、SDRAM、磁盤等模塊的讀寫方式,知道UART、I2C、USB 等設(shè)備的接口以及常規(guī)操作,了解輪詢、中斷、DMA 的原理,PCI 總線的工作方式以及CPU 的內(nèi)存管理單元(MMU)等。不過對于這種常見的模塊,linux內(nèi)核中有相關(guān)的配置,因此需要有閱讀linux內(nèi)核的能力和修改linux內(nèi)核的能力。

  ? 第二 、驅(qū)動(dòng)工程師具有良好的C 語言基礎(chǔ)。

  作為一個(gè)面向硬件底層和應(yīng)用層的關(guān)鍵人物,C語言功底是必須要牢固的。在編寫linux的字符設(shè)備和塊設(shè)備驅(qū)動(dòng)中常用的fopen()、fwrite()、fread()、fclose()以及內(nèi)存分配中經(jīng)常使用結(jié)構(gòu)體和指針。因此能靈活地運(yùn)用C 語言的結(jié)構(gòu)體、指針、函數(shù)指針及內(nèi)存動(dòng)態(tài)申請和釋放顯現(xiàn)的尤為重要。

  例如字符設(shè)備驅(qū)動(dòng)中的讀函數(shù)函數(shù)的定義

  /* 讀設(shè)備*/

  ssize_t xxx_read(struct file *filp, char _ _user *buf, size_t count,loff_t*f_pos)

  {

  ...

  copy_to_user(buf, ..., ...);

  ...

  }

  從中看出C語言功底的重要性。

  ?第三、 Linux 驅(qū)動(dòng)工程師具有一定的Linux 內(nèi)核基礎(chǔ),雖然并不要求工程師對內(nèi)核各個(gè)部分有深入的研究,但至少要了解設(shè)備驅(qū)動(dòng)與內(nèi)核的接口,尤其是對于塊設(shè)備、網(wǎng)絡(luò)設(shè)備、Flash設(shè)備、串口設(shè)備等復(fù)雜設(shè)備。

  現(xiàn)在工作起來,嵌入式驅(qū)動(dòng)工程師的工作量相對會(huì)小一點(diǎn),因?yàn)橐话愠R姷挠布O(shè)備供應(yīng)商都會(huì)提供相應(yīng)的linux版本驅(qū)動(dòng),驅(qū)動(dòng)工程師的任務(wù)就是調(diào)試這些驅(qū)動(dòng)能正常運(yùn)行在自己的系統(tǒng)中,同時(shí)保證系統(tǒng)的穩(wěn)定。

  ? 第四、 Linux 驅(qū)動(dòng)工程師具有良好的操作系統(tǒng)知識(shí)。

  這個(gè)要求對于沒有學(xué)習(xí)過操作系統(tǒng)的人來說唯一的痛苦之處就是對于專有名詞不是很理解,例如上半部,下半部,原子操作等。其實(shí)剛開始或許是個(gè)痛苦的過程,但是只要認(rèn)真的分析了一個(gè)或者幾個(gè)驅(qū)動(dòng)程序后,你就會(huì)發(fā)現(xiàn)其中的規(guī)律。畢竟linux驅(qū)動(dòng)大體分為字符設(shè)備驅(qū)動(dòng)、塊設(shè)備驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)三類,正所謂抓其綱要,舉一反三,便可融會(huì)貫通。因此linux中多任務(wù)并發(fā)控制和同步等基礎(chǔ)很重要,因?yàn)樵谠O(shè)備驅(qū)動(dòng)中會(huì)大量使用自旋鎖、互斥、信號(hào)量、等待隊(duì)列等并發(fā)與同步機(jī)制。

  第五、動(dòng)手能力。

  紙上得來終覺淺,因此,看再多的書也沒有真正的調(diào)試一個(gè)驅(qū)動(dòng)來的認(rèn)識(shí)深刻。這時(shí)你需要搭建宿主機(jī)平臺(tái),購買開發(fā)板。不要好大喜功,從簡單的小驅(qū)動(dòng)開始一步一步走,以螞蟻啃骨頭的精神進(jìn)行學(xué)習(xí),收獲會(huì)很大。

  經(jīng)歷了痛苦的折磨,現(xiàn)在看下嵌入式驅(qū)動(dòng)工程師的甜蜜吧,工作個(gè)三五年,你已經(jīng)是大師了,可以去招聘網(wǎng)站瀏覽下,這方面的待遇都是面議獎(jiǎng)金都是大大的,紅色票票也隨心所愿了。想到這些,你還不下定決心來經(jīng)受linux驅(qū)動(dòng)的虐待,相信只要以“驅(qū)動(dòng)虐我千百遍,我待驅(qū)動(dòng)如初戀”的決心,相信你可以玩轉(zhuǎn)linux驅(qū)動(dòng)。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

c語言相關(guān)文章:c語言教程


linux相關(guān)文章:linux教程




關(guān)鍵詞: Linux 驅(qū)動(dòng) SRAM

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉