『壹』 嵌入式學習的什麼是嵌入式學習
嵌入式學習是將學習真正「嵌入」到日常工作中,使學習的知識能得到有效的轉化。
嵌入式學習模式認為如果學習內容與工作相關,員工學習的積極性最大,在今天日益快速變化的學習環境中,傳統結構化的課程很難預測員工在工作中遇到的各種復雜問題,因此難以向員工提供最佳的問題解決方法,而員工在工作中遇到困難時能通過內部學習組織很快得到解決問題的方法從而得到知識,就被稱為嵌入式學習。
嵌入式學習具有提供即時的學習支持、強調合作性、引入學習技術、將學習與工作相結合的特點。
『貳』 怎樣學好嵌入式
學好嵌入式的方法:
1、C語言是所有編程語言中的強者,單片機、DSP、類似ARM的種種晶元的編程都可以用C語言搞定),因此必須非常熟練的掌握。
2、操作系統原理,是必需的,如果是計算機專業畢業那也就無所謂了,如果是非計算機專業的就必須找一本比較淺顯的計算機原理書籍看一看,把啥叫「進程」「線程」「系統調度」等等基本問題搞清楚。
3、Linux操作系統就是用C語言編寫的,所以也應該先學習下Linux方面的編程,只有會應用了,才能近一步去了解其內核的精髓。
4、了解ARM的架構,原理,以及其匯編指令,我們在嵌入式開發中,一般很少去寫匯編,但是最起碼的要求是能夠看懂arm匯編。
5、系統移植的時候,就需要從最下層的bootloader開始,然後內核移植,文件系統移植等。而移植這部分對硬體的依賴是非常大的,其配置步驟也相對復雜,也沒有太多詳細資料。
6、驅動開發
linux驅動程序設計既是個極富有挑戰性的領域,又是一個博大精深的內容。
linux驅動程序設計本質是屬於linux內核編程范疇的,因而是對linux內核和內核編程是有要求的。在學習前要想了解linux內核的組成,因為每一部分要詳細研究的話足夠可以擴展成一本厚書。
『叄』 嵌入式怎麼自學自學嵌入式有什麼方法
嵌入式怎麼自學?如何事半功倍的學習嵌入式
嵌入式怎麼自學?這是很多想要入門的新手經常問別人的問題,生怕走錯道,走彎道。作為嵌入式的學習者,其次具備一些基礎技能之後,學習嵌入式顯然會事半功倍。就拿當前嵌入式培訓而言,也是從基礎到專業。本篇文章就教你:嵌入式怎麼自學,讓你事半功倍的學習嵌入式。
1.掌握C語言高級編程。無論是對嵌入式軟體還是硬體開發編程,都是不可缺少的一部分。因此不管您是自尋、還是拜師我堅信這都是他們教您的第一步。
2. 要了解嵌入式Linux操作系統。你得首先對這個系統有一定的認識,就好比你想蓋房子、你得需要水泥、磚頭、鋼筋。那麼嵌入式Linux系統同樣如此。這個比喻也許很粗糙,但容易理解。
3.了解Linux或者wince下的編程。
4.具有單機片或者ARM或者MIPS等相關基礎。
5.其他知識的擴充。我們還可以通過閱讀一些優秀的代碼,了解UBOOT的源代碼,或者是學習下linux的源代碼等等。
關於培訓,華清遠見的嵌入式培訓流程如下:
基礎部分:嵌入式Linux操作系統的使用、C語言高級編程、數據結構及其經典算話描述。
應用層部分:I/O、Linux庫的製作和使用、Linux並發程序設計、網路編程、資料庫開發、綜合案例等等
底層核心部分:ARM編程、硬體介面編程、物聯網基礎、系統移植、內核開發、驅動開發等
項目實戰:會讓學生以分組的形式完成2個項目作為項目畢業考核,以方便分配工作,把簡歷豐滿起來。
關於嵌入式怎麼自學,華清遠見的嵌入式培訓班認為最重要的還是先看看C語言高級編程。很多初學者對編程思想、思路是比較陌生的。因為這個將伴隨著整個學習過程。哪怕你不做嵌入式。學好C語言高級編程,也能找到很多適合您的崗位。
『肆』 嵌入式學習方法是什麼有哪些好的嵌入式學習方法啊
嵌入式作為國內近幾年比較火熱的專業,也就是和前幾年計算機專業一樣。前些年計算機專業做為一個火熱的專業各大高校一片熱招,但由於學校師資有限、教材落後, 最後導致學生畢業後找不到工作。
近幾年嵌入式又是一片火熱,各大高校紛紛熱招,但是部分高校設備不夠齊全、師資不夠,在不久幾年裡嵌入式專業又將重蹈計算機覆轍。現在好多在校大學生和工作人員對於嵌入式專業十分感興趣。下面我就個人經驗來說一下嵌入式的學習方法,如有不到之處請高人指點。
嵌入式的定義是以應用為中心,以計算機技術為基礎,並且軟硬體可定製,適用於各種應用場合,對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統。它一般由嵌入式微處理器、外圍硬體設備、嵌入式操作系統以及用戶的應用程序等四個部分組成,用於實現對其他設備的控制、監視或管理等功能。 嵌入式系統幾乎包括了生活中的所有電器設備,如掌上 PDA 、移動計算設備、電視機頂盒、手機上網、數字電視、多媒體、汽車、微波爐、數字相機、家庭自動化系統、電梯、空調、安全系統、自動售貨機、蜂窩式電話、消費電子設備、工業自動化儀表與醫療儀器等。
嵌入式系統一般指非PC系統,它包括硬體和軟體兩部分。硬體包括處理器/微處理器、存儲器及外設器件和I/O埠、圖形控制器等。軟體部分包括操作系統軟體(OS)(要求實時和多任務操作)和應用程序編程。有時設計人員把這兩種軟體組合在一起。應用程序控制著系統的運作和行為;而操作系統控制著應用程序編程與硬體的交互作用。
這時嵌入式就以計算機為基礎從事相關設備的開發了,試問前些年沒有做好計算機教學的學校,又何以從事嵌入式教學呢。
對於在校大學生應該C語言基礎知識,光是學習譚浩強的還不夠,多看一些國外的經典書籍,如,這是每位學習程序設計的人員必備知識。由於嵌入式是軟體和硬體相結合的產物,所以對於操作系統和微機原理的學習也是不可缺少的,但是現在各大高校只是停留在理論知識的講解,並沒有實際上的東西,這也就導致學生不能提高興趣,只是用於對付考試,所以學好操作系統和微機原理應該理論實際相結合。還有數據結構這一門課程是不得不提的課程,國內出名的也就是清華大學的嚴蔚敏的那本書了。學好這些東西這也就是相當於武俠小說中的內功的修養。
有了這些做為基礎,去學習其他的一些東西就會很快的。
嵌入式分為嵌入式軟體開發和嵌入式硬體開發,嵌入式的軟體開發在掌握了以上東西後要如魚得水。
下面就以萬達嵌入式Linux培訓的課程體系為例,個人感覺還是不錯的。他是這樣列的:
Linux基礎、Linux應用程序開發、嵌入式Linux網路程序開發、嵌入式圖形界面與資料庫開發、嵌入式linux開發環境搭建、S3C2440的內部結構功能簡介、BootLoader分析和移植、Linux內核移植、uCOS II 源碼分析和移植、根文件系統製作、BootLoader、內核綜合解析、Linux系統調試、ADS模擬調試與S3C2440硬體介面操作、ARM11介面、Linux下字元設備驅動程序、Linux下塊設備驅動程序、Linux下網路設備驅動程序、LCD設備驅動、Flash設備驅動、USB驅動開發等。
要學習一個東西肯定要先學習他的操作,這就是linux基礎,也就是常用的linux操作,這樣的書籍太多了,找一些實用的來看就可以了。下來就是在我們先前學習的C語言的基礎上學習linux上的程序開發,這門課程現在在好多學校都沒有開設,對於程序開發者來說是一門很重要的課程,不過萬達嵌入式是把網路程序開發和圖形界面開發與資料庫開發分開了,其實這些都屬於linux上的應用程序開發,可能也是為了方便大家認識這一門課程吧,條理更加清楚了。這一內容是企業開發中應用最多的內容,也就是所謂的嵌入式應用層開發。有了深入的C語言基礎這些內容都是很容易學會的。比較知名的書籍有已幫的的steves先生的《UNIX環境高級編程》可以說是UNIX編程「聖經,這本書一定要好好的拜讀的。對於網路程序開發也是stevens先生的《UNIX網路編程》,如果你想深入的掌握的話可以看一下《TCP/IP協議三卷》。對於圖形界面的開發大家可以看一下Jasmin Blanchette的《C++GUI Qt4編程(第2版)》。掌握這些基本上就可以從事應用層開發了。這些技術都是企業內部急用的內容。
由於嵌入式的開發不是在我們平時用的x86平台上用的,所以我們需要把我們所寫的程序放到相應的平台上去,這時就用到了嵌入式開發環境的搭建(見上面的課程體系),開發環境的搭建主要就是交叉編譯開發環境的搭建,這個東西你可以去網上去下,也可以自己動手去做,但在實際當中用的時候需要你自己動手去搭建。建議你先自己使用,然後慢慢的學著去搭建。
對於ARM9的操作,現在市場上主要是2410和2440,二個選擇一個用就可以了,內容差不太多,認真的研究透一個就可以了,對於ARM11的6410的操作就先不要考慮了,在萬達嵌入式的課程體系中也安裝的也挺合理的,先是學習一下2410或2440再去學習6410,有了一定的基礎後再去學習6410才有可能把它操作起來。對於介面的一些操作就是把ARM當做一個單片機來操作,這樣的書籍可以去看一下周立功的書籍,它們對ARM說的挺多的,不過他們用不是三星的產品,但是懂了其中一個其它的操作起也就可以了。
對於2440的操作會了以後就可以去學習BootLoader的學習了,在萬達嵌入式裡面說的是BootLoader的,這里只是說了一個總稱,這里主要有u-boot,vivi,LILO等,如果你用的是ARM你可以先自己選擇一個小的BootLoader,比如vivi來學習,學會這一個了你去操作其它的都是一樣的了。
對於操作系統的移植大體過程都是一樣的,主要是讓你做一個最小系統,方便以後驅動的學習。對於嵌入式系統移植的話這方面還真沒有太多好的書籍,自己可以去網上搜一下。
對於基礎知識都打好以後就可以進攻驅動程序開發,這個東西是一個比較漫長的過程,一定要靜下心來,慢慢的去閱讀代碼,慢慢的去學習。這樣的東西大家可以看一下《Linux內核源碼情景分析》、《深入理解Linux內核》等書籍。在萬達嵌入式的課程體系裡面他們說到了好多關於驅動開發中的實例,確實是這樣子,驅動開發肯定要多接觸一些典型的驅動程序開發的案例,大家可以慢慢的跟著課程體系裡面的東西去學習。
另外就是嵌入式的硬體的開發,主要就是所謂的FPGA、DSP、VHDL等。這些東西在大學裡面基本上都會學到大家都可以去學習一下,自己試著做出來一些東西來。比如抄板子,一點一點的去劃。
好了對於嵌入式的學習在這里就說這些,如果有不正之處請大家指正。
『伍』 嵌入式開發學習步驟
嵌入式開發的學習其實並沒有那麼難,只要了解學習的體系,掌握正確的學習方法,學習起來並不難。來講一下嵌入式開發都要學些啥!
嵌入式開發的主要學習內容:
C,Java核心編程:c語言核心編程,Java核心編程;
Linux核心操作與演算法:Linux系統使用,Linux-c編程核心技術,精品數據結構,Linux-c編程精髓;
核心操作與演算法:Linux系統編程,Linux網路編程核心技術,UI編程,Java核心編程,安卓核心技術;
ARM+Linux底層開發:數字電路,ARM編程核心,Linux系統開發,嵌入式Linux驅動開發;
大型項目實踐:每期安排各類型真實的項目
互聯網行業目前還是最熱門的行業,學習IT技能之後足夠優秀是有機會進入騰訊、阿里、網易等互聯網大廠高薪就業的,發展前景非常好,普通人也可以學習。
想要系統學習,你可以考察對比一下開設有IT專業的熱門學校,好的學校擁有根據當下企業需求自主研發課程的能力,建議實地考察對比一下。
祝你學有所成,望採納。
『陸』 如何學習嵌入式技術
首先要知道什麼是嵌入式技術,嵌入式技術執行專用功能並被內部計算機控制的設備或者系統。嵌入式系統不能使用通用型計算機,而且運行的是固化的軟體,用術語表示就是固件(firmware),終端用戶很難或者不可能改變固件。
...............................................................
那怎麼學習嵌入式技術呢,我剛才看到一篇很不錯的文章,是一個專科生介紹自己如何自學嵌入式,並找到嵌入式的工作,裡面介紹了他的學習方法和學習過程,希望對你有幫助。
先做個自我介紹,我07年考上一所很爛專科民辦的學校,學的是生物專業,具體的學校名稱我就不說出來獻丑了。09年我就輟學了,我在那樣的學校,一年學費要1萬多,但是根本沒有人學習,我實在看不到希望,我就退學了。
退學後我也迷茫,大專都沒有畢業,我真的不知道我能幹什麼,我在糾結著我能做什麼。所以輟學後我一段時間,我想去找工作,因為我比較沉默寡言,不是很會說話,我不適合去應聘做業務。我想應聘做技術的,可是處處碰壁。
一次偶然的機會,我才聽到嵌入式這個行業。那天我去新華書店,在計算機分類那邊想找本書學習。後來有個女孩子走過來,問我是不是讀計算機的,有沒有興趣學習嵌入式,然後給我介紹了一下嵌入式現在的火熱情況,告訴我學嵌入式多麼的有前景,給我了一份傳單,嵌入式培訓的廣告。聽了她的介紹,我心裡癢癢的,確實我很想去學會一門自己的技術,靠自己的雙手吃飯。
回家後,我就上網查了下嵌入式,確實是當今比較熱門的行業,也是比較好找工作的,工資也是相對比較高。我就下決心想學嵌入式了。於是我去找嵌入式培訓的相關信息,說真的,我也很迷茫,我不知道培訓是否真的能像他們宣傳的那樣好,所以我就想了解一段時間再做打算。
後來,我在網路知道看到一篇讓我很鼓舞的文章,是一個嵌入式高手介紹沒有基礎的朋友怎麼自學入門學嵌入式,文章寫的很好,包含了如何學習,該怎麼學習。他提到一個方法就是看視頻,因為看書實在太枯燥和費解的,很多我們也看不懂。這點我真的很認同,我自己看書往往看不了幾頁。
我在想,為什麼別人都能自學成才,我也可以的!我要相信自己,所以我就想自學,如果實在學不會我再去培訓。
主意一定,我就去搜索嵌入式的視頻,雖然零星找到一些嵌入式的視頻,但是都不系統,我是想找一個能夠告訴我該怎麼學的視頻,一套從入門到精通的視頻,一個比較完整的資料,最好能有老師教,不懂可以請教的。
後來我又找到一份很好的視頻,是在IT學習聯盟網站推出的一份視頻《零基礎嵌入式就業班》(喜歡《零基礎嵌入式就業班》的可以復制 sina.lt/qKh 粘貼瀏覽器地址欄按回車鍵即打開)。裡面的教程還不錯,很完整,可以讓我從基礎的開始學起。視頻比較便宜。
下面介紹下我的學習流程,希望對和我一樣完全沒有基礎的朋友有所幫助。
收到他們寄過來的光碟後,我就開始學習了,由於我沒有什麼基礎,我就從最簡單的C語言視頻教程學起,話說簡單,其實我還是很多不懂的,我只好請教他們,他們還是很熱心的,都幫我解決了。C語言我差不多學了一個禮拜,接下來我就學了linux的基本命令,我在他們提供linux虛擬機上都有做練習,敲linux的基本命令,寫簡單的C語言代碼,差不多也就三個禮拜。我每天都在不停的寫一些簡單的代碼,這樣一月後我基本掌握了C和linux的基本操作。
接下來我就去學習了人家的視頻的培訓教程,是整套的,和去參加培訓沒有多大的區別,這一看就是兩個月,學習了ARM的基本原理,學習嵌入式系統的概念,也掌握了嵌入式的環境的一些搭建,對linux也有更深層次的理解了,明白了嵌入式應用到底是怎麼做的,但是驅動我只是有一點點的了解,這個相對難一點,我想以後再慢慢啃。
這兩個月,除了吃飯睡覺,我幾乎都在學習。因為我知道幾乎沒有基礎,比別人差勁,我只能堅持努力著,我不能放棄,我必要要靠自己來養活自己,必須學好這門技術,然後我就把不懂的問題總結記下來,這樣慢慢積累了一段時間,我發現自己真的有點入門了。
最後的一個月,我就去看關於實踐部分的內容,了解嵌入式項目具體的開發流程,需要什麼樣的知識,我就開始准備這方面的知識,也就是學習這方面的視頻,同時他們建議我去找了找一些嵌入式面試的題目,為自己以後找工作做准備。我就到網上找了很多嵌入式的題目,把他們理解的記下來,這樣差不多准備了20天左右
我覺得自己差不多入門了,會做一些簡單的東西了。我就想去找工作看看,於是我就到51job瘋狂的投簡歷,因為我學歷的問題,專科沒有畢業,說真的,大公司沒有人會要我,所以我投的都是民營的小公司,我希望自己的努力有所回報。沒有想過幾天過後,就有面試了,但是第一次面試我失敗了,雖然我自認為筆試很好,因為我之前做了准備,但是他們的要求比較嚴格,需要有一年的項目經驗,所以我沒有被選中。
後來陸續面試了幾家公司,終於功夫不負有心人。我終於面試上的,是在閔行的一家民營的企業,公司規模比較小,我的職務是嵌入式linux應用開發,做安防產品的應用的。我想我也比較幸運,經理很看重我的努力,就決定錄用我,開的工資是3500一個月,雖然我知道在上海3500隻能過溫飽的生活,但是我想我足夠了。我至少不用每天都要靠父母養,我自己也能養活自己的。我想只要我繼續努力,我工資一定會翻倍的。
把本文寫出來,希望能讓和我一樣的沒有基礎的朋友有信心,其實我們沒有必要自卑,我們不比別人笨,只要我們肯努力,我們一樣會成功。
.......................................................
主要肯努力加上方法就能學好嵌入式,希望你未來能成為嵌入式工程師。
『柒』 如何學習嵌入式
作者:匿名用戶
鏈接:https://www.hu.com/question/19688487/answer/32217959
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
學習嵌入式系統,首先應該明確什麼是嵌入式系統,否則費力去學,卻不知所學為何物,豈不惘然?嵌入式系統的定義很多,這也是困擾嵌入式系統學習的一個因素。筆者根據自己開發和教學過程中的理解,以及對各種嵌入式系統的應用進行總結,提出了嵌入式系統的簡單定義:嵌入式系統是嵌入式計算機系統的簡稱,這個定義突出嵌入式計算機系統和普通計算機系統的共性。下表列出了嵌入式系統的一些典型的應用:
智能機器人(S D R 4,火星登陸車)
娛樂和消費電子(Gameboy Advance,SonyPSP)
網路通信產品(Smartphone)
軍用設備(軍用PDA )
汽車(車載導航,自動駕駛,娛樂系統)
智能儀器(虛擬儀器)
安全防護(防火,防盜)
環境保護(探空氣球)
銀行和商業消費(ATM)
以火星登陸車為例來分析一下嵌入式系統的定義。火星登陸車雖然聽起來感覺在技術上有些高不可測,但是本質就是嵌入式計算機系統的應用,其核心就是一個計算機系統,而這個計算機系統的組成同傳統的計算機系統在本質上沒有什麼差別。兩者的顯著不同之處就在於,用於火星登陸車的計算機系統被安裝到了火星登陸車上。當然,一個計算機系統能夠被安裝在火星登陸車上,是需要進行很多特殊設計的。但是從本質上講,嵌入式系統的核心概念還在計算機系統。嵌入式系統學習的重點也在計算機系統上。一方面,學習者需要牢固掌握計算機系統本身的概念,更重要的是學習嵌入系統的開發過程同傳統計算機系統開發過程的差別。這里需要指出的是,很多學習者本來就沒有從事過完整計算機系統的開發,高校的教學是以程序設計為中心的,計算機系統的構成,操作系統的原理,編程語言等課程都是為了能夠讓學生更好的使用計算機系統進行程序設計,在現有的計算平台上來設計實現各種應用,學生一般沒有機會學習一個完整的計算機系統是如何構建,並親身參與到構建的每一個過程。而對於嵌入式系統而言,從事平台開發的人就是要親自去開發出一個完整的計算機系統,這個過程包括
1. 需求分析
2 硬體設計
3 驅動程序
4 Bootloader & BSP (板級支持包)
5 操作系統的移植
6 應用程序的開發
7 性能檢查
嵌入式系統教學的目的就是教會學生如何根據需求去建立滿足某種特殊行業需求的嵌入式計算機系統。讓學生學會如何構件硬體平台,進行硬體設計,選擇能夠滿足應用要求的最佳的嵌入式操作系統,並完成Bootloader,BSP和驅動程序的編寫,移植,調試等過程。為了滿足行業需求,最終要在所建立的系統上編寫調試相應的應用程序,並進行性能的測試和檢查。
你是誰,你需要學習哪些東西?
如果你的工作只是需要在PC 機上編寫一個圖片瀏覽程序,那麼你就沒有必要去了解當系統收到一個ARP請求包後應該如何回應。同樣的道理,嵌入式系統的學習也是有很多方面的。就嵌入式系統的設計和實現而言,基本上需要四種不同的工作:系統設計工作,硬體設計工作,驅動程序和操作系統移植工作和應用程序設計開發工作。
1.系統設計工作
在系統的設計階段,系統分析師將根據需求確定系統的硬體的基本構成,根據系統的需求選擇使用那種處理器,使用哪種操作系統,使用那些軟體開發工具。系統分析師往往是較為完整的參與過嵌入式系統設計的全過程,對於系統應用的行業較為了解,對於嵌入式系統本身的開發流程十分清楚的人。
2.硬體設計工作
系統硬體設計人員需要根據系統分析師的設計結果,進行硬體原理圖的設計。通常需要硬體設計人員熟悉嵌入式系統的硬體構成。硬體設計人員需要了解常用的嵌入式系統處理器,存儲器(Flash,SDRAM),乙太網MAC晶元,音頻/視頻編解碼晶元,電源管理晶元,匯流排介面電路 (USB,PCI),液晶顯示模塊,可編程邏輯器件(FPGA/CPLD),無線網路通信模塊(Bluetooth,WLAN,GPRS)等硬體電路構成元素的基本工作原理,連接使用方法,使用注意事項,基本調試方法等內容。在網路上能找到很多公司的評估板的原理圖,對於這些原理圖要仔細研究,摸清處理器同存儲器,網卡,液晶模塊等器件的連接方法和原因。通過對這些電路的研究,能夠較快地了解整個嵌入式系統的構成,這些電路同實際產品中的電路雖有一定差別的,特別是對於手持設備,但這些差別不影響初學者學習嵌入式系統的硬體設計基本構成。
以上這些知識,往往需要較長時間的學習和積累,需要親自參與實踐的機會。對於剛剛接觸嵌入式系統硬體開發的學生來講,一般不可能全部了解這些知識,但也不會是通通一無所知。筆者結合自己開發和教學的經驗認為:首先應該選定一款主流且較為簡單的嵌入式系統處理器,比如基於ARM7TDMI 內核的AT91M40800,S3C44B0 等嵌入式系統處理器,學習32 位RISC處理器的編程模型,指令集。高校教學中,單片計算機課程一般以8051系列單片為核心講解,由於現代32位處理器的結構和開發方式同8位單片機有著較大的差別,學習者還是需要花一點力氣來研究以下32位處理器的。以ARM處理器為例,學習者就需要理解處理器的多種工作模式,備份寄存器,RISC 指令集的特點,MMU 和虛擬地址,中斷處理過程等內容。在學習指令集的過程中,最好能夠每學習幾條指令,就使用這幾條指令在模擬器上實驗以下,觀察處理器執行的結果。這個過程一方面是學習者對於指令本身的學習能夠取得一個比較好的效果,另外也是對開發工具本身的一種學習。接著,就可以開始學習片上資源的使用和配置方法。這時就需要一個方便使用的開發板,學習者能夠通過JTAG模擬器將開發板同調試PC機相連,進行程序的下載,調試。特別是要仔細研究系統的初始化過程和中斷處理的過程。在開發過程中如果遇到問題,應自己分析問題產生的原因,通過分析縮小問題可能產生的范圍,最終找到問題的所在。最重要的就是要保持一種解決問題的信心,面對困難如何處理,往往能夠決定最終系統是否能夠調試成功。然後,學習者可以開始仔細學習處理器同存儲器的連接,存儲空間的配置,各種外擴器件,如網卡,AC97音效卡的工作原理和使用方法。嵌入式系統硬體設計中往往需要使用可編程器件,學習者還需要一定的時間來學習使用常用的可編程器件(CP L D / F P G A),常用的有Xilinx和Altera公司的產品。進行系統硬體原理圖設計,就需要使用原理圖設計的EDA工具,常用的EDA 原理圖設計工具主要包括Cadence公司的Capture,Protel公司的Protel99SE等。接下來就可以參照評估板的電路圖,根據系統的設計要求,開始進行原理圖的繪制了。在原理圖繪制過程中,一定要搞清評估板電路連接的原因,對於一時沒有搞清楚的問題切不可矇混過關。例如,有些處理器的地址線是以位元組位單位的,而另一些處理器的地址線則是以兩個位元組為單位的,當連接16位的存儲器的時候,切不可想當然的把處理器的A 0 直接連接到存儲器的A 0 上面。另外,學生還應具有一定的PCB板圖繪制能力,因為在現階段,很多公司還不能完全把原理圖的設計工作和PCB 的繪制工作分開,往往要求硬體設計人員既能進行原理圖設計又能進行板圖設計。即使是PCB設計和原理圖設計分開的公司,也需要原理圖設計者能為PCB 的設計者對於不同的信號提出布板要求。
3.驅動程序和操作系統移植工作
現代嵌入式系統的開發同傳統8位單片機系統的開發相比,一個顯著的區別就是嵌入式操作系統的廣泛使用。在拿到焊接完畢的電路板,並進行基本的測試後,就要進行驅動程序和操作系統的移植工作了。首先要進行的Bootloader的編寫和移植工作。Bootloader相當於PC系統的BIOS。對於有些嵌入式操作系統,如uc/OSII沒有bootloader同樣可以開發調試。但是對於WindowsCE和嵌入式linux系統而言Bootloader就是必須的了。本文以Windows CE 為例,做一個簡要的說明。
Windows CE 系統的移植工作主要就是BSP(板級支持包)的開發過程。BSP將具體的硬體差異同操作系統的核心隔離開來,主要由Bootloaer ,OAL(OEMAbstraction Layer)和設備驅動程序三部分組成。WindowsCE系統中Bootloader叫做Eboot。Eboot被寫入系統的引導Flash。系統啟動時運行Eboot,完成通過網卡將調試PC 機中WindowsCE 操作系統映像下載到目標系統的SDRAM中並開始執行的功能。對於一個系統移植人員,首先需要閱讀文檔,了解WindowsCE系統Bootloader和BSP的基本概念和開發過程。(呵,還要做這工作啊,我還沒想到(初學^_^))Windows CE的開發系統Platform Builder提供了詳細的文檔和常式,開發人員需要仔細的閱讀文檔和常式。搞清楚各個函數之間的調用關系。在開發過程中的一個重要的步驟就是打通串口,使得目標板能夠通過PC機串口向調試PC 機發送數據。由於ARM系統的模擬器比較昂貴,而且操作系統的調試往往不使用JTAG調試器進行單步調試。所以能從串口觀察程序的執行過程和結果對於調試就顯得十分重要了。串口打通之後一個比較棘手的問題就是網卡晶元的調試。剛剛接觸嵌入式系統開發的人往往沒有直接在寄存器級上使用網卡晶元的經驗,而網卡晶元的說明一般都較為簡短,這就要求開發者學習一些乙太網的基礎知識,對乙太網的MAC 層有一個基本的認識。另外,各種網路調試(抓包)工具的使用也能大大降低系統調試的難度。系統的OAL需要根據具體硬體的不同做出相應的修改,這個部分可參照文檔進行,在調試過程中根據串口的信息分析出錯的地方。要充分發揮跨文件字元串搜索工具的功能,在浩如煙海的源文件中找到出錯的位置。當然,隨著開發者對系統文件目錄結構的熟悉和了解,錯誤定位的速度會不斷加快。WindowsCE 的驅動程序相對而言是比較好寫的。
4.應用程序的開發
嵌入式系統的應用程序開發同在PC 機上開發應用程序的區別不是很大。對於Windows CE系統而言,Microsoft已經提供了較為完善的開發工具。特別是.NET Compact work的使用,使得基於Windows CE.NETCompactwork的應用程序有了跨平台性。開發人員可以使用Windows 的C# 語言直接在PC 上進行http://CE.NET應用程序的開發和模擬調試,也可將目標系統同PC 機相連,進行聯機調試。現在有很多系統支持J2ME(JAVA的嵌入式系統版本) ,這使得JAVA 在嵌入式系統應用開發中佔有較大的優勢。另外,作為專業的嵌入式系統軟體開發人員,還需要充分了解面向對象技術和設計模式等方面的知識,當然作為初學者可以先不深入研究這方面的內容。
常用嵌入式系統處理器和操作系統
處理器
常用嵌入式系統處理器主要包括ARM 處理器,Power PC 處理器,基於MIPS 內核的嵌入式處理器,軟核處理器(如Altera 的Nios和Xilinx的MicroBlaze等)和DSP(數字信號處理器)等。
ARM 處理器的主要特點是具有較高的性能功耗比。ARM處理器被廣泛的應用在手機,PDA等領域,其中較為著名的有Intel 公司生產的基於ARM 內核的XScale系列處理器。由於所有公司生產的基於ARM內核的處理器具有相同的編程模型,在手持和電池供電的系統中,基於ARM的嵌入式系統處理器往往被首先選用。PowerPC(簡稱PPC)處理器具有較強的運算性能和數據吞吐能力,在網路和數據通信領域基於PPC的嵌入式系統處理器有著廣泛的應用。其中Motorola公司生產的MPC860/MPC8260被大量地應用在嵌入式網路產品中。MIPS 處理器的特點表現在十分強大的處理能力上。作為高性能處理器,MIPS處理器適用於網路、企業及高級消費類電子應用,特別是在機頂盒系統中,MIPS處理器具有較高的市場佔有率。隨著可編程器件的規模不斷擴大,使得人們能夠根據需要定製處理器,並方便的將針對某種特殊應用定製的處理器方便的在可編程器件內部實現。除了處理器外,計算機系統還需要許多其他構成部分,比如在多通道媒體數據處理系統中,經常需要使用可編程器件來實現高速的數據處理功能,使用軟核DSP來實現復雜的數字信號處理演算法,同時還需要處理器進行事務處理,軟核處理器將可編程器件,DSP同處理器結合在一起,為系統級設計提供了極大的靈活性。DSP(數字信號處理器)有別於通用處理器,集中表現在其強大的數字信號處理能力上。在DSP 內部提供了硬體乘累加器,處理器在設計上對於特殊的定址方式做了優化,一些DSP 還支持零耗循環(Zero OverheadLoop)。為了方便嵌入式系統設計,主流DSP 一般也都提供了豐富的外設。特別值得一提的是ADI 公司的Blackfin 系列DSP和TI 公司的DM64X系列DSP,兩種處理器都提供了豐富的片上外設,非常適用嵌入式系統應用。
操作系統
http://WindowCE.NET/5.0
作為Microsoft的產品,WindowCE.NE/5.0提供了功能完備的平台開發工具Platform Builder和應用開發工具Embedded Visual C++/Visual Studio 2003。WindowsCE由於擁有廣大使用者所熟悉的windows界面,系統提供了眾多驅動程序,並且有完備的文檔支持。對於應用開發而言,熟悉Windows系統開發的程序員很容易轉到WindowsCE 應用程序的開發。Windows CE將會是一個非常有前途的嵌入式操作系統。
VxWorks
VxWorks是由Windriver(風河)公司出品的嵌入式實時操作系統,大名鼎鼎的火星登陸車就是使用了VxWorks。Windriver為VxWorks提供了集成開發環境tornado。
υC/OSII
υC/OS是由Jean Labrosse設計編寫的開放源代碼的嵌入式實時操作系統,筆者最早接觸的嵌入式操作系統就是它。閱讀並深入理解υC/OS的源代碼對於理解實時系統是大有裨益的。
ARM Linux
ARM linux是由Russell King和其他開發者開發移植的用於ARM 處理器的linux操作系統。ARM Linux系統在GNU GPL下發布。
υCLinux
υClinux 是適用於沒有MMU 的嵌入式處理的LinuxOS 版本。υ Clinux 同樣在GNU GPL發布。
嵌入式系統開發過程中的常見問題和解決方法
Bootloader如何寫入Flash ?
初學者一般都會遇到如何將程序寫入處理器的問題。對於不同的處理器,可以採用不同的方法。例如Intel的Xscale處理器可以使用Intel公司提供的JFlash工具燒寫。對於具有JTAG調試工具軟體的處理器,可以使用如下思路:編寫一段程序,這段程序能將位於SDRAM/SRAM 固定地址中的數據寫入Flash中。燒寫時,首先,將這段軟體下載到SDRAM 中,然後通過調試軟體將要寫入Flash的數據下載到SDRAM/SRAM的某個固定地址開始的緩沖區,然後通過調試器開始執行程序,將數據寫入Flash。除此以外,網路上還提供了很多專用的寫Flash的工具,開發者可以根據自己的需要選用。(現在明白了我在學的那個BF533為什麼先下個flashProgramer.dxe先了)
什麼是arm-elf-gcc?
arm-elf-gcc是一個交叉C語言編譯器。我們在PC平台下編譯程序,編譯器運行的處理器同生成的代碼將要運行的處理器相同。但是,在PC
機上編譯ARM程序時,編譯器運行的處理器同生成的代碼運行的處理器不同,這種編譯器叫做交叉編譯器。其中的elf是指編譯器生成的目標文件格式。(其實我們平時用的單片機編譯器如GCC—AVR等已是交叉編譯器了,我到現在才弄清楚什麼是交叉編譯器)
走了哪條編譯路徑?
系統程序和驅動程序往往包含很多的編譯選項,很多選項都是在編譯時通過命令行定義的,如果想知道編譯的是那一段程序可以使用如下的方法:
#ifdef PLAT_AAA
#error Code for Platform AAA
#else
#error Code NOT for Platform AAA
#endif
這樣在編譯的時候就知道,編譯的是哪一條路經了。對於支持#pragma message( 「I am here」)的編譯器也可使用#pragma message預編譯指令。
我怎麼知道那段代碼在那個文件中?
系統編程中經常需要使用在多個文件中搜索字元串,在windows平台下可以使用平台提供的多文件字元串搜索工具。在linux平台下,可以使用grep來搜索字元串。Grep的搜索功能十分強大,支持正則表達式搜索,熟練使用grep對於閱讀系統和驅動程序代碼是很有幫助的。
系統是從那個文件開始運行的?
對於Windows CE系統,一般從WINCE420\PLATFORM\YourPlatform\KERNEL\HAL目錄的某個匯編文件中。對於Linux系統版本不同會存在一定差異,以arm處理器為例,一般會在linux2.4.x\arch\arm\kernel的head-armv.S中。
程序執行到了那裡?
可以在程序中插入如下代碼來實現
printf( 「I am here %s, %d\n」,__FILE__,__LINE__);
代碼將打出printf語句所在的文件名和行號。
推薦書目
Jean J.Labrosse MicroC/OS-II The Real-TimeKernel,Second Edition這本書是筆者接觸嵌入式實時系統的入門書,在國內能夠買到中文版。這本書較為清楚地講述了實時系統的概念,各個組成部分的工作原理,特別是公開了實時系統內核的源代碼,仔細研究定會受益匪淺。有個小的提示,對於初學者,這本書可以先不看第一章,直接從第二章看起。
Abraham Silberschatz, Peter Baer Galvin,GregGagne Operating System Concepts筆者在教學過程中發現,無論是計算機還是電子工程專業都有很多學生對於操作系統的基本概念都沒有搞清,很少有學生有完整的系統編程經驗。Operating System Concepts這本書對操作系統的概念講述只能用經典來形容。對於嵌入式系統有興趣深入研究的同學,首先要把基礎打好,這本書就成了必讀之物了。
Andrew S. Tanenbaum Computer Networks 提起Andrew S. Tanenbaum 學習計算機的同學一定都知道OPERATINGSYSTEMs:Designand
Implementation這本書,筆者對於Tanenbaum這樣的教授由衷佩服。網路協議棧是嵌入式系統中的支柱性組成部分。願意致力於網路深層技術研究的同學,這本書將為你們建立一個堅實的網路基礎。
Karim Yaghmour Building Embedded Linux Systems本書詳盡的介紹了嵌入式linux系統的組成,基本概念和如何去建立各個部分。全書篇幅較小,可謂短小精悍。即可以作為嵌入式linux系統的入門讀物,又是開發過程各個部分的指南。
Advanced RISC Machines Ltd (ARM) ARM7 TDMI DataSheet Advanced RISC Machines Ltd (ARM) ARM920TTechnical Reference Manual學習嵌入式系統不了解當前應用最廣泛的嵌入式處理器怎麼行?ARM7 TDMI 的 data sheet是學習ARM編程模型,指令集的好東西。在嵌入式系統中,MMU(內存管理單元)是很重要的部分,又是較難理解和掌握的部分。ARM920TTechnical Reference Manual 正好可以幫你講解這方面的內容。
Perter Van Der LinDen Expert C Programming嵌入式系統級編程最常用的語言還是C 。很多同學都自認為自己的C語言學的很好,那好,就看看這本書吧,找找自己和Experts差距。
嵌入式開發與桌面開發既有不同,又有非常大的聯系,而且十分注重實際操作能力。搞桌面開發的人在一開始接觸嵌入式的時候,通常轉換不過來,這主要體現在定位上。如文中所說,你是誰,你要做什麼?我對硬體的了解僅限於編程領域,PCB設計一竅不通,但並不能說你不懂硬體就不能從事嵌入式開發。一個系統的開發設計方方面面,在自己感興趣和熟悉的領域做出自己的貢獻才是最主要的。
1。硬體設計: 需要有硬體設計的經驗,對各種嵌入式器件有很好的了解。
2。系統移植:需要匯編經驗,操作系統原理以及底層驅動的了解
3。應用程序:需要桌面編程經驗
『捌』 嵌入式學習的嵌入式學習方法
從零基礎開始:這部分主要還是要求大家熟練掌握基礎,孰能生巧,只有基礎熟練了才能為解下來的學習掃平障礙。 Linux命令的重要性: Linux是一個命令行組成的操作系統,精髓在命令行,無論圖形界面發展到什麼水平
個原理是不會變的,Linux命令有許多強大的功能:從簡的磁碟操作、文件存取、到進
行復雜的多媒體圖象和流媒體文件的製作。 選擇一本好的工具書:一本適合新手的書籍可以將其思維打開,使其豁然開朗。一旦選錯了書籍,初學者可能會產生一大串的疑問,並逐漸失去學習興趣。對於書籍的選擇,你可以到亞嵌的官網:《Linux C編程一站式學習》 選擇一個適合你的Linux發行版本目前全球有超過1百多個Linux發行版本,在國內也能找到十幾個常見版本。如何選擇請根據你的需求和能力,Redhat Linux和ebian Linux是網路管理員的理想選擇。對於英語不是很好的讀者紅旗Linux、中標Linux這些中文版本比較適合。現在一些Linux網站有一些Linux版本的免費下載,同學們可以到各自的班主任那拷貝亞嵌教學用的版本。 養成在命令行下工作:一定要養成在命令行下工作的習慣,要知道X-window只是運行在命令行模式下的一個應用程序。在命令行下學習雖然一開始進度較慢,但是熟悉後,您未來的學習之路將是以指數增加的方式增長的。從網管員來說,命令行實際上就是規則,它總是有效的,同時也是靈活的。即使是通過一條緩慢的數據機線路,它也能操縱幾千公里以外地遠程系統 選擇一個適合你的Linux社區:隨著Linux應用的擴展,出現了不少Linux社區。其中有一些非常優秀的社區。推薦適於初學者的Linux社區:Linux伊甸園,優秀linux+oracle技術門戶,中國Linux公社。 勤於實踐:要增加自己Linux的技能,只有通過實踐來實現了。所以,一定要在學習中勤於實踐,你會收獲更多 用Unix思維學習Linux:Linux是參照Unix思想設計的,理解掌握Linux必須按照Unix思維來進行。思想性的轉變比暫時性的技術提高更有用,因為他能幫助你加快學習速度。
『玖』 學習嵌入式的方法總結
基於微控制器的嵌入式系統的學習建議
首先,要明確為什麼要學習以MCU為核心的嵌入式應用技術。針對讀者不同的學習目的,學習嵌入式系統的方法和側重點略有不同。
MCU具有廣泛的應用范圍外,對於計算機、電子類、機電類等專業的工科學生來說,即使暫時沒有從事MCU的應用的開發,學習MCU也有很重要的意義。因為,MCU作為微型計算機的一個種類,麻雀雖小,五臟俱全,學習MCU可以更加理解微機原理,更加清楚計算機的脈絡。同時,目前嵌入式應用系統的軟體開發方法與一般的軟體開發方法已經融合,開發平台也極為相似。對於在校學生,學習嵌入式應用技術,主要以書本知識為主,理解嵌入式系統的原理和基本編程方式,為將來的學習和發展打好基礎。
對於將要投身嵌入式行業的技術人員而言,學習嵌入式系統的方法和側重點不同於在校的學生。不但學習過程中所需要的背景知識(包括數字電路、匯編語言基礎、軟體工程,甚至機械自動化)不可或缺,而且更要養成良好的做事規范和方法。學習的側重點主要放在較復雜的嵌入式應用系統上,對於嵌入式實時操作系統(包括µC/OS-Ⅱ、SmallRTOS、µCLinux等)在應用的基礎上,有一定深度的理解。但是,對於只分析實時操作系統或進行短期培訓性的驅動程序開發,不扎實進行嵌入式系統基礎知識的學習與軟體及硬體實踐,是不可能學好嵌入式系統的。
其次,學習以MCU為核心的嵌入式應用技術,要選擇入門的機型。MCU種類繁多,應用於各行各業,在應用中需要設計者對各種MCU都有所了解,以便確定最佳的性能價格比。但是不可能也沒有必要同時學習各種型號MCU的軟硬體知識,通常的方法是學習一種典型的MCU系列,達到實用程度,在應用中首先選擇使用該系列。如果確實要用其它系列MCU時,只需將兩種系列的不同點進行分析、對比,即可在較短時間內達到可以應用的程度。對於初學者,選擇入門的MCU系列,一定要選擇在國際上比較流行,系列比較齊全,在若干年內不會被淘汰,且抗干擾性強、性能價格比較高的產品。選擇Freescale公司HC08/S08系列的MCU具有這些特點。
第三,MCU指令系統不大,特別是關鍵字不多,學習時,在了解基本性能的前提下,可先把關鍵字及其含義記住,這樣,在以後的學習中可起到事半功倍的效果。這一點需強調一下,花上幾個單元時間記住主要關鍵字,對於入門學習很重要,沒有必要的記憶,任何知識也無法學習。本書採用匯編語言與C語言並行學習的方法,可以通過實例對比學習。所提供的例子均通過測試,可以作為對比學慣用例。也可以應用到實際開發系統中。
第四,學習以MCU為核心的嵌入式應用技術,一定要勤於實踐。必須通過實踐,理解MCU原理,掌握基本的編程規范與方法,才能學會設計應用系統。因此,一定要創造條件進行實踐,這是學好MCU極為關鍵的一環。特別是注意軟體與硬體相結合的實踐。MCU程序要固化,進入硬體才能執行,而且通過MCU的輸入輸出以及執行機構反映出來,這就涉及到硬體系統的構成,因此學習MCU與單純開發計算機軟體不同,必須了解MCU系統的構成。同時,通過軟體「打通」硬體,觀察硬體響應現象,體會軟體功能。一般8位機的硬體評估系統只有幾百元,特別是好的硬體評估系統都提供自我實踐硬體介面,購買硬體評估系統進行學習與實踐是一種好方法。
第五,學習以MCU為核心的嵌入式應用技術,必須與輸入輸出介面的學習連在一起。MCU系統離不開各種輸入輸出介面,學習MCU,就必須學習各種介面的原理,通過介面的輸入輸出體現MCU程序的功能。
第六,MCU的發展已經逐步走向成熟期,各種新技術的使用,進一步提高了MCU的性能價格比。技術進步不可避免的帶動了學習方法的更新。學習以MCU為核心的嵌入式應用技術,也要與時俱進,不斷改造自己的學習方式,保持與嵌入式應用技術發展的同步。例如:以前的嵌入式系統代碼量小,對於硬體的依賴性大,可移植性也就相對較差,規范的重要性基本無從體現。但隨著電子技術的發展,MCU的集成度越來越高。前幾年還處於實驗階段的Flash存儲器技術,目前已廣泛使用。MCU性能的提高使得開發人員不得不更重視規范的價值和作用。如今的嵌入式系統開發,不按照規范進行,簡直寸步難行。
第七,由於嵌入式系統市場巨大,潛力無限,全球的生產商都非常看好這一領域,紛紛投入了大量的人力物力;而圍繞嵌入式系統的研究、設計和開發正成為計算機技術發展最活躍的方向之一。近年來,國內外關於嵌入式系統的書籍如雨後春筍般涌現。選擇好的書籍已成為大多數初學者的當務之急。首先,讀者不要盲目跟風,要選擇適合自己真正需要的書籍。其次,讀者可以通過閱讀一些書中內容判斷該書是否值得購買。因為好的書籍對於問題的闡述一定是清楚明了的;對問題的解決一定是細致透徹的。對於當前非常火熱的各種嵌入式培訓形式,讀者不要盲目跟風,要充分和慎重的考慮自己學習嵌入式的目標和計劃。只有從底層抓起,一點一滴打好基礎,才能學好嵌入式技術。
以上幾點主要是對學習階段的建議,開發應用階段則必須重視理論與實踐的結合,積累實際經驗,探索應用規律和特點。特別要認識到,嵌入式應用技術是以MCU的軟硬體技術為核心的綜合技術,必須學會知識的分割與綜合,才能融會貫通。
『拾』 初學者如何學習嵌入式
作為一個新人,怎樣學習嵌入式Linux
原文鏈接:網頁鏈接
作為一個新人,怎樣學習嵌入式Linux?被問過太多次,特寫這篇文章來回答一下。
在學習嵌入式Linux之前,肯定要有C語言基礎。匯編基礎有沒有無所謂(就那麼幾條匯編指令,用到了一看就會)。C語言要學到什麼程度呢?越熟當然越好,不熟的話也要具備基本技能。比如寫一個數組排序、輸入數字求和什麼的。學C語言唯一的方法是多寫程序多練習,編譯出錯沒關系,自己去解決;執行出錯沒關系,自己去分析。以前我是用VC來練習C語言的,經常去嘗試著寫一些C語言競賽的題目。它們是純C、純數學、純邏輯的題目,不涉及界面這些東西,很適合煅煉你的編程能力。
回到主題,首先我們要明白你的目的是什麼,大概來說所謂嵌入式Linux可以分為兩部分:底層系統、應用開發。如果你是想做應用開發,那麼你去把C語言、數據結構、JAVA什麼的學好吧。嵌入式應用開發和PC上的應用開發並沒有什麼特別要注意的。也許你說在嵌入式上要做些優化,是的,要優化,但是未經優化的程序和PC上的程序開發沒什麼差別。另外,當你有能力去優化時,你已經不用來問這個問題了。具體到某個例子,比如說開發界面,在PC上我們用VC;在嵌入式Linux里也許我們用QT也許用Android,這個時候你應該去學學QT、Android的編程。但是基礎還是C或JAVA,在此基礎上去熟悉它們的介面。你學過VC的話,也是要花時間去了解那些類、控制項的。
如果你的目的是想學習底層系統,這是我的專長,倒是可以說一點。
在回答這個問題之前,我先回答:不少人問我,到底是學驅動還是學應用?
我只能說憑興趣,並且驅動和應用並不是截然分開的
我們說的驅動,其實並不局限於硬體的操作,還有操作系統的原理、進程的休眠喚醒調度等概念。 想寫出一個好的應用,想比較好的解決應用碰到的問題,這些知識你應該懂
做應用門檻低,特別是現在的ANDROID,純JAVA。做應用的發展路徑個人認為就是業務純熟。比如在通信行業、IPTV行業、手機行業,你了解行業的需求。所以,當領導的人,多是做應用的。
做驅動,其實我不想稱為「做驅動」,而是想稱為「做底層系統」,做好了這是通殺各行業。我工作幾年,做過手機、IPTV、會議電視,但是這些產品對我毫無差別,因為我只做底層。他們的業務跟我沒關系。當應用出現問題,他們解決不了時,我就會從內核角度給他們出主意,給他們提供工具。 做底層的發展方向,個人認為是技術專家。
其實,做底層還是做應用,之間並沒有一個界線,有底層經驗,再去做應用,你會感覺很踏實。有了業務經驗,你再了解一下底層,很快就可以組成一個團隊。
回到怎麼學的問題上。嵌入式Linux底層系統包含哪些東西?不要急,舉一個例子你就知道了。
電腦一開機,那些界面是誰顯示的?是BIOS,它做什麼?一些自檢,然後從硬碟上讀入windows,並啟動它。類似的,這個BIOS對應於嵌入式Linux里的bootloader。這個bootloader要去Flash上讀入Linux內核,並啟動它。
啟動windows的目的是什麼?當然是上網聊天什麼的了。這些上網、聊天工具在哪?
在C盤、D盤上。所以, windows要先識別出C盤、D盤。在Linux下我們稱為根文件系統。
windows能識別出C盤、D盤,那麼肯定能讀寫硬碟才行。這涉及的東西稱為驅動程序。當然不僅僅是硬碟,還有網卡、USB等等。嵌入式Linux能從Flash上讀出並執行應用程序,肯定也得有Flash的驅動程序啊,當然也不僅僅是Flash。
先說到這里吧,嵌入式LINUX里含有bootloader, 內核, 驅動程序、根文件系統這4大塊。
它就是一個稍微復雜的裸板程序。但是要把這裸板程序看懂寫好一點都不容易。Windows下好用的工具弱化了我們的編程能力。
很多人一玩嵌入式就用ADS、KEIL。你能回答這幾個問題嗎?
1. 一上電,CPU從哪裡取指令執行?
答:一般從Flash上指令。
2. 但是Flash一般是只能讀不能直接寫的,如果我用到全局變數,這些全局變數在哪裡?
答:全局變數應該在內存里
3. 那麼誰把全局變數放到內存里去?
答:長期用ADS、KEIL的朋友,你能回答嗎?這需要"重定位"。在ADS或KEIL里,重定位的代碼是製作這些工具的公司幫你寫好了。你可曾去閱讀過?
4. 內存那麼大,我怎麼知道把"原來存在Flash上的內容"讀到內存的"哪個地址去"?
答:這個地址用"鏈接腳本"決定,在ADS里有scatter文件,KEIL里也有類似的文件。但是,你去研究過嗎?
5. 你說重定位是把程序從Flash復制到內存,那麼這個程序可以讀Flash啊?
答:是的,要能操作Flash。當然不僅僅是這些,還有設置時鍾讓系統運行得更快等等。
自問自答到這里吧,bootloader這一個裸板程序,其實有3部分要點:
對硬體的操作
對ARM體系處理器的了解
程序的基本概念:重定位、棧、代碼段數據段BSS段什麼的。
對硬體的操作,需要看原理圖、晶元手冊。這需要一定的硬體知識,不求你能設計硬體,但是至少能看懂; 不求能看懂模擬電路,但是要能看懂數字電路。這方面的能力我是在學校里學到的,微機原理、數字電路這2本書(書名忘了)就足夠了。但是我懷疑你有無耐心把這2本書看完。我不知道現在有沒有更快捷的書。想速成的話,就先放掉這塊吧,不懂就問GOOGLE、發貼。
另外,晶元手冊是肯定要讀的,別去找中文的,就看英文的。開始是非常痛苦,以後就會發現那些語法、詞彙一旦熟悉後,讀任何晶元手冊都很容易。對ARM體系處理器的了解, 看杜春蕾的<ARM體系架構與編程>吧,裡面講有匯編指令,有異常模式、MMU等。也就這3塊內容需要你了解。
程序的基本概念,王道當然是去看編譯原理了。可惜,這類書絕對是天書級別的。勸你若非超級天才還是別去看了。就看我寫的<嵌入式Linux應用開發完全手冊>和第1期視頻吧,別擔心,不用花錢。照著視頻把硬體相關的實驗做了,這些概念就清楚了。我還沒有
發現第2套講這些概念的書或視頻。
對於bootloader,我學習時是先看了<ARM體系架構與編程>,然後自己寫程序把各個硬體的實驗都做了一遍,比如GPIO、時鍾、SDRAM、UART、NAND。把它們都弄清楚了,組台在一起就很容易看懂u-boot了
總結一下,看懂硬體原理圖、看晶元手冊,這需要你自己去找資料。剩下的,就按<嵌入式Linux應用開發完全手冊>和第1期視頻的章節目錄去學習吧。
想速成的人,先跨過內核的學習,直接學習怎麼寫驅動。
想成為高手,內核必須深刻了解。注意,我說的是了解,我沒奢望去寫出一個內核。
要對裡面的調度機制、內存管理機制、文件管理機制等等有所了解。
推薦兩本書:
1. 通讀<linux內核完全注釋>,請看薄的那本(浮燥的社會講求速度, 呵),
2. 選讀<Linux內核情景分析>, 想了解哪一塊就讀哪一節
驅動包含兩部分:硬體本身的操作、驅動程序的框架。
又是硬體,還是要看得懂原理圖、讀得懂晶元手冊,多練吧。
說到驅動框架,有一些書介紹一下。LDD3,即<Linux設備驅動>,老外寫的那本,裡面介紹了不少概念,值得一讀。但是,它的作用也就限於介紹概念了。我基本上是入門之前用它來熟悉一下概念,入門後就扔掉了。
驅動方面比較全的介紹,應該是宋寶華的<linux設備驅動開發詳解>了,老實說我只看過目錄,有不少人說好,這里推薦一下。要想深入了解某一塊,<Linux內核情景分析>絕對是超5星級推薦。你別指望把它讀完,1800多頁,上下兩冊呢。我是某一塊不清楚時,就去翻一下它。任何一部分,這書都可以講上2、3百頁,非常詳細。並且是以某個目標來帶你分析內核源碼。它以linux 2.4為例,但是原理相通,同樣適用於其它版本的linux。
還有沒有其他介紹?呵呵,當然有了,韋東山Linux視頻第2期。<嵌入式Linux應用開發完全手冊>里對驅動講得不多,不夠深入。於是我錄制了這期視頻。不僅僅教你怎麼寫怎麼改驅動,還教你為什麼這樣寫這樣改驅動。
每一個驅動都是現場編寫:
用繪圖板畫圖講解──相當於學校里老師在黑板上畫圖講解,很直觀絕對不是對著PPT念。
用source insight當場寫程序,從第1行開始寫,每一課都是這樣。我講了20多個驅動,就寫了20多個程序。
寫完就編譯、測試。
很全面,字元設備驅動、塊設備、網卡驅動3大類齊全,硬體介紹、驅動框架分析、測試3大類齊全。
培訓機構里教的內容,遠不及這期視頻豐富。我在多個培訓機構講過課,從沒看到哪個老師敢每一課都當場講解當場編寫代碼,當場測試,除我之外!也沒看到哪個培訓機構講完這些內容──因為時間不夠,講完起碼要一個月,但是這部分基本只有2周授課時間。
把你手上的開發板所涉及的硬體,都去嘗試寫一個驅動吧。有問題就先"痛苦地思考",思考的過程中你會把很多不相關的知識串聯起來,最終貫通。
大家有沒有想過這2個問題:
1. 對於Linux做出來的產品,有些用作監控、有些做手機、有些做平板。那麼內核啟動後,掛載根文件系統後,應該啟動哪一個應用程序呢?
答:內核不知道也不管應該啟動哪一個用戶程序。它只啟動init這一個應用程序,它對應/sbin/init。顯然,這個應用程序就要讀取配置文件,根據配置文件去啟動用戶程序(監控、手冊界面、平板界面等等)這個問題提示我們,文件系統的內容是有一些約定的,比如要有/sbin/init,要有配置文件
2. 你寫的hello,world程序,有沒有想過裡面用到的printf是誰實現的?
答:這個函數不是你實現的,是庫函數實現的。它運行時,得找到庫。這個問題提示我們,文件系統里還要有庫。
簡單的自問自答到這里,要想深入了解,可以看一下busybox的init.c,就可以知道init進程做的事情了。當然,也可以看<嵌入式Linux應用開發完全手冊>里構建根文件系統那章。
我在學校時讀的是物理電子專業,其實課程里沒有教怎麼設計電路,只是教了些電子電路方面的知識。PCB的設計是在實驗室里自學的,只設計過2層板,現在忘記得差不多了。但是保留了看原理圖、看晶元手冊的能力。
選修了軟體學位,對軟體設計挺感興趣,但是也只是學了C語言、資料庫而已。憑著興趣做了不少競賽題。沒能力去參加競賽,但是把C語言練得很扎實。
在實驗室、在第1家公司,就是設計些簡單的PCI卡,寫一下windows的驅動程序
在第2家公司,用51單片機做車載電話,開始走上純軟體的道路。
開始感到單片機的不足,辭職半年閉門學Linux,從red hat怎麼操作開始。步驟就是先看<ARM體系架構與編程>,再自己寫裸板程序操作硬體,接著到分析u-boot。同時看<linux內核完全注釋>,對LINUX框架有所了解。在寫裸板時,建議各位加強對中斷的理解,內核就是用中斷來完成各種功能的。
分析完u-boot,就開始進行簡單的驅動編程了,這時候,能力還很弱。
開始去中興上班,工作2年,編寫各類驅動、解決各類問題(驅動問題、幫助定位應用問題),能力得到煅煉。
1. 硬體方面的書: 微機原理、數字電路,高校里的教材。畢業多年,忘名了。
2. Linux方面的書:
<ARM體系架構與編程>
<嵌入式Linux應用開發完全手冊>
<Linux設備驅動>,老外寫的那本
<linux設備驅動開發詳解>
<linux內核完全注釋>
<Linux內核情景分析>
3. 視頻:
韋東山Linux視頻第1期(基於S3C2440錄制): ARM實驗,u-boot,文件系統,初級驅動
韋東山Linux視頻第1期(基於S3C6410錄制): 裸板程序
韋東山Linux視頻第2期: 高級驅動
韋東山Linux視頻第3期:項目實戰
韋東山Linux視頻第4期:Android驅動
視頻信息請看網頁鏈接
————————————————
版權聲明:本文為博主「韋東山」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/thisway_diy/article/details/51887326