[摘要]文章通過對(duì)硬件的選擇構(gòu)建基于嵌入式網(wǎng)絡(luò)的遠(yuǎn)程監(jiān)測(cè)系統(tǒng),介紹控制系統(tǒng)中嵌入式操作系統(tǒng)Linux在Samsung公司32位ARM9芯片S3C2410A上的移植、網(wǎng)卡驅(qū)動(dòng)程序以及對(duì)網(wǎng)絡(luò)通信的設(shè)計(jì)。
[關(guān)鍵詞]嵌入式網(wǎng)絡(luò);S3C2410;Linux;遠(yuǎn)程監(jiān)測(cè)
[作者簡(jiǎn)介]陳偉歌, 河南理工大學(xué)在讀碩士,河南鄭州,454003;閻有運(yùn),河南理工大學(xué)高級(jí)工程師,碩士生導(dǎo)師,河南鄭州,454003
[中圖分類號(hào)] TP27[文獻(xiàn)標(biāo)識(shí)碼] A[文章編號(hào)] 1007-7723(2008)08-0042-0003
一、引言
嵌入式系統(tǒng)是以應(yīng)用為中心,軟硬件可裁減的,適用于應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積等綜合性嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。目前,已有許多嵌入式系統(tǒng)將網(wǎng)絡(luò)功能視為其系統(tǒng)的主要發(fā)展趨勢(shì),根據(jù)Forrester Research的研究顯示,到2010年將有95%的聯(lián)網(wǎng)設(shè)備不再是計(jì)算機(jī),而是帶有網(wǎng)絡(luò)功能的嵌入式系統(tǒng)。這種系統(tǒng)具有以下優(yōu)點(diǎn)[1]:
(1)嵌入式網(wǎng)絡(luò)的監(jiān)測(cè)設(shè)備同時(shí)充當(dāng)網(wǎng)絡(luò)服務(wù)器,將信號(hào)轉(zhuǎn)換、采樣及TCP/IP通信等功能集成到一塊,所以系統(tǒng)結(jié)構(gòu)簡(jiǎn)單、尺寸微小、價(jià)格低廉;
(2)采用TCP/IP網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn),系統(tǒng)組網(wǎng)容易,傳輸數(shù)據(jù)多、速率快;
(3)客戶端可做到無需任何額外程序,通過Web瀏覽器(IE)就能對(duì)設(shè)備進(jìn)行監(jiān)測(cè)。
二、系統(tǒng)硬件結(jié)構(gòu)設(shè)計(jì)
遠(yuǎn)程監(jiān)測(cè)的實(shí)質(zhì)是將前端傳感設(shè)備采集的現(xiàn)場(chǎng)信號(hào)轉(zhuǎn)換為符合TCP/IP協(xié)議的網(wǎng)絡(luò)信號(hào),使用戶通過任一個(gè)局域網(wǎng)或Internet終端就能訪問到該監(jiān)測(cè)數(shù)據(jù),其系統(tǒng)如圖1所示:
系統(tǒng)選用ARM9芯片S3C2410作為系統(tǒng)的主控制器。S3C2410是三星公司生產(chǎn)的基于ARM92OT內(nèi)核的16/32位RISC嵌入式微處理器,具有高性價(jià)比和低功耗的特點(diǎn)。它提供一組完整的系統(tǒng)外圍設(shè)備,從而大大減少了整個(gè)系統(tǒng)的成本,省去了為系統(tǒng)配置額外器件的開銷。
網(wǎng)絡(luò)芯片選用CS8900A芯片,它是CIRRUS LOGIC公司生產(chǎn)的低功耗、性能優(yōu)越的16位以太網(wǎng)控制器,功能強(qiáng)大。該芯片的突出特點(diǎn)是使用靈活,其物理層接口、數(shù)據(jù)傳輸模式和工作模式等都能根據(jù)需要而動(dòng)態(tài)調(diào)整,通過內(nèi)部寄存器的設(shè)置來適應(yīng)不同的應(yīng)用環(huán)境。CS8900A基本工作原理是:在收到由主機(jī)發(fā)來的數(shù)據(jù)報(bào)(從目的地址域到數(shù)據(jù)域)后,偵聽網(wǎng)絡(luò)線路。如果線路忙,它就等到線路空閑為止;否則,立即發(fā)送該數(shù)據(jù)幀。發(fā)送過程中,首先,它添加以太網(wǎng)幀頭(包括先導(dǎo)字段和幀開始標(biāo)志),然后,生成CRC校驗(yàn)碼,最后,將此數(shù)據(jù)幀發(fā)送到以太網(wǎng)上。接收時(shí),它將從以太網(wǎng)收到的數(shù)據(jù)幀在經(jīng)過解碼、去掉幀頭和地址檢驗(yàn)等步驟后緩存在片內(nèi)。在CRC校驗(yàn)通過后,它會(huì)根據(jù)初始化配置情況,通知主機(jī)CS8900A收到了數(shù)據(jù)幀,最后,用I/O模式、Memory模式,或者 DMA模式中的一種將數(shù)據(jù)幀傳輸?shù)街鳈C(jī)的存儲(chǔ)區(qū)中。本系統(tǒng)選用I/O傳輸模式,因?yàn)檫@種模式比較簡(jiǎn)單。CS8900A與主控芯片連接如圖2所示。
三、嵌入式Linux系統(tǒng)的移植
嵌入式操作系統(tǒng)作為嵌入式系統(tǒng)的靈魂組成,如何正確選擇一個(gè)合適的嵌入式操作系統(tǒng)顯得尤為重要。本文選用嵌入式Linux系統(tǒng),它具有開放的源代碼、廣泛的技術(shù)支持、良好的可擴(kuò)展性能以及對(duì)眾多硬件支持的優(yōu)勢(shì)。
(一)Boot Loader的下載
系統(tǒng)加電后運(yùn)行的第一段軟件代碼為Boot Loader,通過這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。對(duì)于一塊裸板,只可以通過JTAG進(jìn)行下載,本系統(tǒng)中Boot Loader便需要用JTAG下載方式。使用三星提供的sjf2410 JTAG燒寫,在Windows環(huán)境下實(shí)現(xiàn)。由于Windows2000以上系統(tǒng)不允許一般程序?qū)0口進(jìn)行操作,因此,要使用計(jì)算機(jī)的并口進(jìn)行JTAG燒寫,必須安裝GIVEO.SYS,安裝完成后用JTAG燒寫。在第一次燒寫成功后,就不需要再用JTAG燒寫B(tài)oot Loader了。因?yàn)锽oot Loader本身能夠燒寫FLASH的驅(qū)動(dòng),通過串口燒寫各種文件到FLASH中。
(二)Linux內(nèi)核的移植
在Linux內(nèi)核代碼中有arch目錄,與體系結(jié)構(gòu)相關(guān)的代碼都存放在arch/arm下面。根目錄下面只需要修改Makefile文件,該文件的主要任務(wù)是產(chǎn)生vmlinux文件和內(nèi)核模塊。用make menuconfig命令配置內(nèi)核,當(dāng)然也可以用make config,make oldconfig和make xconfig命令來配置內(nèi)核。編譯內(nèi)核需要?jiǎng)?chuàng)建內(nèi)核依賴關(guān)系、內(nèi)核鏡像文件和內(nèi)核模塊。用make dep命令讀取配置過程中生成的配置文件,創(chuàng)建對(duì)應(yīng)于配置的依賴關(guān)系;用make clean刪除前面步驟遺留的文件;然后生成所需要的內(nèi)核文件,用make zImage得到可移植的內(nèi)核文件。內(nèi)核文件傳至開發(fā)板上便可以通過Boot Loader來加載運(yùn)行。
(三)驅(qū)動(dòng)程序的開發(fā)
設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)的重要組成部分,大量的系統(tǒng)外設(shè)都是通過設(shè)備驅(qū)動(dòng)才能得以正常工作;設(shè)備驅(qū)動(dòng)程序也是操作系統(tǒng)源代碼中數(shù)量最大的一個(gè)部分;設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核的一部分,它直接與內(nèi)核打交道,設(shè)備驅(qū)動(dòng)的好壞將直接影響操作系統(tǒng)的性能、穩(wěn)定性以及安全性。在此,僅對(duì)A/D轉(zhuǎn)換驅(qū)動(dòng)和網(wǎng)絡(luò)驅(qū)動(dòng)進(jìn)行研究。
A/D轉(zhuǎn)換驅(qū)動(dòng)程序負(fù)責(zé)完成A/D轉(zhuǎn)換器的打開、關(guān)閉以及對(duì)轉(zhuǎn)換結(jié)果進(jìn)行讀取操作等。其主要通過以下三個(gè)函數(shù)實(shí)現(xiàn):
static int adc_enable();
static int adc_disable();
static int adc_read()。
其中,adc_enable()和adc_disable()負(fù)責(zé)控制S3C2410內(nèi)部A/D轉(zhuǎn)換的打開和關(guān)閉,控制寄存器的設(shè)置等工作。上層函數(shù)通過調(diào)用它們來控制A/D轉(zhuǎn)換器的工作狀態(tài)。adc_read()負(fù)責(zé)完成A/D轉(zhuǎn)換的讀取操作。當(dāng)調(diào)用該函數(shù)時(shí),處理器將讀取A/D轉(zhuǎn)換的最終結(jié)果,以供上層應(yīng)用程序使用。
在本系統(tǒng)中,網(wǎng)絡(luò)驅(qū)動(dòng)程序是針對(duì)CS8900A芯片編程,正確初始化芯片,并提供數(shù)據(jù)輸入/輸出和控制接口給高層網(wǎng)絡(luò)協(xié)議使用。
在網(wǎng)上可以查找到2.6的CS8900A的驅(qū)動(dòng)程序。在cs8900a.c文件源碼中,函數(shù)功能如下所述[2]:
1.CS_Init():CS8900A初始化。初始化步驟為:(1)檢測(cè)CS8900A芯片是否存在,然后軟件復(fù)位CS8900A芯片;(2)如果使用Memory Map方式訪問CS8900A芯片內(nèi)部寄存器,就設(shè)置CS8900A內(nèi)部寄存器地址(默認(rèn)為I/O方式訪問);(3)設(shè)置CS8900A芯片的MAC地址;(4)關(guān)閉事件中斷(使用查詢方式,如果使用中斷方式,則添加中斷服務(wù)程序再打開CS8900A中斷允許位);(5)配置CS8900A,然后允許CS8900A接收和發(fā)送64~1518B的網(wǎng)絡(luò)幀及網(wǎng)絡(luò)廣播幀。
2.CS_Close():關(guān)閉CS8900A芯片數(shù)據(jù)收發(fā)功能,并關(guān)閉中斷請(qǐng)求。
3.CS_Reset():復(fù)位CS8900A芯片。
4.CS_Identification():獲得CS8900A芯片ID和修訂版本號(hào)。
5.CS_Transmit Packet():數(shù)據(jù)包輸出。將要發(fā)送的數(shù)據(jù)包從網(wǎng)口發(fā)送出去。發(fā)送數(shù)據(jù)報(bào)時(shí),先把發(fā)送命令寫到發(fā)送命令寄存器,把發(fā)送長(zhǎng)度寫到發(fā)送長(zhǎng)度寄存器;然后等待CS8900A內(nèi)部總線狀態(tài)寄存器發(fā)送就緒位置位,便將數(shù)據(jù)包的數(shù)據(jù)順序?qū)懙蕉丝诩拇嫫鳎?6位寬,一次兩個(gè)字節(jié))。
6.CS_Receive Packet():數(shù)據(jù)包接收。查詢數(shù)據(jù)接收事件寄存器,若有數(shù)據(jù)幀接收就緒,讀取接收狀態(tài)寄存器,并讀取接收長(zhǎng)度寄存器,得到數(shù)據(jù)幀的長(zhǎng)度,然后從數(shù)據(jù)端口寄存器順序讀取數(shù)據(jù)。
四、嵌入式遠(yuǎn)程監(jiān)測(cè)系統(tǒng)設(shè)計(jì)
(一)Linux下的Socket編程
Linux系統(tǒng)是通過提供套節(jié)口(socket)來進(jìn)行網(wǎng)絡(luò)編程的。它采用客戶機(jī)/服務(wù)器的通信機(jī)制,使網(wǎng)絡(luò)客戶機(jī)和服務(wù)器通過Socket實(shí)現(xiàn)網(wǎng)絡(luò)之間的連接和數(shù)據(jù)通信,即網(wǎng)絡(luò)進(jìn)程之間的通信。
常用的兩種網(wǎng)絡(luò)接口是:數(shù)據(jù)流套節(jié)口和數(shù)據(jù)報(bào)套節(jié)口。數(shù)據(jù)流套接口采用的TCP協(xié)議是可靠的雙向連接的通信數(shù)據(jù)流,是一種高質(zhì)量的數(shù)據(jù)傳輸。數(shù)據(jù)報(bào)套接口有時(shí)也叫做“無連接的套接口”,使用UDP協(xié)議,數(shù)據(jù)報(bào)的順序是沒有保障的。數(shù)據(jù)報(bào)是按一種應(yīng)答的方式進(jìn)行數(shù)據(jù)傳輸?shù)腫3]。
(二)Linux下動(dòng)態(tài)Web頁面的實(shí)現(xiàn)
目前有許多種不同的實(shí)現(xiàn)動(dòng)態(tài)Web 頁面的技術(shù), 如CGI、ASP、PHP 和JSP 等。在Linux 下如果要實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁, 通常采用CGI。CGI(通用網(wǎng)關(guān)接口)提供Web 服務(wù)器一個(gè)執(zhí)行外部程序的通道, 這種服務(wù)端技術(shù)使得瀏覽器和服務(wù)器之間具有交互性[4]。CGI 程序可用任何程序設(shè)計(jì)語言編寫, 如Shell 腳本語言、Perl、Fortran、Pascal、C 語言等。 本系統(tǒng)選擇用C 語言來編寫CGI程序,其開發(fā)測(cè)試的一般流程如圖3所示:
五、結(jié)語
本文給出了一種基于ARM和嵌入式Linux操作系統(tǒng)的嵌入式遠(yuǎn)程監(jiān)測(cè)系統(tǒng)設(shè)計(jì)方法,研究了相應(yīng)的軟硬件平臺(tái)設(shè)計(jì)和嵌入式Linux操作系統(tǒng)的移植。嵌入式遠(yuǎn)程監(jiān)測(cè)系統(tǒng)具有成本低、開放性好、可移植性強(qiáng)等優(yōu)點(diǎn),便于后期維護(hù)和升級(jí)。嵌入式遠(yuǎn)程監(jiān)測(cè)系統(tǒng)中的嵌入式Web Server是一個(gè)單獨(dú)的提供標(biāo)準(zhǔn)接口連接的采集模塊,只要在軟件上作少許的修改并加入相應(yīng)場(chǎng)合的應(yīng)用,模塊就能很容易地應(yīng)用到各種嵌入式設(shè)備中。
[參考文獻(xiàn)]
[1]楊志紅,江漢紅.用嵌入式Internet技術(shù)構(gòu)建遠(yuǎn)程監(jiān)測(cè)系統(tǒng)[J]. 電子產(chǎn)品世界.2002,(12).
[2] 陳寧,冷建筑,宋文寧,崔麗娜.基于ARM的CS8900A 網(wǎng)絡(luò)電路設(shè)計(jì)及實(shí)現(xiàn)[J].重慶科技學(xué)院學(xué)報(bào) ,2008,10(2).
[3]于明,范書瑞,曾祥燁.ARM9嵌入式系統(tǒng)設(shè)計(jì)與開發(fā)教程[M].北京:電子工業(yè)出版社,2006.
[4]賴于樹.ARM微處理器與應(yīng)用開發(fā)[M].北京:電子工業(yè)出版社,2007.