摘要:介紹了一種基于ARM的嵌入式系統(tǒng)的設(shè)計方法;首先簡要介紹了嵌入式硬件設(shè)計方案,然后重點(diǎn)闡述了BootLoader程序的設(shè)計、uCLinux的編譯與移植,最后對uCLinux下的網(wǎng)絡(luò)編程進(jìn)行了分析。
關(guān)鍵詞:ARM;嵌入式系統(tǒng);linux;BootLoader
中圖分類號:TP274文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)09-11724-02
The Design and Realization of Embedded System Based on ARM
LIN Hua
(Computer Science College of Yangtze University, Jingzhou 434023, China)
Abstract: This paper designed a new embedded system based on ARM.Firstly, it introduced the embedded system hardware design, Secondly, it analyzed detailedly the compile and transplant course of the uCLinux, in the end it discussed on the communication software design for uCLinux.
Key words: ARM; Embedded System; Linux; BootLoader
隨著計算機(jī)技術(shù)和半導(dǎo)體技術(shù)的發(fā)展,嵌入式系統(tǒng)在個人數(shù)據(jù)處理、多媒體通信、在線事務(wù)處理、生產(chǎn)過程控制、交通控制等各個領(lǐng)域內(nèi)得到了廣泛的應(yīng)用,各種嵌入式相關(guān)的新產(chǎn)品紛紛涌現(xiàn)。嵌入式系統(tǒng)越來越引起人們的關(guān)注,對嵌入式系統(tǒng)的研究,是掌握信息技術(shù)的核心。本文以處理器S3C44B0為核心,設(shè)計出一個基于ARM+uCLinux的嵌入式系統(tǒng),對于嵌入式系統(tǒng)有獨(dú)到的研究。
1 嵌入式硬件方案設(shè)計
1.1 系統(tǒng)硬件平臺
系統(tǒng)的硬件平臺主要是由嵌入式處理器、FLASH、SDRAM、以太網(wǎng)接口、USB接口、UART接口、JTAG接口、I/O接口、I2C、系統(tǒng)電源、復(fù)位電路等組成。系統(tǒng)硬件結(jié)構(gòu)圖如圖1所示:
1.2 主要硬件的設(shè)計
1.2.1 ARM嵌入式處理器的設(shè)計
處理器采用Samsung公司的S3C44B0微處理器,S3C44B0最突出的特點(diǎn)是它的CPU核使用ARM公司的16/32位ARM7TDMI RISC結(jié)構(gòu)。ARM7TDMI系統(tǒng)擴(kuò)充包括Thumb協(xié)處理器、片上ICE中斷調(diào)試支持和32位硬件乘法器。S3C44B0通過在ARM7TDMI內(nèi)容基礎(chǔ)上擴(kuò)展一系列完整的通用外圍器件,主要包括:8KB的Cache,外部存儲器控制器,LCD控制器,2通道UART,4通道DMA, 71個通用I/O端口,8個外部中斷源等。
1.2.2 網(wǎng)絡(luò)接口的設(shè)計
采用RTL8019AS芯片作為網(wǎng)絡(luò)接口芯片,RTL8019AS是一種高度集成的以太網(wǎng)芯片,能簡單的實(shí)現(xiàn)Plug and Play并兼容NE2000,芯片內(nèi)部集成了DMA控制器、ISA總線控制器、16KSRAM,用戶可以通過DMA方式把需要發(fā)送的數(shù)據(jù)寫入片內(nèi)SRAM中,讓芯片自動將數(shù)據(jù)發(fā)送出去;而芯片在接收到數(shù)據(jù)后,用戶可以通過DMA方式將數(shù)據(jù)讀出。
1.2.3 USB接口的設(shè)計
采用PDIUSBD12作為USB接口芯片,PDIUSBD12是一款性價比很高的USB器件,完全符合USB1,1版的規(guī)范,它通常用作微控制器系統(tǒng)中實(shí)現(xiàn)與微控制器進(jìn)行通信的高速通用并行接口,它還支持本地的DMA傳輸。
2 軟件體系的設(shè)計
軟件開發(fā)過程包括BootLoader設(shè)計、uCLinux的編譯和移植、uCLinux下的網(wǎng)絡(luò)編程和應(yīng)用程序開發(fā)等。
2.1 BootLoader的設(shè)計與實(shí)現(xiàn)
在嵌入式系統(tǒng)中,BootLoader的作用與PC機(jī)上的BIOS類似,BootLoader可以完成對系統(tǒng)板上的主要部件進(jìn)行初始化,也可以下載文件到系統(tǒng)板、對CPU、SDRAM、Flash,通過串行口Flash進(jìn)行擦除與編程。
BootLoader作為系統(tǒng)復(fù)位或上電后首先運(yùn)行的代碼,一般應(yīng)寫入Flash存儲器中并從起始物理地址0x0開始。BootLoader根據(jù)實(shí)現(xiàn)的功能不同,其復(fù)雜程度也各不相同。一個簡單的BootLoader程序可以僅僅完成串行口的初始化,并進(jìn)行通信,而功能完善的BootLoader可以支持比較復(fù)雜的命令集,對系統(tǒng)的軟硬件資源進(jìn)行合理的配置與管理。因此,用戶可根據(jù)自身的需求實(shí)現(xiàn)相應(yīng)的功能。BootLoader的設(shè)計步驟一般如下:
2.1.1 系統(tǒng)初始化
系統(tǒng)初始化主要實(shí)現(xiàn)以下的幾個功能:
(1)進(jìn)入SVC32工作模式(管理模式),以取得訪問一些系統(tǒng)資源的權(quán)限。
(2)禁止所有的中斷并清除所有中斷標(biāo)志。
(3)初始化SYSCFG寄存器。
(4)導(dǎo)入鏈接器預(yù)定義的變量,為存儲器的重映射做準(zhǔn)備。
2.1.2 Memory Remap的實(shí)現(xiàn)
Memory Remap就是地址重映射,即存儲空間的重新分配,主要分為以下幾個步驟:
2.1.2.1 初始化SDRAM
系統(tǒng)剛上電后,只有Flash是可用的, SDRAM沒有被初始化,是不可用的。此時Flash被映射到0-2M的地方。通過配置相關(guān)寄存器完成SDRAM的初始化后,SDRAM被映射到了2-18M的位置上。此時的Memory Map為:0-2M是Flash,2-18M是SDRAM
2.1.2.2 將BootLoader從Flash中復(fù)制到SDRAM中
在此之前,BootLoader一直是在Flash里面執(zhí)行的。為了實(shí)現(xiàn)Memory Remap,并且保證remap后BootLoader可以繼續(xù)執(zhí)行,需要把BootLoader自己全部復(fù)制到SDRAM里面去。BootLoader的大小利用鏈接器預(yù)定義的程序段變量。此時,在SDRAM里己經(jīng)有了一個BootLoader的拷貝,但是必須注意,BootLoader還是在Flash里面執(zhí)行。此時的Memory Map為:0-2M還是Flash,2-18 M還是SDRAM,但是SDRAM里面多了一個BootLoader的拷貝。
2.1.2.3 地址重映射
通過設(shè)置S3C44B0的相關(guān)寄存器,可以完成最后的地址重映射。SDRAM在0-16M的位置,而Flash被Map到了16-18M的位置。由于在SDRAM有一份BootLoader的拷貝,所以Remap以后BootLoader將轉(zhuǎn)到SDRAM里面來執(zhí)行。
2.1.3 Kernel的裝載
此處的Kernel即為uClinux的內(nèi)核映像,完成Kernel把控制權(quán)交給了uClinux來管理,Kernel將被裝載到的裝載后,系統(tǒng)就0x8000處。Kernel的裝載過程如下所示:
(1)將RW段復(fù)制到OxA0,0000處,ZI段清零。
(2)設(shè)置堆棧指針SP=0x80,0000。
(3)跳轉(zhuǎn)到函數(shù)loadkernel()中。
(4)將Kernel裝載到0x8000,同時將PC指向0x8000。
(5)Kernel獲得控制權(quán),接管整個系統(tǒng)。
2.2 嵌入式操作系統(tǒng)的編譯與移植
本系統(tǒng)采用uCLinux作為操作系統(tǒng),uCLinux包含一整套的編譯、調(diào)試等開發(fā)工具、內(nèi)核源代碼、各種文件系統(tǒng)、圖形接口、各種協(xié)議、驅(qū)動程序以及豐富的應(yīng)用程序。uCLinux操作系統(tǒng)主要由內(nèi)核、Shell、文件結(jié)構(gòu)組成;其中內(nèi)核是系統(tǒng)的心臟,是運(yùn)行程序和管理磁盤、打印機(jī)等硬件設(shè)備的核心程序。Linux的內(nèi)核主要由5個子系統(tǒng)構(gòu)成:進(jìn)程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口和進(jìn)程間通信,在設(shè)計時,可以根據(jù)需要配置內(nèi)核選擇體系結(jié)構(gòu)和裁剪內(nèi)核。
2.2.1 uClinux交叉編譯環(huán)境
uClinux交叉編譯環(huán)境的建立可分為以下兩個步驟:
(1)要在宿主PC機(jī)上安裝標(biāo)準(zhǔn)Linux操作系統(tǒng)(也可以在Windows環(huán)境下安裝Cygwin,模擬Linux環(huán)境,但可能在開發(fā)過程中產(chǎn)生兼容性錯誤,因此不推薦),如RedHat Linux,并對計算機(jī)的硬件設(shè)備如網(wǎng)卡進(jìn)行配置,確認(rèn)網(wǎng)絡(luò)配置正確。
(2)要在宿主PC機(jī)上安裝交又編譯的一些工具鏈,主要有以下這些: arm-elf-binutils,arm-elf-gcc, genromfs,arm-elf-gdb, elf2flt等。
2.2.2 uClinux內(nèi)核的編譯和移植
uClinux內(nèi)核采用模塊化的組織結(jié)構(gòu),通過增減內(nèi)核模塊的方式來增減系統(tǒng)的功能,因此,通過正確合理的設(shè)置內(nèi)核的功能模塊,只編譯系統(tǒng)所需功能的代碼以減少內(nèi)核的大小。編譯工作的具體步驟下所示:
(1)解壓源代碼文件并進(jìn)入到uClinux-Samsung目錄中。
(2)make menuconfig進(jìn)行內(nèi)核配置。
(3)make dep尋找文件依賴關(guān)系。
(4)make clean清除無用文件。
(5)make lib only 編譯庫文件。
(6)make user_ only編澤用戶應(yīng)用程序文件。
(7)make image編澤內(nèi)核文件。
(8)make編譯完成,生成內(nèi)核文件。
編譯上述步驟后,會在images目錄下看到一些文件,如:linux.text,linux.data,romfs.img,image.bin,image.rom,image.ram,boot.rom。
最后,將image.rom燒寫入Flash存儲器的0x0處,當(dāng)系統(tǒng)復(fù)位或上電時,內(nèi)核會自解壓到SDRAM,并開始運(yùn)行。可以通過串行口觀察uClinux的啟動情況。
如果編譯和加載的過程都正確,就可以在超級終端中看到uClinux移植成功的相關(guān)提示。
2.3 uCLinux下的網(wǎng)絡(luò)編程
2.3.1 uCLinux下的網(wǎng)絡(luò)編程協(xié)議簡介
uCLinux下的TCP/IP網(wǎng)絡(luò)協(xié)議棧的各層之間是通過一系列互相連接層的軟件來實(shí)現(xiàn)Internet地址族的。其中BSD socket層由專門用來處理BSD socket的通用套接字管理軟件來處理,它由INET socket層來支持。INET socket為基于IP的協(xié)議TCP和UDP管理傳輸端點(diǎn)。 UDP是一個無連接協(xié)議,而TCP(傳輸控制協(xié)議)是一個,TCP靠的端對端協(xié)議。傳輸U(kuò)DP包的時候,uCLinux不知道也不關(guān)心它們是否安全到達(dá)了口的地。TCP則不同。在TCP連接的兩端都需要加上一個編號,以保證傳輸?shù)臄?shù)據(jù)被正確接收。在IP層,實(shí)現(xiàn)了Internet協(xié)議代碼,這些代碼要給傳輸?shù)臄?shù)據(jù)加上一個IP頭,并且知道如何把傳入的IP包送給TCP或者UDP協(xié)議。在IP層以下,就是網(wǎng)絡(luò)設(shè)備來支持所有的uCLinux 網(wǎng)絡(luò)工作,如PLIP, SLIP和以太網(wǎng)。
2.3.2 uCLinux環(huán)境下的socket編程
網(wǎng)絡(luò)的socket數(shù)據(jù)傳輸是一種特殊的I/O,socket也是一種文件描述符,也具有一個類似文件的函數(shù)調(diào)用socket()。該函數(shù)返回一個整型的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該socket函數(shù)實(shí)現(xiàn)的。常用的socket類型有兩種:流式socket和數(shù)據(jù)報式socket。兩者的去別在于:前者對應(yīng)于TCP服務(wù),后者對應(yīng)于UDP服務(wù)。uCLinux中socket編程中用到的函數(shù)有:
(1)socket函數(shù):為了執(zhí)行I/O,一個進(jìn)程必須做的第一件事情就是調(diào)用socket函數(shù),指定期望的通信協(xié)議類型(使用IPv4的TCP、使用IPv6的UDP, Unix域字節(jié)流協(xié)議等)。
(2)connect函數(shù):TCP客戶用connect函數(shù)來建立一個與TCP服務(wù)器的連掛。
(3)bind函數(shù): 函數(shù)bind給套接口分配一個本地協(xié)議地址,對于網(wǎng)際協(xié)議,協(xié)議地址是非顛倒2位IPv4地址16位的TCP或UDP端口號的組合。
(4)listen函數(shù):僅被除數(shù)TCP服務(wù)器調(diào)用。將未連接的套接口轉(zhuǎn)換成被動套接口,指示內(nèi)核應(yīng)接受指向此套接口的連接請求。根據(jù)TCP狀態(tài)轉(zhuǎn)換調(diào)用函數(shù)listen導(dǎo)致套接口從CLOSED狀態(tài)轉(zhuǎn)換到LISEN狀態(tài)。listen函數(shù)還規(guī)定了內(nèi)核為此套接口排隊的最大連接個數(shù)。
(5)accept函數(shù):accept函數(shù)由TCP服務(wù)器調(diào)用,從已完成連接隊列頭返回下一個己完成連接。若己完成連接隊列為空,則進(jìn)程睡眠。
3 小結(jié)
嵌入式系統(tǒng)是以應(yīng)用為中心、以計算機(jī)技術(shù)為基礎(chǔ)、軟硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計算機(jī)系統(tǒng)。嵌入式系統(tǒng)已經(jīng)在各個領(lǐng)域 得到了廣泛的應(yīng)用,如遠(yuǎn)程監(jiān)控、智能儀表、數(shù)控系統(tǒng)、消費(fèi)產(chǎn)品等。隨著嵌入式系統(tǒng)軟硬件技術(shù)的飛速發(fā)展,其在行業(yè)的應(yīng)用領(lǐng)域必將更為廣闊,嵌入式系統(tǒng)的研究將會有非常廣泛的前景。
參考文獻(xiàn):
[1] 魏忠,蔡勇,雷紅衛(wèi).嵌入式開發(fā)詳解[M].北京:電子工業(yè)出版社,2003.
[2] 王陳賾.ARM嵌入式技術(shù)實(shí)踐教程[M].北京:航空航天大學(xué)出版社,2005.
[3] 李駒光,聶雪原,姜澤明,等.ARM應(yīng)用系統(tǒng)開發(fā)詳解[M].北京:清華大學(xué)出版社,2003.
[4] 杜春蕾.ARM體系結(jié)構(gòu)與編程[M].清華大學(xué)出版社,2003.