嵌入式技術的發展經歷了單片機(SCM)、微控制器(MCU)、系統級芯片(SoC)3個階段。linux
SCM——隨着大規模集成電路的出現及其發展,計算機的CPU、RAM、ROM、定時數器和多種I/O接口集成在一片芯片上,造成芯片級的計算機。c++
MCU——MCU的特徵是知足各種嵌入式應用,根據對象系統要求擴展各類外圍電路與接口電路,突顯其對象的智能化控制能力。實際上,MCU、SCM之間的概念在平常工做中並不嚴格區分,一律以單片機稱呼。隨着可以運行更復雜軟件(好比操做系統)的SoC的出現,「單片機」一般是指不運行操做系統、功能相對單一的嵌入式系統,但這不是絕對的。編程
SoC——SoC的特徵是實現複雜系統功能的VLSI;採用超深亞微米工藝技術;使用一個以上嵌入式CPU/數字信號處理器(DSP);外部能夠對芯片進行編程;主要採用第三方IP進行設計。ubuntu
嵌入式處理器種類繁多,有ARM、MIPS、PPC等多種架構。但因爲ARM處理器的文檔豐富,各種嵌入式軟件大多支持ARM處理器,使用ARM開發板來學習嵌入式開發是一個好選擇。windows
基於ARM的處理器以其高速度、低功耗、價格低等優勢獲得很是普遍的應用,它能夠應用於如下領域:爲無線通訊、消費電子、成像設備等產品提供可運行復雜操做系統的開放應用平臺;在海量存儲、汽車電子、工業控制和網絡應用等領域提供實時嵌入式應用;安全系統,好比信用卡、SIM卡等。安全
ARM體系架構的版本就是它使用的指令集的版本。ARM架構支持32位的ARM指令集和16位的Thumb指令集,後者使得代碼的存儲空間大大減少。還提供了一些擴展功能,好比Java加速器(Jazelle)、用於提升安全性能的TrustZone技術 、智能能源管理(IEM),SIMD和NEONTM等技術。還在使用ARM指令集(ISA,Instruction Set Architecture)有如下版本:ARMv四、ARMv4T、ARMv5TE、ARMv5TEJ、ARMv六、ARMv7網絡
後綴字母的含義:T表示支持Thumb指令集、D表示支持片上調試(Debug)、M表示內嵌硬件乘法器(Multiplier)、I支持片上斷點和調試點、E表示支持加強型DSP功能、J表示支持Jazelle技術即Java加速器、S表示全合成式。這8個系列中,ARM七、ARM九、ARM9E、ARM10爲通用處理器系列,每個系列提供一套相對獨立的性能來知足不一樣應用領域的需求。要了解更詳細的信息請參考ARM公司的網站(http://www.arm.com)架構
隨着技術的發展及人們需求的增長,各類消費類電子產品的功能愈來愈大,隨身攜帶的電子設備變得「等同於PC」。當系統愈來愈大、應用愈來愈多,使用操做系統頗有必要,在嵌入式領域能夠選擇的操做系統有不少,好比嵌入式Linux、Vxworks、WindowsCE等等app
嵌入式Linux開發環境搭建函數
主機與目標板結合的交叉開發模式:即在PC主機上編輯、編譯軟件,而後在目標板上運行、驗證程序。嵌入式設備的資源並不足以用來開發軟件,所以都是採用主機與目標板結合的交叉開發模式開發軟件。最初的嵌入式設備是一個空白的系統,須要經過主機爲它構建基本的軟件系統,並燒寫到設備中。
對於開發板,進行嵌入式Linux開發時通常能夠分爲如下3個步驟:
在主機上編譯Bootloader,而後經過JTAG燒入單板。經過JTAG接口燒寫程序的效率很是低,它適用於燒寫空白單板。爲方便開發,一般選用具備串口傳輸、網絡傳輸、燒寫Flash功能的Bootloader,它能夠快速地從主機獲取可執行代碼,而後燒入單板,或者直接運行
在主機上編譯嵌入式Linux內核,經過Bootloader燒入單板或直接啓動。一個能夠在單板上運行的嵌入式Linux內核是進行後續開發的基礎,爲方便調試,內核應該支持網絡文件系統(NFS),即將應用程序放在主機上,單板啓動嵌入式Linux內核後,經過網絡來獲取程序,而後運行。
在主機上編譯各種應用程序,單板啓動內核後經過NFS運行它們,通過驗證後再燒入單板。燒寫、啓動Bootloader後,就能夠經過bootloader的各種命令來下載、燒寫、運行程序了。啓動嵌入式Linux後,也是經過執行各類命令來啓動應用程序的,通常經過串口來進行輸入/輸出。因此交叉開發模式中,主機與目標板一般須要3種鏈接:JTAG、串口、網絡。
通常只有在調試Bootloader時,才使用JTAG接口,所以一般狀況下JTAG接口的使用不多:只須要燒寫一次Bootloader——當它啓動後,基本都是經過串口或網絡下載程序,而後燒入單板。
開發板有以下部件:64MB SDRAM、1MB NOR Flash、64MB NANDFlash、兩個網卡、5個串口、音頻輸入輸出、2.5寸IDE接口、標準SD/MMC卡座、4個GPIO按鍵、外接I2C接口的實時時鐘RTC芯片。
將主機與目標板經過JTAG、串口線(接單板上的串口0)、網線(接單板上的網卡0)鏈接起來,將各種設備鏈接到目標板上去便可完成硬件開發環境的搭建,接下來繼續軟件環境的搭建便可。
安裝一個Linux操做系統,安裝方法有以下幾種:光盤安裝、硬盤安裝、網絡安裝(FTP、HTTP、NFS等)
安裝完成後,須要配置Linux的FTP、SSH、NFS這3個服務、配置網絡IP等
在Linux上配置軟件維護工具,以下:
ubuntu的apt-get:修改/etc/apt/sources.ist,把其中註釋掉的網址打開;使用sudo apt-get update更新可用的程序列表。
ubuntu隱藏了root用戶,也就是說不能使用root用戶登陸,這能夠避免不當心使用root權限而致使系統崩潰。當須要使用root權限時,使用sudo命令,好比要修改/etc/exports文件,修改命令以下:#sudo vi /etc/exports。
使用光盤安裝的Ubuntu7.10是一個比較精簡的Linux發行版,它缺少一些開發用的工具、文件,好比標準C庫的頭文件、g++編譯器等。所以須要檢查安裝這些工具文件,使用命令安裝基本的開發環境:
ubuntu: $sudo apt-get install build-essential 基本開發環境
$sudo apt-get install bison flex bison和flex分別是語法、詞法分析器。
$sudo apt-get install manpages-dev 安裝C函數庫的man手冊
其光盤內容分爲8部分:硬件實驗(hardware)、系統移植(system)、驅動和測試程序(drivers_and_test)、GUI、工具(tools)、scratchbox(也是一個工具)、網絡文件系統(nfs_root)、調試工具(debug)。
hardware目錄下是各個硬件部件的實驗代碼,進入子目錄後執行make命令便可生成可執行二進制程序(名字爲子目錄名架上後綴「.bin」),燒入開發板的NAND Flash中便可運行。
U-Boot、Linux內核、根據busybox建立的文件系統這3部分構成了基本的、最小的嵌入式Linux系統,它們的代碼在system目錄下。後面介紹的驅動也所有包含在system/linux-2.6.22內核代碼中,drivers_and_test主要是測試程序。
兩種GUI系統:qtopia、X window。GUI/xwindow目錄下有4個子目錄:X目錄中主要是Xorg的代碼,它提供X Server;matchbox是一個基於X的、用於嵌入式系統的小型GUI環境,它包括一個窗口管理器、一個面板、一個桌面、一個共享功能程序庫和一些小的面板應用程序;GTK目錄下是GTK+庫,GTK+是一個用於建立圖形用戶界面的多平臺工具,它包含有基本的控件和一些很複雜的控件,好比文件選擇控件和顏色選擇控件;apps目錄下是幾個基於X、GTK+的應用程序。
tools目錄下是運行於主機上的工具,主要是交叉編譯工具。arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2和scratchbox-arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2都是使用create_crosstools目錄中的軟件編譯出來的交叉編譯工具鏈,前一個是在主機上直接運行;後一個是當主機上啓動scratchbox後,在scratchbox裏面運行。這兩個工具編譯出來的代碼是徹底同樣的。
scratchbox是一個交叉編譯工具包,它的目的是使嵌入式Linux開發變得像開發PC Linux軟件同樣容易。在移植X windows時將用到它。
nfs_root目錄下是4個子目錄:最小的根文件系統fs_mini、使用mdev機制的根文件系統fs_min_mdev、含有qtopia圖形程序的根文件系統fs_qtopia、含有X window圖形程序的根文件系統fs_xwindow。在開發階段,單板上的內核啓動後能夠經過NFS掛載它們中的某一個,而後執行其中的程序:開發完成後,將所用的整個子目錄製做爲映像文件,燒入開發板。
安裝光盤:
$sudo chown book:book /work -R 改變/work目錄的擁有者及所屬組名
將光盤中的全部內容複製到Linux的/work目錄中,有如下方法:使用ftp上傳、在VMware掛載光盤、
安裝交叉編譯工具鏈
首先約定:在主機上執行的命令提示符爲「$";在主機中啓動scratchbox,而後在scratchbox裏執行的命令,提示符爲「〉」;在單板上執行的命令,提示符爲"#"。
剛開始學習時,建議使用已經制做好的工具鏈,使用如下命令解壓獲得gcc-3.4.5-glibc-2.3.6目錄。
$cd /work/tools
$ tar xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2
而後在環境變量PATH中增長路徑,以下所示:
$export PATH=$PATH:/work/tools/gcc-3.4.5-glibc-2.3.6/bin
這使得能夠直接運行這個目錄下的程序,而不須要指定目錄位置。
爲了避免用每次使用時都手動設置PATH,能夠在/etc/environment中修改PATH的值以下所示:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin"
安裝ncurses,它是一個能提供功能鍵定義(快捷鍵)、屏幕繪製以及基於文本終端的圖形互動功能的動態庫。若是沒有它,在執行make menuconfig命令配置程序時會出錯。使用如下命令安裝:
$cd /work/tools
$tar xzf ncureses.tar.gz
$cd ncureses-5.6
$./configure --with-shared --prefix=/usr
$make
$make install
本身製做工具鏈
用戶也能夠本身編譯工具鏈。若是要基於gcc和glibc來製做工具鏈,可使用crosstool來進行編譯;若是要基於gcc和uClibc來製做工具鏈,可使用buildroot來進行編譯。若是不借助於這些工具,編譯過程是很是繁瑣的。uClibc比glibc小,在已有的接口上是兼容的,更適用於嵌入式系統。但uClibc並無包括glibc中的全部接口實現,所以有些硬喲你個可能在uClibc中不能編譯。基於這個緣由,初始學習使用glibc會比較好。
編譯安裝crosstool:
$tar xzf crosstool-0.43.tar.gz
$cp glibc-2.3.6-version-info.h_err.path crosstool-0.43/patches/glibc-2.3.6/
執行demo-arm-softfloat.sh腳本後,它將根據arm-softfloat.dat、gcc-3.4.5-glibc-2.3.6.dat這兩個文件中定義的環境變量調用all.sh腳本進行編譯。gcc-3.4.5-glibc-2.3.6.dat文件指明瞭要下載或使用的文件。
須要修改demo-arm-softfloat.sh、arm-softfloat.dat、all.sh這3個文件。
demo-arm-softfloat.sh:
TARBALLS_DIR=/work/tools/create_crosstools/src_gcc_glibc
RESULT_TOP=/work/tools
arm-softfloat.dat:
TARGET=arm-linux 表示編譯出來的工具樣式爲arm-linux-gcc、arm-linux-ld等
all.sh:
PREFIX=${PREIX-$RESULT_TOP/$TOOLCOMBO}
編譯、安裝工具鏈:
$cd crosstool-0.43/
$./demo-arm-softfloat.sh 編譯二、3個小時後,將在/work/tools目錄下生成gcc-3.4.5-glibc-2.3.6子ulu ,交叉編譯器、庫、頭文件都包含在裏面。設置PATH環境變量便可使用。使用西面命令測評一下:
$arm-linux-gcc -v
至此,基本的開發環境已經創建,在後續開發過程當中,要使用到其餘工具時,再進行安裝。
編譯器介紹:
GCC是一組編譯工具的總稱 ,其軟件包裏包含衆多的工具,按其類型,主要有如下的分類:
C編譯器—— cc, ccl, cclplus, gcc
C++編譯器 —— c++. cclplus, g++
源碼預處理程序—— cpp, cpp0
庫文件 —— libgcc.a, libgcc_eh.a, libgcc_s.so, libiberty.a, libstdc++.[a,so], libsupc++.a
彙編器介紹:
Linux平臺的標準彙編器是GAS,它是GCC所依賴的後臺彙編工具,一般包含在binutils軟件包中。GAS使用標準的AT&T彙編語法,能夠用來彙編用AT&T格式編寫的程序。
鏈接器介紹:
GNU鏈接器使用一個命令語言腳原本控制鏈接過程。默認狀況下,ld是由一組內部命令進行控制的,這些命令能夠進行擴展或覆蓋。
調試器介紹:
GDB調試器是一個用來調試C和C++程序的調試器(Debugger)。
Linux編程庫:
libc.so
libdl.so
libglib.so
libm.so