1. 程式人生 > >嵌入式高手修煉之路,想月薪30K就努力學

嵌入式高手修煉之路,想月薪30K就努力學

第一部分:Linux平臺搭建與環境熟悉

瞭解linux系統;區分各種版本的Linux系統,以便於拓展 Linux視野。
1、Linux 簡介;
2、Linux 系統的主要特點;
3、Linux 的組成;
4、主要的 Linux 版本;
5、嵌入式 Linux簡介與發展

第二部分虛擬機器安裝和LINUX系統安裝

1、虛擬機器安裝;
2、Linux系統的安裝;
3、Linux系統的常用軟體的安裝;
4、Linux快速入門
5、 熟悉運用 Linux環境下,常用命令的操作與系統設定,如常用的 Shell;掌握基本的 Shell 應用

第三部分:嵌入式LINUX環境搭建

1、 建立嵌入式 Linux開發環境
2、 熟悉嵌入式開發平臺
3、 嵌入式 Linux開發工具
4、 Linux下的除錯技巧
5、 MAKE工程管理器
6、 硬體環境的搭建;arm-linux-gcc與 gcc安裝配置

第四部分: U-Boot: 瞭解 U-Boot 的作用及工作流程;瞭解Bootloader 的程式碼結構、編譯過程;移植U-Boot;掌握常用的U-Boot命令。

1、 Bootloader介紹
2、 u-boot工程介紹
3、 u-boot的編譯使用
4、 u-boot原始碼分析
5、 u-boot資源分配
6、 配置編譯u-boot
7、 u-boot移植過程
8、 u-boot常用命令操作
9、 新增u-boot新命令
10、設定u-boot環境變數
11、 u-boot驅動新增如網絡卡:DM9000

第五部分:LINUX核心移植:熟悉核心的原碼結構和kbuild Makefile語法;掌握和核心、驅動模組編譯相關的原理及方法。

1、Linux核心介紹
2、Linux核心特點

3、Linux核心原始碼結構
4、Linux核心選項解析
5、Linux核心編譯連結
6、核心模組編譯、使用方法

第六部分:LINUX根檔案系統

1、busybox 包移植、編譯
2、Linux跟檔案系統製作過程
3、根檔案系統介紹
4. nfs檔案伺服器系統搭建

第七部分:LINUX驅動開發

