嵌入式學習路線

1、Linux 基礎
安裝Linux操作系統

Linux文件系統

Linux常用命令

Linux啓動過程詳解

熟悉Linux服務能夠獨立安裝Linux操作系統

能夠熟練使用Linux系統的基本命令

認識Linux系統的常用服務安裝Linux操作系統

Linux基本命令實踐

設置Linux環境變量

定製Linux的服務

Shell 編程基礎使用vi編輯文件

使用Emacs編輯文件使用其他編輯器

2

認識後臺程序Bash編程熟悉Linux系統下的編輯環境熟悉Linux下的各種Shell 熟練進行shell編程熟悉vi基本操作 熟悉Emacs的基本操作比較不同shell的區別 編寫一個測試服務器是否連通的shell腳本程序編寫一個查看進程是否存在的shell腳本程序 編寫一個帶有循環語句的shell腳本程序

3、Linux 下的 C 編程基礎
linux C語言環境概述 Gcc使用方法 Gdb調試技術 Autoconf Automake Makefile 代碼優化 熟悉Linux系統下的開發環境熟悉Gcc編譯器 熟悉Makefile規則編寫Hello,

chi dazzle,World程序 使用 make命令編譯程序 編寫帶有一個循環的程序調試一個有問題的程序
4、嵌入式系統開發基礎
嵌入式系統概述 交叉編譯 配置TFTP服務 配置NFS服務下載Bootloader和內核 嵌入式Linux應用軟件開發流程熟悉嵌入式系統概念以及開發流程建立嵌入式系統開發環境製作cross_gcc工具鏈 編譯並下載U-boot 編譯並下載Linux內核 編譯並下載Linux應用程序
4、嵌入式系統移植
Linux內核代碼 平臺相關代碼分析 ARM平臺介紹 平臺移植的關鍵技術 移植Linux內核到 ARM平臺 瞭解移植的概念 能夠移植Linux內核移植Linux2.6內核到 ARM9開發板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念 嵌入式Linux應用軟件開發流程 Linux系統的文件和設備 與文件相關的系統調用 配置超級終端和MiniCOM能夠熟悉進行串口通信熟悉文件I/O 編寫串口通信程序 編寫多串口通信程序
6、嵌入式系統中多進程程序設計
Linux系統進程概述 嵌入式系統的進程特點 進程操作 守護進程 相關的系統調用瞭解Linux系統中進程的概念能夠編寫多進程程序編寫多進程程序 編寫一個守護進程程序 sleep系統調用任務管理、同步與通信 Linux任務概述任務調度 管道 信號 共享內存 任務管理 API 瞭解Linux系統任務管理機制 熟悉進程間通信的幾種方式 熟悉嵌入式Linux中的任務間同步與通信編寫一個簡單的管道程序實現文件傳輸編寫一個使用共享內存的程序
7、嵌入式系統中多線程程序設計
線程的基礎知識 多線程編程方法 線程應用中的同步問題了解線程的概念 能夠編寫簡單的多線程程序編寫一個多線程程序
8、嵌入式 Linux 網絡編程
網絡基礎知識 嵌入式Linux中TCP/IP網絡結構 socket 編程 常用 API函數 分析Ping命令的實現 基本UDP套接口編程 許可證管理PPP協議 GPRS 瞭解嵌入式Linux網絡體系結構能夠進行嵌入式Linux環境下的socket 編程 熟悉UDP協議、PPP協議 熟悉GPRS 使用socket 編寫代理服務器 使用socket 編寫路由器 編寫許可證服務器指出TCP和UDP的優缺點 編寫一個web服務器 編寫一個運行在 ARM平臺的網絡播放器
9、GUI 程序開發
GUI基礎 嵌入式系統GUI類型 編譯QT 進行QT開發熟悉嵌入式系統常用的GUI 能夠進行QT編程使用QT編寫“Hello,World”程序 調試一個加入信號/槽的實例 通過重載QWidget 類方法處理事件
10、Linux 字符設備驅動程序
設備驅動程序基礎知識 Linux系統的模塊 字符設備驅動分析 fs_operation結構 加載驅動程序瞭解設備驅動程序的概念 瞭解Linux字符設備驅動程序結構能夠編寫字符設備驅動程序編寫Skull驅動 編寫鍵盤驅動 編寫I/O驅動分析一個看門狗驅動程序 對比Linux2.6內核與2.4內核中字符設備驅動的不同Linux 塊設備驅動程序塊設備驅動程序工作原理 典型的塊設備驅動程序分析 塊設備的讀寫請求隊列了解Linux塊設備驅動程序結構 能夠編寫簡單的塊設備驅動程序比較字符設備與塊設備的異同 編寫MMC卡驅動程序 分析一個文件系統 對比Linux2.6內核與2.4內核中塊設備驅動的不同
11、文件系統
虛擬文件系統 文件系統的建立 ramfs內存文件系統 proc文件系統 devfs 文件系統 MTD技術簡介 MTD塊設備初始化 MTD塊設備的讀寫操作了解Linux系統的文件系統瞭解嵌入式Linux的文件系統 瞭解MTD技術 能夠編寫簡單的文件系統爲 ARM9開發板添加 MTD支持 移植JFFS2文件系統通過proc文件系統修改操作系統參數 分析romfs 文件系統源代碼創建一個cramfs 文件系統 、Shell 編程基礎
Shell簡介

 

