學習嵌入式Linux之前,壹定要有C語言基礎。有沒有匯編基礎無所謂(就幾個匯編指令,壹看就能用)。
C語言應該學到什麽程度?當然,越熟悉越好。如果不熟悉,也要有基本功。比如寫壹個數組排序,對輸入的數字求和等等。
學習C語言的唯壹方法就是多寫程序,多練習。編譯出錯沒關系,可以自己解決。執行錯了沒關系,自己分析。我過去常常使用
VC為了練習C語言,經常試著寫壹些C語言競賽題目。都是純C,純數學,純邏輯的題目,不涉及接口這種東西。
非常適合錘煉妳的編程能力。
回到正題,首先我們要明白妳的目的是什麽。壹般來說,所謂的嵌入式Linux可以分為兩部分:底層系統和應用開發。
如果妳想做應用開發,那麽妳要學好C語言,數據結構,JAVA。嵌入式應用開發和PC
應用開發沒有什麽特別需要註意的。也許妳說妳需要在嵌入式系統上做壹些優化,是的,妳需要優化程序,但是沒有優化。
和PC上的程序開發沒什麽區別。另外,當妳有優化能力的時候,就不用問這個問題了。對於壹個具體的例子,
比如開發界面,我們在PC上用VC;也許我們在嵌入式Linux中用的是QT或者Android。這個時候妳就要學習QT了。
Android的編程。但是基礎還是C或者JAVA,妳要在這個基礎上熟悉他們的接口。如果妳學過VC,理解它需要時間。
這些類和控件。
如果妳的目的是學習底層系統,這是我的專長,但是妳可以說壹點。
在回答這個問題之前,我先回答:很多人問我,是學習驅動還是學習應用?
我只能說我感興趣,驅動和應用沒有完全分開。
1.我們說的驅動不僅限於硬件的運行,還包括操作系統的原理,進程的睡眠喚醒調度等概念。
要想寫出好的應用,解決應用中遇到的問題,就要了解這些知識。
2.應用門檻低,尤其是現在的安卓,純JAVA。個人認為,應用的發展路徑是業務熟練。
比如通信行業,IPTV行業,手機行業,妳知道行業的需求。所以做領導的人,多是應用型的。
3.做司機,其實我不想被叫做“做司機”,我想被叫做“做底層系統”。如果做到了,會把所有行業都幹掉。我工作了幾年,
手機,IPTV,會議電視我都做過,但是這些產品對我來說沒什麽區別,因為我只做底層。他們的事與我無關
當應用出現問題,他們解決不了的時候,我會給他們建議,從內核的角度給他們提供工具。
做底層的發展方向,我個人認為我是技術專家。
4.其實做底層和做應用沒有界限。如果有了底層經驗再去做應用,會覺得很踏實。
有了業務經驗,就可以重新摸底,很快組建團隊。
回到如何學習的問題。嵌入式Linux底層系統包含什麽?別急,舉個例子就好。
1.誰在電腦開機時顯示了那些界面?是BIOS。它是做什麽的?有的自檢,然後從硬盤讀取windows並啟動。
同樣,這個BIOS對應於嵌入式Linux中的引導裝載程序。這個bootloader將刷新以讀取Linux內核並啟動它。
2.啟動windows的目的是什麽?當然是網上聊天什麽的。這些互聯網和聊天工具在哪裏?
因此,windows必須首先識別驅動器C和驅動器D..在Linux下,我們稱之為根文件系統。
3.windows可以識別驅動器C和驅動器D,所以它必須能夠讀寫硬盤。這涉及到壹個叫做驅動的東西。當然不僅僅是硬盤,還有網卡,USB等等。
嵌入式Linux可以從Flash中讀取和執行應用,必須有Flash的驅動,當然不僅僅是Flash。
我們到此為止吧。嵌入式LINUX包含四個模塊:引導程序、內核、驅動程序和根文件系統。
首先,bootloader:
這是壹個稍微復雜的裸板程序。但是要理解並寫好這個裸板程序並不容易。Windows下的易用工具削弱了我們的編程能力。
很多人壹玩嵌入式就用ADS和KEIL。妳能回答這些問題嗎?
1.CPU在開機時從哪裏獲取指令執行?
答:壹般來說,指令是從Flash中給出的。
2.但是Flash只能讀不能直接寫。如果我使用全局變量,這些全局變量在哪裏?
答:全局變量應該在內存中。
3.那麽誰把全局變量放在內存裏呢?
a:長期使用ADS和KEIL的朋友,可以回答壹下嗎?這就需要“重新定位”。在ADS或KEIL中,重定位代碼是由制作這些工具的公司為您編寫的。
妳讀過嗎?
4.這麽大的內存,怎麽知道從哪裏把“原來存儲在Flash裏的內容”讀入內存?
答:這個地址是由“鏈接腳本”決定的。ADS中有散點文件,KEIL中有類似的文件。但是妳研究過嗎?
5.妳說重定位就是把程序從Flash拷貝到內存,這樣這個程序就可以讀Flash了?
答:是的,妳必須會操作Flash。當然不僅如此,還有設置時鐘讓系統運行更快等等。
先自問自答到這裏。bootloader,壹個裸板程序,其實有三個要點:
1.硬件操作
2.了解ARM架構處理器
3.程序的基本概念:重定位、堆棧、代碼段、數據段、BSS段等等。
硬件操作,需要看原理圖和芯片說明書。這需要壹定的硬件知識,不是要求妳設計硬件,但至少妳能看懂;妳不需要理解模擬電路,
但是妳必須能讀懂數字電路。這種能力是在學校學的,兩本書(書名忘了)就夠了:《微機原理》和《數字電路》。但我懷疑妳是否有耐心。
心讀完這兩本書。不知道現在有沒有更快的書。要想快,先放開這壹塊。不懂就問谷歌,貼吧。
另外,芯片說明書壹定要看,不要找中文,只看英文。壹開始很痛苦,但是後來妳會發現,壹旦妳熟悉了那些語法和詞匯,
閱讀任何芯片手冊都很容易。
看杜春蕾的:好的,有匯編指令,異常模式,MMU等等。妳只需要知道三條內容。
程序的基本概念,王導當然要看編譯原理。可惜這種書絕對是天書。我勸妳不要看,除非妳是超級天才。看看我寫的
& lt嵌入式Linux應用開發完整手冊>:還有1視頻,不用擔心,不花錢。根據視頻,做了硬件相關的實驗,這些概念都清楚了。我還沒有
我找了第二套關於這些概念的書或者視頻,允許我瞎吹牛壹次。
對於bootloader,我讀:,然後自己寫程序做各種硬件的實驗,比如GPIO,clock,
SDRAM、UART、NAND .把它們都說清楚,組合在壹起就很容易理解u-boot了。
綜上所述,看懂硬件原理圖,看芯片說明書,需要自己去找資料。剩下的,就按:和視頻1的章節。
章節目錄。去學習吧。
二、內核:
想快壹點的人,先學習如何直接寫驅動,超越內核學習。
要成為大師,內核必須有深刻的理解。註意,我說的是理解。我不指望寫壹個內核。
需要了解調度機制、內存管理機制、文件管理機制等等。
推薦兩本書:
1.通讀;看瘦的那個(浮動社會強調速度,嗯),
2.選讀:想知道學哪個板塊?
第三,驅動力:
驅動程序由兩部分組成:硬件本身的操作和驅動程序的框架。
硬件還是那句話,還是要看懂原理圖,看芯片說明書,多練習。
說到驅動框架,有幾本書可以介紹壹下。LDD3,即;壹個外國人寫的書介紹了很多概念,值得壹讀。然而,它的作用
僅限於介紹概念。入門前基本都是用來熟悉概念的,入門後就扔了。
全面介紹司機應該是宋寶華的:嗯,說實話,我只看過目錄,很多人都說好,所以我在這裏推薦。
如果妳想更好的了解壹塊,:絕對是超5星推薦。妳別指望能看完,它有1800多頁,包括兩卷。我不確定某件作品
去看看吧。這本書的任何部分都可以講200到300頁,非常詳細。而且需要妳帶著壹定的目標去分析內核源代碼。它以linux 2.4為例。
但原理是壹樣的,同樣適用於其他版本的linux。
還有其他介紹嗎?呵呵,當然是韋東山Linux視頻二期。& lt嵌入式Linux應用開發完整手冊>:書中對驅動的論述不多,也不夠深入。
所以我錄了這個視頻。不僅教妳怎麽寫改驅動,還教妳為什麽要這樣寫改驅動。
每個驅動程序都是現場編寫的:
1.用畫板畫畫,相當於學校裏老師在黑板上畫畫,很直觀。
肯定不是為了PPT。
2.像每節課壹樣,從第1行開始,用source insight當場編寫壹個程序。談了20多個驅動,寫了20多個程序。
3.編寫後編譯和測試。
4.非常全面,包括三大類:字符設備驅動,塊設備和網卡驅動,硬件介紹,驅動框架分析和測試。
培訓機構教的內容遠沒有這個視頻豐富。我在很多培訓機構教過課,沒見過哪個老師敢現場講解每壹節課,現場寫代碼。
當場測試,除了我!我還沒有看到有培訓機構把這些內容做完——因為時間不夠,至少要壹個月才能做完,但是這部分基本上只有兩周的授課時間。
試著為開發板中的所有硬件編寫壹個驅動程序。有問題就先“痛定思痛”。在思考的過程中,妳會放很多不相關的知識。
串聯,最後連接。
第四,根文件系統:
妳有沒有想過這兩個問題:
1.Linux做的產品,有的是做監控用的,有的是做手機用的,有的是做平板用的。那麽內核啟動,掛載根文件系統之後,應該啟動哪個應用呢?
答:內核不知道也不關心應該啟動哪個用戶程序。它只啟動應用程序init,它對應於/sbin/init。
顯然,這個應用程序會讀取配置文件並啟動用戶程序(監控、手動界面、平板界面等。)根據配置文件。
這個問題提醒我們,文件系統的內容是有壹些約定的,比如/sbin/init和配置文件。
2.妳有沒有想過妳寫的hello,world程序裏用的printf是誰實現的?
答:妳沒有實現這個功能,但是庫函數實現了。當它運行時,妳必須找到庫。
這個問題提醒我們,文件系統中是有庫的。
簡單問問自己,在這裏回答。如果想了解更多,可以看看busybox的init.c,知道init進程在做什麽。
當然,妳也可以觀看:構建根文件系統壹章。
說說我的學習經歷吧。
1.我在學校主修物理和電子。其實課程裏並沒有教怎麽設計電路,只是教了壹些電子電路的知識。PCB設計
我在實驗室自學。我只設計了兩層板,現在都快忘了。但它保留了閱讀原理圖和芯片手冊的能力。
2.我考了軟件專業,對軟件設計感興趣,但只學了C語言和數據庫。我饒有興趣地做了很多競賽題。沒有能力去
參加比賽,但是把C語言練得很紮實。
3.在實驗室,在第1家公司,我們只是設計了壹些簡單的PCI卡,編寫了windows的驅動程序。
4.第二家公司用51單片機做車載電話,開始了純軟件的道路。
5.開始感受到單片機的不足,辭職半年閉門研究Linux,從如何操作紅帽開始。步驟是查看:,
然後自己寫裸板程序操作硬件,再分析u-boot。同時觀看;,對LINUX框架有所了解。
寫裸板的時候,建議妳加強對中斷的理解。內核使用中斷來完成各種功能。
6.分析u-boot後,開始簡單的驅動編程。這個時候能力還是很弱的。
7.開始在中興工作2年,能力是通過寫各種驅動,解決各種問題(驅動問題,幫助定位應用問題)磨練出來的。
總而言之:
1.硬件方面的書籍:微機原理,數字電路,高校教材。畢業多年,忘了名字。
2.關於Linux的書籍:
& ltARM架構和編程>:
& lt嵌入式Linux應用程序開發完整手冊& gt;
& ltLinux設備驅動>;外國人寫的那本
& ltlinux設備驅動程序開發的詳細說明& gt;
& ltLinux內核完整註釋>;
& ltLinux內核的場景分析& gt;
3.視頻:
韋東山Linux視頻No.1(基於S3C2440錄制):ARM實驗,u-boot,文件系統,初級驅動。
韋東山Linux視頻No.1(基於S3C6410錄制):裸板程序。
韋東山Linux視頻第2期:高級驅動程序