以上這些知識(shí),往往需要較長(zhǎng)時(shí)間的學(xué)習(xí)和積累,需要親自參與實(shí)踐的機(jī)會(huì)。對(duì)于剛剛接觸嵌入式系統(tǒng)硬件開(kāi)發(fā)的學(xué)生來(lái)講,一般不可能全部了解這些知識(shí),但也不會(huì)是通通一無(wú)所知。筆者結(jié)合自己開(kāi)發(fā)和教學(xué)的經(jīng)驗(yàn)認(rèn)為:首先應(yīng)該選定一款主流且較為簡(jiǎn)單的嵌入式系統(tǒng)處理器,比如基于ARM7TDMI 內(nèi)核的AT91M40800,S3C44B0 等嵌入式系統(tǒng)處理器,學(xué)習(xí)32 位RISC處理器的編程模型,指令集。高校教學(xué)中,單片計(jì)算機(jī)課程一般以8051系列單片為核心講解,由于現(xiàn)代32位處理器的結(jié)構(gòu)和開(kāi)發(fā)方式同8位單片機(jī)有著較大的差別,學(xué)習(xí)者還是需要花一點(diǎn)力氣來(lái)研究以下32位處理器的。以ARM處理器為例,學(xué)習(xí)者就需要理解處理器的多種工作模式,備份寄存器,RISC 指令集的特點(diǎn),MMU 和虛擬地址,中斷處理過(guò)程等內(nèi)容。在學(xué)習(xí)指令集的過(guò)程中,最好能夠每學(xué)習(xí)幾條指令,就使用這幾條指令在模擬器上實(shí)驗(yàn)以下,觀察處理器執(zhí)行的結(jié)果。這個(gè)過(guò)程一方面是學(xué)習(xí)者對(duì)于指令本身的學(xué)習(xí)能夠取得一個(gè)比較好的效果,另外也是對(duì)開(kāi)發(fā)工具本身的一種學(xué)習(xí)。接著,就可以開(kāi)始學(xué)習(xí)片上資源的使用和配置方法。這時(shí)就需要一個(gè)方便使用的開(kāi)發(fā)板,學(xué)習(xí)者能夠通過(guò)JTAG仿真器將開(kāi)發(fā)板同調(diào)試PC機(jī)相連,進(jìn)行程序的下載,調(diào)試。特別是要仔細(xì)研究系統(tǒng)的初始化過(guò)程和中斷處理的過(guò)程。在開(kāi)發(fā)過(guò)程中如果遇到問(wèn)題,應(yīng)自己分析問(wèn)題產(chǎn)生的原因,通過(guò)分析縮小問(wèn)題可能產(chǎn)生的范圍,最終找到問(wèn)題的所在。最重要的就是要保持一種解決問(wèn)題的信心,面對(duì)困難如何處理,往往能夠決定最終系統(tǒng)是否能夠調(diào)試成功。然后,學(xué)習(xí)者可以開(kāi)始仔細(xì)學(xué)習(xí)處理器同存儲(chǔ)器的連接,存儲(chǔ)空間的配置,各種外擴(kuò)器件,如網(wǎng)卡,AC97聲卡的工作原理和使用方法。嵌入式系統(tǒng)硬件設(shè)計(jì)中往往需要使用可編程器件,學(xué)習(xí)者還需要一定的時(shí)間來(lái)學(xué)習(xí)使用常用的可編程器件(CP L D / F P G A),常用的有Xilinx和Altera公司的產(chǎn)品。進(jìn)行系統(tǒng)硬件原理圖設(shè)計(jì),就需要使用原理圖設(shè)計(jì)的EDA工具,常用的EDA 原理圖設(shè)計(jì)工具主要包括Cadence公司的Capture,Protel公司的Protel99SE等。接下來(lái)就可以參照評(píng)估板的電路圖,根據(jù)系統(tǒng)的設(shè)計(jì)要求,開(kāi)始進(jìn)行原理圖的繪制了。在原理圖繪制過(guò)程中,一定要搞清評(píng)估板電路連接的原因,對(duì)于一時(shí)沒(méi)有搞清楚的問(wèn)題切不可蒙混過(guò)關(guān)。例如,有些處理器的地址線是以字節(jié)位單位的,而另一些處理器的地址線則是以兩個(gè)字節(jié)為單位的,當(dāng)連接16位的存儲(chǔ)器的時(shí)候,切不可想當(dāng)然的把處理器的A 0 直接連接到存儲(chǔ)器的A 0 上面。另外,學(xué)生還應(yīng)具有一定的PCB板圖繪制能力,因?yàn)樵诂F(xiàn)階段,很多公司還不能完全把原理圖的設(shè)計(jì)工作和PCB 的繪制工作分開(kāi),往往要求硬件設(shè)計(jì)人員既能進(jìn)行原理圖設(shè)計(jì)又能進(jìn)行板圖設(shè)計(jì)。即使是pcb設(shè)計(jì)和原理圖設(shè)計(jì)分開(kāi)的公司,也需要原理圖設(shè)計(jì)者能為PCB 的設(shè)計(jì)者對(duì)于不同的信號(hào)提出布板要求。
3.驅(qū)動(dòng)程序和操作系統(tǒng)移植工作
現(xiàn)代嵌入式系統(tǒng)的開(kāi)發(fā)同傳統(tǒng)8位單片機(jī)系統(tǒng)的開(kāi)發(fā)相比,一個(gè)顯著的區(qū)別就是嵌入式操作系統(tǒng)的廣泛使用。在拿到焊接完畢的電路板,并進(jìn)行基本的測(cè)試后,就要進(jìn)行驅(qū)動(dòng)程序和操作系統(tǒng)的移植工作了。首先要進(jìn)行的Bootloader的編寫和移植工作。Bootloader相當(dāng)于PC系統(tǒng)的BIOS。對(duì)于有些嵌入式操作系統(tǒng),如uc/OSII沒(méi)有bootloader同樣可以開(kāi)發(fā)調(diào)試。但是對(duì)于WindowsCE和嵌入式linux系統(tǒng)而言Bootloader就是必須的了。本文以Windows CE 為例,做一個(gè)簡(jiǎn)要的說(shuō)明。
Windows CE 系統(tǒng)的移植工作主要就是BSP(板級(jí)支持包)的開(kāi)發(fā)過(guò)程。BSP將具體的硬件差異同操作系統(tǒng)的核心隔離開(kāi)來(lái),主要由Bootloaer ,OAL(OEMAbstracTIon Layer)和設(shè)備驅(qū)動(dòng)程序三部分組成。WindowsCE系統(tǒng)中Bootloader叫做Eboot。Eboot被寫入系統(tǒng)的引導(dǎo)Flash。系統(tǒng)啟動(dòng)時(shí)運(yùn)行Eboot,完成通過(guò)網(wǎng)卡將調(diào)試PC 機(jī)中WindowsCE 操作系統(tǒng)映像下載到目標(biāo)系統(tǒng)的SDRAM中并開(kāi)始執(zhí)行的功能。對(duì)于一個(gè)系統(tǒng)移植人員,首先需要閱讀文檔,了解WindowsCE系統(tǒng)Bootloader和BSP的基本概念和開(kāi)發(fā)過(guò)程。(呵,還要做這工作啊,我還沒(méi)想到(初學(xué)^_^))Windows CE的開(kāi)發(fā)系統(tǒng)Platform Builder提供了詳細(xì)的文檔和例程,開(kāi)發(fā)人員需要仔細(xì)的閱讀文檔和例程。搞清楚各個(gè)函數(shù)之間的調(diào)用關(guān)系。在開(kāi)發(fā)過(guò)程中的一個(gè)重要的步驟就是打通串口,使得目標(biāo)板能夠通過(guò)PC機(jī)串口向調(diào)試PC 機(jī)發(fā)送數(shù)據(jù)。由于ARM系統(tǒng)的仿真器比較昂貴,而且操作系統(tǒng)的調(diào)試往往不使用JTAG調(diào)試器進(jìn)行單步調(diào)試。所以能從串口觀察程序的執(zhí)行過(guò)程和結(jié)果對(duì)于調(diào)試就顯得十分重要了。串口打通之后一個(gè)比較棘手的問(wèn)題就是網(wǎng)卡芯片的調(diào)試。剛剛接觸嵌入式系統(tǒng)開(kāi)發(fā)的人往往沒(méi)有直接在寄存器級(jí)上使用網(wǎng)卡芯片的經(jīng)驗(yàn),而網(wǎng)卡芯片的說(shuō)明一般都較為簡(jiǎn)短,這就要求開(kāi)發(fā)者學(xué)習(xí)一些以太網(wǎng)的基礎(chǔ)知識(shí),對(duì)以太網(wǎng)的MAC 層有一個(gè)基本的認(rèn)識(shí)。另外,各種網(wǎng)絡(luò)調(diào)試(抓包)工具的使用也能大大降低系統(tǒng)調(diào)試的難度。系統(tǒng)的OAL需要根據(jù)具體硬件的不同做出相應(yīng)的修改,這個(gè)部分可參照文檔進(jìn)行,在調(diào)試過(guò)程中根據(jù)串口的信息分析出錯(cuò)的地方。要充分發(fā)揮跨文件字符串搜索工具的功能,在浩如煙海的源文件中找到出錯(cuò)的位置。當(dāng)然,隨著開(kāi)發(fā)者對(duì)系統(tǒng)文件目錄結(jié)構(gòu)的熟悉和了解,錯(cuò)誤定位的速度會(huì)不斷加快。WindowsCE 的驅(qū)動(dòng)程序相對(duì)而言是比較好寫的。
4.應(yīng)用程序的開(kāi)發(fā)
υC/OS是由Jean Labrosse設(shè)計(jì)編寫的開(kāi)放源代碼的嵌入式實(shí)時(shí)操作系統(tǒng),筆者最早接觸的嵌入式操作系統(tǒng)就是它。閱讀并深入理解υC/OS的源代碼對(duì)于理解實(shí)時(shí)系統(tǒng)是大有裨益的。
ARM Linux
ARM linux是由Russell King和其他開(kāi)發(fā)者開(kāi)發(fā)移植的用于ARM 處理器的linux操作系統(tǒng)。ARM Linux系統(tǒng)在GNU GPL下發(fā)布。
υCLinux