<二>

 

 學習掌握嵌入 Linux 的開發與移植 現在非常流行。
   各種學習文章與培訓班,充斥書店 街頭。

   筆者 也上了路,經歷漫長的摸索,終於一日開竅,但的確 糟蹋了 很多 金錢與時間。 作爲窮人,現寫下自己的感受,供好學寒士 參考。

第一要點: 實驗重於看書 (多編碼,少翻書)
一定首先搭建x86實驗環境。
用舊計算機(週末電腦城拋售存貨,有新的),搭建一套 實驗環境。
host主機: 一臺PC機(能夠跑redhat linux,看問檔 就可以了,配網卡與軟驅)。
target目標機: 一塊舊PC主板,配一張網卡和一個軟驅,電源。
附件: 交網線 ,交串口線

夠了,不會超過3千元(已經很滿足了)。

軟件全部到 電腦城/網站 下載。

先不管什麼arm ppc mips, 以後看看文檔吧。

第二重點:GNU C編譯
在PC 上安裝 redhat linux 包括 開發工具。
熟悉linux 的配置命令。

練習 linux 的 C 語言編程,多個程序的編譯工程製作。
無聊的話,將C語言教材的例程,編譯十幾個,熟悉GNU 編譯器。www.gnu.org
包括gcc make ld objdump ar 等 GNU toolkit

第三重點:realtime linux 內核編程/加載到目標板運行。
1。 下載 rt-linux ,或uclinux 或什麼 非 redhat的linux 源碼,一定 是包括,編譯工程makefile, 並且for x86 PC的。
2。修改和配置程序,將 rtlinux的 標準 console口 改爲串口,不是vga與鍵盤。
3。在redhat linux 環境下,編譯 這個 embedded linux內核。
用mkboot的這樣程序(或按代碼中工具,) 將編譯好的內核執行文件 拷貝定位軟盤引導區。

4。用這張軟盤引導在目標PC主板 。
在PC主機的 串口終端上配置 PC主板目標機。 效果同 redhat linux terminal console一樣。

以後越來月難,堅持。

第四個重點 編譯跑通網卡的驅動程序
下載編譯 你的網卡驅動源碼
跑通 主機與目標機的 網絡通訊。
不要太動頭想, ping 通就是了。

第五個重點 用tftp 下載執行文件從 PC主機 到 目標機運行。

第六個重點 GNU GDB 遠程在線調試(網口調試)