驅動開發是嵌入式Linux開發難度最高的內容,也是目前嵌入式行業最緊缺的人才之一。本課程介紹嵌入式Linux驅動開發相關概念及開發流程,瞭解驅動開發的關鍵技術點,重點講解嵌入式Linux下常用介面驅動的編寫方法,包括
1、字元型LED驅動開發(GPIO口驅動)
2、按鍵驅動開發(中斷驅動,在驅動中中斷程式的編寫,訊息佇列的應用
3、ADC驅動開發
4、網絡卡驅動開發
5、串列埠驅動開發
6、液晶屏(TFT彩屏驅動開發
7、觸控式螢幕驅動+tslib(中間外掛移植與設定),
8、USB驅動開發+USB無線網絡卡移植
9、IIS驅動開發+maplay移植與應用(mp3播放)+mplayer移植與應用(視訊播放Mp4/廣告機等播放)
10、SD驅動開發
11、RTC驅動開發
12、電源管理方法

第八部分:LINUX應用學習

嵌入式Linux應用開發和系統開發是嵌入式Linux中最重要的一部分,也是企業人才需求最廣的一部分。主要目標是精通嵌入式Linux下的程式設計,熟練掌握嵌入式Linux的開發環境、系統程式設計以及網路程式設計,熟悉C++、QT程式設計並且深刻體會整個嵌入式Linux專案開發流程,強化學員對Linux應用開發的能力.
1、Linux系統中的程序的概念,在應用程式中執行緒與父子程序的建立與應用
2、執行緒之間、程序之間的通訊
3、程序間通訊基本概念
4、管道(PIPE)
5、訊號(SIGNAL)
6、記憶體對映(MAPPED MEMORY)
7、訊息佇列(MESSAGE QUEUE)
8、訊號量(SEMAPHORE)
9、共享記憶體(SHARE MEMORY)@
10、tcPip協議在應用程式中的程式設計開發(SOCKET套接字程式設計開發)
10.1. ISO/OSI七層協議模型與IP網路四層模式
10.2.TCP/IP協議簇
10.3. 基於嵌入式Linux的TCP/IP網路結構
10.4. 基於嵌入式Linux的SOCKET程式設計
10..5.UDP與TCP的區別
10.6. UDP SERVER-CLIENT關係程
11、檔案讀寫與儲存

第九部分:QT移植與開發

瞭解嵌入式Linux下的幾種常見GUI及其特點,重點能掌握QT的有關內容,具備QT程式設計能力。瞭解嵌入式資料庫的配置與開發

1 、嵌入式Linux GUI介紹
2、嵌入式QT開發包移植
3、QT介紹及其訊號插槽機制
4、 QT圖形介面程式設計技術
5、QT應用程式與Linux驅動的銜接
6、 QT在實際專案中具體應用

第十部分:無線通訊應用

1、無線wifi模組應用
2、3G模組應用

第十一部分:嵌入式系統應用程式,驅動程式除錯

1、Linux基本工具除錯使用。GDB,insight除錯等
2、Linux應用程式的程式設計
3、嵌入式產品程式打包與釋出

第十二部分:嵌入式專案綜合除錯,產品釋出

瞭解真實專案的開發流程,掌握如何將所學知識應用到專案開發中。將模擬真實專案的管理過程,培養學員專案團隊協同開發能力,專案文件編寫能力和新知識的學習能力,為下一步就業做好知識上和心理上的充分準備

嵌入式LININX開發 3 階段

1。嵌入式LININX開發第一學習階段,主要打好基礎,學好C程式設計,Linux系統程式設計。

1、C語言程式設計基礎
2、嵌入式開發基礎:Linux概述安裝,shell命令,vim編輯器,GCC,GDB,Makefile,交叉開發環境構建
3、嵌入式Linux系統程式設計:shell程式設計,檔案程式設計,串列埠程式設計,程序程式設計,執行緒程式設計,網路程式設計
4、嵌入式專案開發:資料採集控制系統,串列埠伺服器

2。嵌入式LININX開發第二學習階段,掌握ARM彙編程式設計,驅動程式設計。

1、ARM體系結構:ARM體系,ARM指令,Thumb指令,彙編程式設計,邏輯程式開發

2、Linux核心移植:bootloader,核心配置,檔案系統

3、驅動程式開發:驅動架構模型,字元裝置驅動,塊裝置驅動,網路驅動

4、嵌入式專案開發:智慧家居系統,視訊監控系統

3。嵌入式LININX開發第三學習階段,掌握C++面向物件程式設計,Qt程式設計。

1、C++語言程式設計基礎

2、QT程式設計開發:QT開發基礎,QT佈局與控制元件,QT繪圖,QT事件,QT網路通訊,QT資料庫,QT移植

3、嵌入式專案開發:車載監控管理系統,工業能源管理系統

嵌入式設計應具備的基本技能

1、Linux 基礎

安裝Linux作業系統 Linux檔案系統 Linux常用命令 Linux啟動過程詳解 熟悉Linux服務能夠獨立安裝Linux作業系統 能夠熟練使用Linux系統的基本命令 認識Linux系統的常用服務安裝Linux作業系統 Linux基本命令實踐 設定Linux環境變數 定製Linux的服務 Shell 程式設計基礎使用vi編輯檔案 使用Emacs編輯檔案 使用其他編輯器

2、Shell 程式設計基礎

Shell簡介 認識後臺程式Bash程式設計熟悉Linux系統下的編輯環境 熟悉Linux下的各種Shell 熟練進行shell程式設計熟悉vi基本操作 熟悉Emacs的基本操作 比較不同shell的區別 編寫一個測試伺服器是否連通的shell指令碼程式 編寫一個檢視程序是否存在的shell指令碼程式 編寫一個帶有迴圈語句的shell指令碼程式

3、Linux 下的 C 程式設計基礎

linux c語言環境概述 Gcc使用方法 Gdb除錯技術 AutoconfAutomake Makefile 程式碼優化 熟悉Linux系統下的開發環境 熟悉Gcc編譯器 熟悉Makefile規則編寫Hello,World程式 使用 make命令編譯程式 編寫帶有一個迴圈的程式 除錯一個有問題的程式

4、嵌入式系統開發基礎

嵌入式系統概述 交叉編譯 配置TFTP服務 配置NFS服務 下載Bootloader和核心 嵌入式Linux應用軟體開發流程熟悉嵌入式系統概念以及開發流程 建立嵌入式系統開發環境製作cross_gcc工具鏈 編譯並下載U-boot 編譯並下載Linux核心 編譯並下載Linux應用程式

5、嵌入式系統移植

Linux核心程式碼 平臺相關程式碼分析 ARM平臺介紹 平臺移植的關鍵技術 移植Linux核心到 ARM平臺 瞭解移植的概念 能夠移植Linux核心移植Linux2.6核心到 ARM9開發板

6、嵌入式 Linux 下串列埠通訊

序列I/O的基本概念 嵌入式Linux應用軟體開發流程 Linux系統的檔案和裝置 與檔案相關的系統呼叫 配置超級終端和MiniCOM 能夠熟悉進行串列埠通訊 熟悉檔案I/O 編寫串列埠通訊程式 編寫多串列埠通訊程式

7、嵌入式系統中多程序程式設計

Linux系統程序概述 嵌入式系統的程序特點 程序操作 守護程序 相關的系統呼叫瞭解Linux系統中程序的概念 能夠編寫多程序程式編寫多程序程式 編寫一個守護程序程式 sleep系統呼叫任務管理、同步與通訊Linux任務概述任務排程 管道 訊號 共享記憶體 任務管理 API 瞭解Linux系統任務管理機制 熟悉程序間通訊的幾種方式 熟悉嵌入式Linux中的任務間同步與通訊編寫一個簡單的管道程式實現檔案傳輸 編寫一個使用共享記憶體的程式

8、嵌入式系統中多執行緒程式設計

執行緒的基礎知識 多執行緒程式設計方法 執行緒應用中的同步問題了解執行緒的概念 能夠編寫簡單的多執行緒程式編寫一個多執行緒程式

9、嵌入式 Linux 網路程式設計

網路基礎知識 嵌入式Linux中TCP/IP網路結構 socket 程式設計 常用 API函式 分析Ping命令的實現 基本UDP套介面程式設計 許可證管理 PPP協議 GPRS 瞭解嵌入式Linux網路體系結構 能夠進行嵌入式Linux環境下的socket 程式設計 熟悉UDP協議、PPP協議 熟悉GPRS 使用socket 編寫代理伺服器 使用socket 編寫路由器編寫許可證伺服器 指出TCP和UDP的優缺點 編寫一個web伺服器 編寫一個執行在 ARM平臺的網路播放器

10、GUI 程式開發

GUI基礎 嵌入式系統GUI型別 編譯QT 進行QT開發熟悉嵌入式系統常用的GUI 能夠進行QT程式設計使用QT編寫“Hello,World”程式 除錯一個加入訊號/槽的例項 通過過載QWidget 類方法處理事件

11、Linux 字元裝置驅動程式

裝置驅動程式基礎知識 Linux系統的模組 字元裝置驅動分析 fs_operation結構 載入驅動程式瞭解裝置驅動程式的概念 瞭解Linux字元裝置驅動程式結構 能夠編寫字元裝置驅動程式編寫Skull驅動 編寫鍵盤驅動編寫I/O驅動 分析一個看門狗驅動程式 對比Linux2.6核心與2.4核心中字元裝置驅動的不同Linux 塊裝置驅動程式塊裝置驅動程式工作原理 典型的塊裝置驅動程式分析 塊裝置的讀寫請求隊列了解Linux塊裝置驅動程式結構 能夠編寫簡單的塊裝置驅動程式比較字元裝置與塊裝置的異同 編寫MMC卡驅動程式 分析一個檔案系統 對比Linux2.6核心與2.4核心中塊裝置驅動的不同

12、檔案系統

虛擬檔案系統 檔案系統的建立 ramfs記憶體檔案系統 proc檔案系統 devfs 檔案系統 MTD技術簡介 MTD塊裝置初始化 MTD塊裝置的讀寫操作了解Linux系統的檔案系統 瞭解嵌入式Linux的檔案系統 瞭解MTD技術 能夠編寫簡單的檔案系統為 ARM9開發板新增 MTD支援 移植JFFS2檔案系統 通過proc檔案系統修改作業系統引數 分析romfs 檔案系統原始碼 建立一個cramfs 檔案系統

資深大牛有話說:嵌入式程式設計的複雜性

能從PC機器程式設計去看嵌入式問題,那是第一步;學會用嵌入式程式設計思想,那是第二步;用PC的思想和嵌入式的思想結合在一起,應用於實際的專案,那是第三步。很多朋友都是從PC程式設計轉向嵌入式程式設計的。在中國,嵌入式程式設計的朋友很少是正兒八經從計算機專業畢業的,都是從自動控制啊,電子相關的專業畢業的。這些童鞋們,實踐經驗雄厚,但是理論知識缺乏;計算機專業畢業的童鞋很大一部分去弄網遊、網頁這些獨立於作業系統的更高層的應用了。也不太願意從事嵌入式行業,畢竟這條路不好走。他們理論知識雄厚,但缺乏電路等相關的知識,在嵌入式裡學習需要再學習一些具體的知識,比較難走。

雖然沒有做過產業調查,但從我所見和所招聘人員,從事嵌入式行業的工程師,要麼缺乏理論知識,要麼缺乏實踐經驗。很少兩者兼備的。究其原因,還是中國的大學教育的問題。這裡不探討這個問題,避免口水戰。我想列出我實踐中的幾個例子。引起大家在嵌入式中做專案時對一些問題的關注。

第一個問題

同事在uC/OS-II下開發一個串列埠的驅動程式,驅動和介面在測試中均為發現問題。應用中開發了個通訊程式,串列埠驅動提供了一個查詢驅動緩衝區字元的函式:GetRxBuffCharNum()。 高層需要接受一定數量的字元以後才能對包做解析。一個同事撰寫的程式碼,用偽程式碼表示如下:


bExit = FALSE;
do {
if (GetRxBuffCharNum() >= 30)
bExit = ReadRxBuff(buff, GetRxBuffCharNum());
} while (!bExit);

這段程式碼判斷當前緩衝區中超過30個字元,就將緩衝區中全部字元讀到緩衝區中,直到讀取成功為止。邏輯清楚,思路也清楚。但這段程式碼是不能正常工作。如果是在PC機上,定然是沒有任何問題,工作的異常正常。但在嵌入式裡真的是不得而知了。同事很鬱悶,不知道為什麼。來請我解決問題,當時我看到程式碼,就問了他,GetRxBuffCharNum()是怎麼實現的?開啟一看:


unsigned GetRxBuffCharNum(void)
{
cpu_register reg;
unsigned num;
reg = interrupt_disable();
num = gRxBuffCharNum;
interrupt_enable(reg);
return (num);
}

很明顯,由於在迴圈中,interruput_disable()和interrupt_enable()之間是個全域性臨界區域,保證gRxBufCharNum的完整性。但是,由於在外層的do { } while() 迴圈中,CPU頻繁的關閉中斷,開啟中斷,這個時間非常的短。實際上CPU可能不能正常的響應UART的中斷。當然這和uart的波特率、硬體緩衝區的大小還有CPU的速度都有關係。我們使用的波特率非常高,大約有3Mbps。uart起始訊號和停止訊號佔一個位元位。一個位元組需要消耗10個週期。3Mbps的波特率大約需要3.3us傳輸一個位元組。3.3us能執行多少個CPU指令呢?100MHz的ARM,大約能執行150條指令左右。結果關閉中斷的時間是多長呢?一般ARM關閉中斷都需要4條以上的指令,開啟又有4條以上的指令。接收uart中斷的程式碼實際上是不止20條指令的。所以,這樣下來,就有可能出現丟失通訊資料的Bug,體現在系統層面上,就是通訊不穩定。

修改這段程式碼其實很簡單,最簡單的辦法是從高層修改。即:


bExit = FALSE;
do {
DelayUs(20); //延時 20us,一般採用空迴圈指令實現
num = GetRxBuffCharNum();
if (num >= 30)
bExit = ReadRxBuff(buff, num);
} while (!bExit);

這樣,讓CPU有時間去執行中斷的程式碼,從而避免了頻繁關閉中斷造成的中斷程式碼執行不及時,產生的資訊丟失。在嵌入式系統裡,大部分的RTOS應用都是不帶串列埠驅動。自己設計程式碼時,沒有充分考慮程式碼與核心的結合。造成程式碼深層次的問題。RTOS之所以稱為RTOS,就是因為對事件的快速響應;事件快速的響應依賴於CPU對中斷的響應速度。驅動在Linux這種系統中都是與核心高度整合,一起執行在核心態。RTOS雖然不能抄襲linux這種結構,但有一定的借鑑意義。

從上面的例子可以看清楚,嵌入式需要開發人員對程式碼的各個環節需要了解清楚。

第二個例子

同事驅動一個14094串轉並的晶片。序列訊號是採用IO模擬的,因為沒有專用的硬體。同事就隨手寫了個驅動,結果除錯了3、4天,仍舊是有問題。我實在看不下去了,就去看了看,控制的並行訊號有時候正常有時候不正常。我看了看程式碼,用虛擬碼大概是:


for (i = 0; i < 8; i++)
{
SetData((data >> i) & 0x1);
SetClockHigh();
for (j = 0; j < 5; j++);
SetClockLow();
}

將資料的8個bit在每個高電平從bit0到bit7依次傳送出去。應該是正常的啊。看不出問題在哪啊?我仔細想了想,有看了14094的datasheet,明白了。原來,14094要求clock的高電平持續10個ns,低電平也要持續10個ns。這段程式碼之做了高電平時間的延時,沒有做低電平的延時。如果中斷插在低電平之間工作,那麼這段程式碼是可以的。但是如果CPU沒有中斷插在低電平時執行,則是不能正常工作的。所以就時好時壞。

修改也比較簡單:


for (i = 0; i < 8; i++)
{
SetData((data >> i) & 0x1);
SetClockHigh();
for (j = 0; j < 5; j++);
SetClockLow();
for (j = 0; j < 5; j++);
}

這樣就完全正常了。但是這個還是不能很好移植的一個程式碼,因為編譯器一優化,就有可能造成這兩個延時迴圈的丟失。丟失了,就不能保證高電平低電平持續10ns的要求,也就不能正常工作了。所以,真正的可以移植的程式碼,應該把這個迴圈做成一個納秒級的 DelayNs(10);

像Linux一樣,上電時,先測量一下,nop指令執行需要多長時間執行,多少個nop指令執行10ns。執行一定的nop指令就可以了。利用編譯器防止優化的編譯指令或者特殊的關鍵字,防止延時迴圈被編譯器優化掉。如GCC中的


__volatile__ __asm__("nop;\n");

從這個例子中可以清楚的看到,寫好一段好程式碼,是需要很多知識支撐的。

簡單地總結一下硬體開發的基本過程:

1、明確硬體總體需求情況,如CPU處理能力、儲存容量及速度、I/O埠的分配、介面要求、電平要求、特殊電路要求等等。
2、根據需求分析制定硬體總體方案,尋求關鍵器件及相關技術資料、技術途徑和技術支援,充分考慮技術可行性、可靠性和成本控制,並對開發除錯工具提出明確要求。關鍵器件可試著去索取樣品。
3、總體方案確定後,做硬體和軟體的詳細設計,包括繪製硬體原理圖、軟體功能框圖、PCB設計、同時完成開發元器件清單。
4、做好PCB板後,對原理設計中的各個功能單元進行焊接除錯,必要時修改原理圖並作記錄。
5、軟硬體系統聯調。一般情況下,經過除錯後原理及PCB設計上有所調整,需要二次投板。
6、可靠性測試、穩定性測試,通過驗收,專案完成!

硬體工程師應具備的基本技能:
(1)由需求分析至總體方案、詳細設計的規劃創造能力;
(2)熟練運用設計工具,設計原理圖、PCB板的能力;
(3)熟練運用微控制器、DSP、PLD、FPGA等進行軟硬體開發除錯的能力;
(4)熟練運用模擬工具、示波器、訊號發生器、邏輯分析儀等調測硬體的能力;
(5)掌握常用的標準電路的設計能力,如復位電路、常用濾波器電路、功放電路、高速訊號傳輸線的匹配電路等;
(6)故障定位、解決問題的能力;
(7)設計文件的組織編寫技能。