搞嵌入式驅動開發一年多了,項目作的很多:linux
從網絡驅動到CAN驅動、從Dataflash驅動到NAND/NOR FLASH驅動、從CF/IDE驅動到各類嵌入式文件系統、從LCD/VGA驅動到音頻驅動、從IAR到ADS再到GCC、Ucos到linux、從I2C總線到SPI再到SSC以及TCP/IP協議。shell
但感受並無學到什麼東西,除了一個字:累!編程
老實說這些項目,不多有驅動是本身動手寫的,基本都是找來相近的代碼改過來的。網絡
有時候感受本身如今作什麼都是半桶水,對本身超沒信心了。架構
對linux也是隻知其一;不知其二,對啓動腳本,系統配製,shell、makefile以及應用程序編程,都瞭解一點點但沒有同樣精通的;工做主要使用C語言,但是有時候寫個測試程序也是一堆錯誤;英語自感受還不錯,可是有時候看datasheet也會發懵!框架
生活艱難,工資又低,想提高本身卻又謎茫不已。ide
建議:工具
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的問題,因此有時候特別暈。
此外,其實如這位網友作的這些東西,在不懂的人看來,好像很高深,不能逾越,可是任何東西都同樣,你要不斷的進步,第一次作某個驅動和第二次再作這個驅動,你應該得到更多,若是你沒有這種感受,那你就是白作了。
好比,你第一次寫Linux驅動和你第十次寫Linux驅動,你應該有不一樣的感受,更甚者,也許你有了一套很好的框架,不管任何驅動,你只要套用框架,而後針對不一樣的datasheet作點修改就能夠了。
若是你能本身總結這些框架並把它分享給你們,那麼你的價值又高了很多。
你在作驅動的時候,確定會用到與內核相關的東西,或者須要和內核中的某些模塊配合,這樣你也要理解內核的某些部分是如何實現的,最後,你應該能夠很好的掌握linux的內核總體框架是什麼。這些都是進步,都是在你一次又一次的開發中須要總結的東西,若是你不總結,永遠都是從頭開始(或者說永遠都是還沒看懂別人代碼爲何這麼作的時候,就去改它,而後能夠工做了),就完事了,這樣你永遠也不可能提升,最後你就有了如今的這種感受,以爲本身什麼都不是,什麼都不懂。
還有一點要說明的,如今有許多人搞linux開發,卻不去用linux系統作爲本身工做的平臺,在這種狀況下,你很難理解linux內核的實現機制,以及爲何要採用這種方式實現。就如你到如今還不懂Linux的啓動流程同樣。這是很危險的。你都沒用過linux系統,就想去實現一個與linux運行機理相符合的項目,這是不可能的。就算你這個項目成功了,它也確定不是最優的,或者是不符合linux的使用習慣的(包括內核的擴展和應用程序的實現)。
因此,最後想說的是,你必定要按期總結,總結你這段時間作了什麼,你從中獲得了什麼,爲了你之後能夠更好的作好相似的工做,你應該去看些其它的什麼東西;二是你必定至少要在工做的開發環境中使用linux做爲你的平時工做平臺,而不要使用虛擬機和服務期,由於你只有徹底瞭解了linux的使用,你才能夠爲它開發符合它規則的項目。