第七個重點 實時內核學習/修改
照文章/書 分析調試/破壞 內核的源碼。
主要是 調度/消息/存儲/文件/進程/線程/互斥 等

單獨跑跑, 瞭解內核功能就是了。

第八個重點 TCP/IP的學習
下載一個 簡單的web server (http server)
學習理解,並編譯加載運行。
將 PC主板目標機 看作網站服務器,然後在PC主機的網絡瀏難器中 訪問這個 web server.
有興趣,把你的照片加載到目標機的 html網頁中。
www.zebra.org

第九個重點 網卡驅動程序分析
瞭解 PCI總線原理,嘗試獨立寫點網卡驅動程序,過濾以太報文的處理。 跟蹤處理 特殊的報文。

第十個重點USB和 FLASH文件系統練習。(可以跳過)
可以分析修改 USB與FLASH文件系統源碼。
一定要分析源碼,上網查 FLASH的型號。

第十一個重點 路由器實驗。
分析zebra方面的源碼,再買一張網卡。
嘗試分析 NAT RIP等協議,將你的PC板目標機,變成一臺簡單的路由器。

以後的實驗 需要根據 行業來,
例如,mini-GUI (圖形編程),或 DVR (硬盤錄象機),或IP Vedio WebTV 服務器。

可以玩好幾年,當然最好找工作前,有針對地做實驗。

一句話,動手修改編碼,不要只看看。

 

 

 

 

<三>

 

嵌入式Linux操作系統學習規劃
ARM+LINUX路線,主攻嵌入式Linux操作系統及其上應用軟件開發目標:
(1) 掌握主流嵌入式微處理器的結構與原理(初步定爲arm9)
(2) 必須掌握一個嵌入式操作系統 (初步定爲uclinux或linux,版本待定)
(3) 必須熟悉嵌入式軟件開發流程並至少做一個嵌入式軟件項目。
從事嵌入式軟件開發的好處是:
(1)目前國內外這方面的人都很稀缺。這一領域入門門檻較高,所以非專業IT人員很難切入這一領域;另一方面,是因爲這一領域較新,目前發展太快,大多數人無條件接觸。
(2)與企業計算等應用軟件不同,嵌入式領域人才的工作強度通常低一些(但收入不低)。
(3)哪天若想創業,搞自已的產品,嵌入式不像應用軟件那樣容易被盜版。硬件設計一般都是請其它公司給訂做(這叫“貼牌”:OEM),都是通用的硬件,我們只管設計軟件就變成自己的產品了。
(4)興趣所在,這是最主要的。
從事嵌入式軟件開發的缺點是:
(1)入門起點較高,所用到的技術往往都有一定難度,若軟硬件基礎不好,特別是操作系統級軟件功底不深,則可能不適於此行。
(2)這方面的企業數量要遠少於企業計算類企業。
(3)有少數公司經常要碩士以上的人搞嵌入式,主要是基於嵌入式的難度。但大多數公司也並無此要求,只要有經驗即可。
(4)平臺依託強,換平臺比較辛苦。
興趣的由來:
1、成功觀念不同,不虛度此生,就是我的成功。
2、喜歡思考,挑戰邏輯思維。
3、喜歡C
C是一種能發揮思維極限的語言。關於C的精神的一些方面可以被概述成短句如下:
相信程序員。
不要阻止程序員做那些需要去做的。
保持語言短小精幹。
一種方法做一個操作。
使得它運行的夠快,儘管它並不能保證將是可移植的。
4、喜歡底層開發,討厭vb類開發工具(並不是說vb不好)。
5、發展前景好,適合創業,不想自己要死了的時候還是一個工程師。
方法步驟:
1、基礎知識:
目的:能看懂硬件工作原理,但重點在嵌入式軟件,特別是操作系統級軟件,那將是我的優勢。
科目:數字電路、計算機組成原理、嵌入式微處理器結構。
彙編語言、C/C++、編譯原理、離散數學。
數據結構和算法、操作系統、軟件工程、網絡、數據庫。
方法:雖科目衆多,但都是較簡單的基礎,且大部分已掌握。不一定全學,可根據需要選修。
主攻書籍:the c++ programming language(一直沒時間讀)、數據結構-C2。

2、學習linux:
目的:深入掌握linux系統。
   方法:使用linux—〉linxu系統編程開發—〉驅動開發和分析linux內核。先看深,那主講原理。看幾遍後,看情景分析,對照深看,兩本交叉,深是綱,情是目。剖析則是0.11版,適合學習。最後深入代碼。
主攻書籍:linux內核完全剖析、unix環境高級編程、深入理解linux內核、情景分析和源代。
3、學習嵌入式linux:
目的:掌握嵌入式處理器其及系統。
方法:(1)嵌入式微處理器結構與應用:直接arm原理及彙編即可,不要重複x86。
   (2)嵌入式操作系統類:ucOS/II簡單,開源,可供入門。而後深入研究uClinux。
   (3)必須有塊開發板(arm9以上),有條件可參加培訓(進步快,能認識些朋友)。
   主攻書籍:毛德操的《嵌入式系統》及其他arm9手冊與arm彙編指令等。

4、深入學習:
   A、數字圖像壓縮技術:主要是應掌握MPEG、mp3等編解碼算法和技術。
   B、通信協議及編程技術:TCP/IP協議、802.11,Bluetooth,GPRS、GSM、CDMA等。
   C、網絡與信息安全技術:如加密技術,數字證書CA等。
   D、DSP技術:Digital Signal Process,DSP處理器通過硬件實現數字信號處理算法。
   說明:太多細節未說明,可根據實際情況調整。重點在於1、3,不必完全按照順序作。對於學習c++,理由是c++不只是一種語言,一種工具,她還是一種藝術,一種文化,一種哲學理念、但不是拿來炫耀得東西。對於linux內核,學習編程,讀一些優秀代碼也是有必要的。
   注意: 要學會舉一反多,有強大的基礎,很多東西簡單看看就能會。想成爲合格的程序員,前提是必須熟練至少一種編程語言,並具有良好的邏輯思維。一定要理論結合實踐。
   不要一味鑽研技術,雖然擠出時間是很難做到的,但還是要留點餘地去完善其他的愛好,比如宇宙,素描、機械、管理,心理學、遊戲、科幻電影。還有一些不願意做但必須要做的!
   技術是通過編程編程在編程編出來的。永遠不要夢想一步登天,不要做浮躁的人,不要覺得路途漫上。而是要編程編程在編程,完了在編程,在編程!等機會來了在創業(不要相信有奇蹟發生,盲目創業很難成功,即便成功了發展空間也不一定很大)。

   嵌入式書籍推薦
   Linux基礎
   1、《Linux與Unix Shell 編程指南》
   C語言基礎
   1、《C Primer Plus,5th Edition》【美】Stephen Prata着
   2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)着
   3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
   4、《嵌入式Linux應用程序開發詳解》
   Linux內核
   1、《深入理解Linux內核》(第三版)
   2、《Linux內核源代碼情景分析》毛德操 胡希明著
   研發方向
   1、《UNIX Network Programming》(UNP)
   2、《TCP/IP詳解》
   3、《Linux內核編程》
   4、《Linux設備驅動開發》(LDD) 
   5、《Linux高級程序設計》 楊宗德著
   硬件基礎
   1、《ARM體系結構與編程》杜春雷着
   2、S3C2410 Datasheet
   英語基礎
   1、《計算機與通信專業英語》
   系統教程
   1、《嵌入式系統――體系結構、編程與設計》
   2、《嵌入式系統――採用公開源代碼和StrongARM/Xscale處理器》毛德操 胡希明着
   3、《Building Embedded Linux Systems》   
   4、《嵌入式ARM系統原理與實例開發》 楊宗德著
   理論基礎
   1、《算法導論》
   2、《數據結構(C語言版)》
   3、《計算機組織與體系結構?性能分析》
   4、《深入理解計算機系統》【美】Randal E. Bryant David O''Hallaron着
   5、《操作系統:精髓與設計原理》
   6、《編譯原理》
   7、《數據通信與計算機網絡》
   8、《數據壓縮原理與應用》

   C語言書籍推薦
   1. The C programming language 《C程序設計語言》
   2. Pointers on C 《C和指針》
   3. C traps and pitfalls 《C陷阱與缺陷》
   4. Expert C Lanuage 《專家C編程》
   5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs
   《編程精粹--Microsoft 編寫優質無錯C程序祕訣》
   6. Programming Embedded Systems in C and C++ 《嵌入式系統編程》
   7.《C語言嵌入式系統編程修煉》
   8.《高質量C++/C編程指南》林銳
   儘可能多的編碼,要學好C,不能只注重C本身。算法,架構方式等都很重要。

 

這裏很多書其實是推薦而已,不必太在意,關鍵還是基礎,纔是重中之重!!!

 

 

 

 

<四>

嵌入式Linux學習的基本的原則是通學+專長。
 
    通學,即瞭解該方向的相關領域,但是“通”不等於“泛”,對待學習應該舉一反三,把握事物的本質。如果能用通用的思想去解決問題,那麼纔算學有小成。比如,五一學習Mark Balch的《COMPLETE DIGITAL DESIGN》後,對嵌入式系統在上電之後,軟硬件如何配合工作有了更深入的理解。雖然這本書不是介紹嵌入式系統,但是很多技術是通用的。有開放的思維,把握自己研究的中心,把其他領域的方法思想吸收過來爲我所用,這樣可以對研究中心有更爲深入的認識。
 
    專長,即研究中心。通學的目的在於打好基礎,融會貫通。但是僅僅如此是不夠的。因爲通學不可能把每個方向都研究精深,人的精力畢竟是有限的嘛,所以要有自己感興趣的方向,以此作爲研究中心,深入深入再深入,成爲該方向的專家。以通促專,提煉自己的思想,以開放的思維謀求最大的提升!
 
    我選擇的研究領域是嵌入式系統(ARM+Linux),在該領域有四種類型的工作:
    1、系統設計
    2、硬件設計
    3、驅動開發及內核移植
    4、應用開發
 
    基於我目前的認識,研究中心是驅動開發及內核移植,爭取以後做系統設計,成爲嵌入式系統設計工程師。
 
    嵌入式Linux學習分爲三個階段:
    第一階段:建立嵌入式Linux知識體系框架。
    第二階段:深入學習嵌入式Linux的基本技術。
    第三階段:精深專長。
 
    這三個階段可以交叉。第一階段通過2006年暑假兩個月的強化學習,已經完成。現在正在進行第二階段的學習。這個階段關注嵌入式Linux軟件開發的基本技術,包括:JTAG的工作原理及其實現(以JFlash爲主)、bootloader的原理及實現(以U-boot爲主)、kernel移植與開發(嘗試2.4.18、2.6.X)、FS製作(嘗試ramdisk、cromfs等)、應用程序的移植(基本掌握開發)、調試和診斷技術。在這個階段,同時打好硬件基礎(掌握S3C2410)和軟件基礎(bash、C和基本的開發工具)。第三個階段在讀研期間,以研究OS原理和Linux內核源代碼爲主,與第二階段交叉進行。
 
    其實,每天進步一點點,把這一點點所學加到已經建立的知識體系框架中,日積月累,思想認識必定會有所提升。雖然都認可寧可斷其一指,不可傷其十指,但是應該承認人的認識是有侷限性的。比如學習A時,因缺乏實踐等各方面原因,可能認識不深入,也許在學習B時突然認識到了。所以一定要舉一反三,而且要反覆學習。記住基礎的技術,努力學習先進技術,不停止前進的腳步。

 

 

 

 

 

<五>

【序】學習Linux開發近一年,由於我是實驗室第一個從事這方面開發的,學習過程中遇到了很多問題,可是總是求師無門,只能一個人自己摸索,同時也充分利用了網絡,參考了廣大CSDN博友及相關論壇的帖子,在此表示感謝!

 

嵌入式Linux的學習涵蓋的範圍比較廣,下從bootloader,到內核移植、文件系統,中間的驅動開發,到上層的應用程序調試、開發環境等,變化莫測,經常是別人的能用自己的就有問題。

 

由於缺乏他人適當指點,自己在學習過程中也走了很多彎路,整個開發環境的搭建整了N久,更搞笑的是經常聽說模塊加載insmod,可連這個命令在主機還是ARM上用都沒搞明白,那叫一個汗啊!大家勿笑,嵌入式Linux的初學者確實對交叉環境比較不懂,我是其一啊。

 

現在適逢好友小布丁要學習嵌入式Linux,就將近一年來的學習體會總結下,整理了一個總體的學習計劃,希望給那些曾經像我一樣彷徨的人一些幫助。後續將完善此文檔,上傳到個人空間上,先貼出目錄。本人水平有限,不當之處,還請大家指正!

 

小布丁同學曾在我處於困境時一如既往的理解我支持我,給我信心給我鼓勵,謝謝你,美麗開懷的小布丁,希望你能happy and fascinating forever!

 

謹以此文獻給我們永遠可愛迷人的小布丁!

 

Sailor_forever

September 3, 2007

 


 

 

第一篇 Linux主機開發環境(15天)

 

1.1 Vmvare下Linux的安裝(優先)

1.2 Windows下從硬盤安裝Linux(可選)

1.3 Linux的基本命令及使用

1.4 Linux的文件系統及與windows的文件共享

1.5 GCC開發工具

1.6 GDB調試

1.7 Makefile編寫

1.8 主機端的模塊編程

1.9 簡單應用程序

 

第二篇 ARM+Linux開發環境(7天)

 

2.1 交叉開發環境介紹

2.2 交叉編譯器cross-tool

2.3 配置主機開發環境

2.3.1 配置超級終端minicom或hyperterminal或DNW

2.3.2 配置TFTP網絡服務

2.3.3 配置NFS主機端網絡服務

 

2.4 建立交叉開發環境

       2.4.1配置NFS ARM端網絡服務

       2.4.2 編譯ARM-gdb

 

2.5 交叉調試應用程序

2.6 ARM上的簡單模塊編程

 

第三篇 Linux系統bootlaoder移植(7天)

3.1 Bootloader介紹

3.2 u-boot命令及環境變量

3.3 u-boot的編譯配置

3.4 u-boot源碼分析

3.5 u-boot移植過程

 

第四篇 Linux的內核移植(15天)

4.1 配置編譯Linux內核

4.1.1 Linux內核源代碼結構

4.1.2 Linux內核編譯選項解析

4.1.3  Linux內核編譯鏈接

4.2  Linux啓動過程源代碼分析

4.3  Linux內核移植平臺相關代碼分析

 

第五篇 Linux的驅動編程(15天)

5.1 Linux的設備管理

5.2 Linux的驅動程序結構

5.3 簡單的字符設備驅動程序

5.4 Linux內核模塊的加載卸載

5.5 Linux的打印調試方法

5.6 字符設備的高級屬性-中斷

5.6 常見的串口網口驅動分析

 

第六篇 文件系統製作(5天)

6.1 Linux文件系統製作

6.2 文件系統和存儲設備的選擇

6.3 部署Ramdisk文件系統的過程

 

第七篇 Linux的高級應用編程(5天)

 

總用時 15+7+7+15+15+5+5 大概兩個半月

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章