【摘要】網(wǎng)絡(luò)互聯(lián)已深入多個(gè)領(lǐng)域,而RTEMS實(shí)時(shí)操作系統(tǒng)對(duì)網(wǎng)絡(luò)設(shè)備的支持卻明顯不足。為添加RTEMS對(duì)網(wǎng)絡(luò)的支持,充分利用RTEMS的性能。首先對(duì)RTEMS網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的運(yùn)行機(jī)理進(jìn)行了分析,介紹了網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)開發(fā)的框架。然后在RTEMS平臺(tái)中實(shí)現(xiàn)DM9000A網(wǎng)絡(luò)接口卡驅(qū)動(dòng),結(jié)合網(wǎng)絡(luò)驅(qū)動(dòng)的實(shí)例重點(diǎn)分析了RTEMS系統(tǒng)下網(wǎng)路驅(qū)動(dòng)程序的開發(fā)方法。最后使得DM9000A在RTEMS平臺(tái)下能夠正常編譯,且通過實(shí)驗(yàn)來驗(yàn)證實(shí)現(xiàn)的可行性和有效性。
【關(guān)鍵詞】RTEMS;實(shí)時(shí)系統(tǒng);DM9000A網(wǎng)絡(luò)接口卡;網(wǎng)絡(luò)驅(qū)動(dòng)
1.引言
RTEMS(Real-Time Executive for Multiprocessor Systems)是一個(gè)開放源代碼的實(shí)時(shí)嵌入式操作系統(tǒng),對(duì)各類主流的嵌入式平臺(tái)都有良好的支持[1]。為了添加RTEMS平臺(tái)的網(wǎng)絡(luò)應(yīng)用功能,需要設(shè)計(jì)出合理的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。為了滿足RTEMS平臺(tái)的驅(qū)動(dòng)模型,必須對(duì)其組織組織框架有所理解。由于RTEMS是開源的,這使得可以對(duì)其網(wǎng)絡(luò)驅(qū)動(dòng)模塊部分進(jìn)行分析和移植以滿足不同的應(yīng)用需求。本文通過對(duì)RTEMS網(wǎng)絡(luò)源碼的分析,并結(jié)合DM9000A驅(qū)動(dòng)的實(shí)例,探討了如何為RTEMS添加網(wǎng)絡(luò)驅(qū)動(dòng)。
2.RTEMS的網(wǎng)絡(luò)模塊
RTEMS網(wǎng)絡(luò)棧基于BSD,并提供了絕大部分BSD的網(wǎng)絡(luò)服務(wù)。網(wǎng)絡(luò)應(yīng)用程序通過套接字(socket)接口來實(shí)現(xiàn)本地及網(wǎng)絡(luò)設(shè)備間的通信。應(yīng)用程序通過網(wǎng)絡(luò)模塊與底層驅(qū)動(dòng)進(jìn)行交互,是無法直接訪問網(wǎng)絡(luò)設(shè)備的。
2.1 網(wǎng)絡(luò)驅(qū)動(dòng)運(yùn)行機(jī)理
不同于RTEMS平臺(tái)的其他設(shè)備驅(qū)動(dòng),網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)不是交由IO管理器管理的,而是由BSD協(xié)議棧實(shí)現(xiàn)管理的。如圖1所示,由上之下,RTEMS網(wǎng)絡(luò)棧分為網(wǎng)絡(luò)協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動(dòng)接口層,以及網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)層。
圖1 RTEMS網(wǎng)絡(luò)驅(qū)動(dòng)框架
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)層提供訪問物理設(shè)備的具體驅(qū)動(dòng)程序。設(shè)備驅(qū)動(dòng)接口層,向上為上層提供訪問設(shè)備的接口,向下提供統(tǒng)一的驅(qū)動(dòng)程序調(diào)用接口,通過if_start函數(shù)接口啟動(dòng)發(fā)送,通過設(shè)備的中斷來觸發(fā)具體的收、發(fā)操作。網(wǎng)絡(luò)設(shè)備接口層是設(shè)備驅(qū)動(dòng)接口層的延續(xù),其向協(xié)議接口層提供對(duì)硬件設(shè)備的統(tǒng)一描述,即每個(gè)網(wǎng)絡(luò)設(shè)備都必須有屬于自己的ifnet結(jié)構(gòu)體,該結(jié)構(gòu)也展示了RTEMS面向?qū)ο蠓椒ǖ脑O(shè)計(jì),是設(shè)備驅(qū)動(dòng)層中各個(gè)函數(shù)的容器。網(wǎng)絡(luò)協(xié)議接口層為上層協(xié)議提供了統(tǒng)一的接收、發(fā)送數(shù)據(jù)包的接口,其實(shí)質(zhì)是通過數(shù)據(jù)包中的協(xié)議頭來決定不同協(xié)議函數(shù)的調(diào)用。這一層屏蔽了底層的具體硬件細(xì)節(jié)。
首先,它會(huì)阻塞并等待接收事件START_RECEIVE_EVENT的發(fā)生;然后,當(dāng)?shù)却氖录l(fā)生時(shí),會(huì)向系統(tǒng)申請(qǐng)數(shù)據(jù)緩存mbuf,獲取數(shù)據(jù)包長(zhǎng)度及狀態(tài)碼,檢查設(shè)備是否已經(jīng)接受到數(shù)據(jù)、狀態(tài)碼是否正確,調(diào)用dm9000a_inblk_16bit()將DM9000A內(nèi)部SRAM中的數(shù)據(jù)復(fù)制到剛剛申請(qǐng)的緩存mbuf中;最后,剔除以太網(wǎng)頭,并調(diào)用ether_input()向internet層傳遞數(shù)據(jù)進(jìn)行進(jìn)一步的處理。
2.2 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的主要功能
如圖2所示,網(wǎng)絡(luò)接收、發(fā)送是通過任務(wù)形式存在。發(fā)送任務(wù)Trans Daemon會(huì)一直阻塞直到有要發(fā)送的數(shù)據(jù)已經(jīng)填充發(fā)送隊(duì)列。應(yīng)用準(zhǔn)備好要發(fā)送的數(shù)據(jù)時(shí),發(fā)送任務(wù)可能依舊阻塞,當(dāng)發(fā)送中斷處理程序Transmit ISR空閑時(shí),會(huì)觸發(fā)發(fā)送事件來調(diào)用網(wǎng)絡(luò)驅(qū)動(dòng)程序的發(fā)送函數(shù)進(jìn)行數(shù)據(jù)發(fā)送。同樣的接收任務(wù)Receive Daemon會(huì)一直阻塞,當(dāng)有網(wǎng)絡(luò)數(shù)據(jù)到來時(shí)會(huì)發(fā)生接收中斷,Receive ISR會(huì)觸發(fā)數(shù)據(jù)接收事件,接著會(huì)調(diào)用網(wǎng)絡(luò)驅(qū)動(dòng)程序的接收函數(shù)來接收數(shù)據(jù),并交由網(wǎng)絡(luò)核心進(jìn)行進(jìn)一步的處理,可能涉及TCP的重傳等。之后會(huì)提交給上層應(yīng)用程序。
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的接收、發(fā)送任務(wù)極度依賴具體的硬件細(xì)節(jié),是驅(qū)動(dòng)設(shè)計(jì)中的關(guān)鍵內(nèi)容,這部分處理的好壞直接影響了整個(gè)網(wǎng)絡(luò)的性能。
圖2 RTEMS網(wǎng)絡(luò)模型
3.基于ARM的DM9000A網(wǎng)絡(luò)驅(qū)動(dòng)設(shè)計(jì)
3.1 DM9000A網(wǎng)卡硬件接口
實(shí)例中,網(wǎng)絡(luò)接口卡選擇的是DM9000A芯片。DM9000A是一個(gè)高集成而且功耗很低的高速網(wǎng)絡(luò)控制器,支持10/100M以太網(wǎng)連接,芯片內(nèi)部自帶16K字節(jié)的SRAM(3K用來發(fā)送,13K用來接收)。針對(duì)不同的處理器,接口支持8位、16位[2]。本文采用三星S3C2440 ARM作為系統(tǒng)的微處理器。S3C2440與DM9000A的連接方式如圖3所示。
S3C2440通過片選nLAN_cs線和LADDR2分別連接DM9000A芯片的nCS管腳和CMD管腳,S3C2440的LnOE線連接DM9000A的nIOR管腳,LnWE線連接DM9000A的nIOW管腳,通過S3C2440的LDATA0到LDATA15數(shù)據(jù)線和DM9000A的SD0到SD15數(shù)據(jù)線相連。而DM9000A的中斷管腳和S3C2440的IRQ_LAN相連。
圖3 DM9000A和S3C2440的連接
圖4 netdemo應(yīng)用輸出
3.2 DM9000A網(wǎng)絡(luò)驅(qū)動(dòng)設(shè)計(jì)
網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)需要完成的主要有網(wǎng)絡(luò)設(shè)備初始化、接收任務(wù)實(shí)現(xiàn)、發(fā)送任務(wù)實(shí)現(xiàn)、中斷服務(wù)程序?qū)崿F(xiàn)。
3.2.1 網(wǎng)絡(luò)設(shè)備初始化
任何設(shè)備在可使用前都必須進(jìn)行恰當(dāng)?shù)某跏蓟?。該過程是通過每設(shè)備結(jié)構(gòu)體ifnet中if_init函數(shù)實(shí)現(xiàn)。在向RTEMS注冊(cè)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)時(shí)被設(shè)定為dm9000_init(),當(dāng)開啟網(wǎng)絡(luò)功能支持時(shí)rtems_dm9000a_driver_attach會(huì)調(diào)用dm9000a_init()函數(shù)完成設(shè)備的初始化。
為完成設(shè)備初始化,dm9000a_init()會(huì)調(diào)用dm9000a_initialize_hardware完成具體的初始化,其中包括軟復(fù)位,探測(cè)設(shè)備類型、是否掛接,數(shù)據(jù)位模式,使能接收、發(fā)送中斷。
3.2.2 接收任務(wù)實(shí)現(xiàn)
由1.2節(jié)可知,RTEMS中是以任務(wù)形式監(jiān)聽是否要進(jìn)行數(shù)據(jù)的接收,當(dāng)網(wǎng)卡接收到數(shù)據(jù)時(shí),中斷會(huì)發(fā)送接收事件以喚醒接收任務(wù)進(jìn)行任務(wù)接收。這里,就以dm9000a_rxDaemon()函數(shù)來說明如何實(shí)現(xiàn)自己的接收任務(wù)。
3.2.3 發(fā)送任務(wù)實(shí)現(xiàn)
同接收任務(wù)一樣,發(fā)送任務(wù)dm9000a_txDaemon()會(huì)一直阻塞并等待中斷觸發(fā)發(fā)送事件START_TRANSMIT_EVENT;然后檢測(cè)發(fā)送隊(duì)列是否為空,不為空即調(diào)用驅(qū)動(dòng)的發(fā)送函數(shù)dm9000a_sendpacket()完成具體的數(shù)據(jù)包發(fā)送,直到發(fā)送隊(duì)列為空。
dm9000a_sendpacket()函數(shù)完成以下幾個(gè)步驟:首先,將應(yīng)用程序放在mbuf中的數(shù)據(jù)拷貝到發(fā)送緩沖txbuf數(shù)組中;然后,再將txbuf中的數(shù)據(jù)拷貝到DM9000A內(nèi)部的SRAM中等待發(fā)送,通過寫DM9000A_TCR寄存器開始硬件的發(fā)送;最后,清零DM9000A_ISR寄存器的TX位。
3.2.4 中斷服務(wù)程序?qū)崿F(xiàn)
數(shù)據(jù)包的接收和發(fā)送都會(huì)觸發(fā)硬件中斷,通知驅(qū)動(dòng)程序進(jìn)行數(shù)據(jù)包的接收和發(fā)送。中斷程序dm9000a_isr()是驅(qū)動(dòng)的核心,由其控制網(wǎng)卡的接收、發(fā)送動(dòng)作。
在dm9000a_isr()中,首先,屏蔽中斷,獲得中斷狀態(tài)碼;然后,根據(jù)DM9000A_ISR寄存器中接收和發(fā)送中斷位來觸發(fā)相應(yīng)的START_RECEIVE_EVENT和START_TRANSMIT_EVENT事件;最后,重新使能中斷。
4.DM9000A驅(qū)動(dòng)的編譯及測(cè)試
4.1 將驅(qū)動(dòng)程序編譯進(jìn)RTEMS
網(wǎng)絡(luò)驅(qū)動(dòng)被視為BSD網(wǎng)絡(luò)棧的一部分[3],由于網(wǎng)絡(luò)是RTEMS的可選支持功能,為添加網(wǎng)絡(luò)功能首先要使得RTEMS支持TCP/IP協(xié)議棧,而后才能添加定制的網(wǎng)絡(luò)驅(qū)動(dòng)程序。
為RTEMS添加網(wǎng)絡(luò)功能是通過BSP目錄下的Makefile.am文件實(shí)現(xiàn)的。這樣應(yīng)用程序就可以使用RTEMS提供的網(wǎng)絡(luò)功能了。
4.2 測(cè)試結(jié)果
使用RTEMS自帶的測(cè)試樣例netdemo進(jìn)行網(wǎng)絡(luò)測(cè)試,netdemo主要顯示網(wǎng)絡(luò)連接參數(shù),比如當(dāng)前udp、tcp請(qǐng)求,已發(fā)生中斷次數(shù)等。
不同于Linux嵌入式系統(tǒng),RTEMS的應(yīng)用程序必須和RTEMS編譯成一個(gè)鏡像,然后加載進(jìn)內(nèi)存才能執(zhí)行。在編譯鏡像前需要為netdemo應(yīng)用程序配置網(wǎng)絡(luò)參數(shù),在network_config文件中添加IP地址,網(wǎng)關(guān),應(yīng)用可使用的mbuf緩存大小等。如圖4所示,網(wǎng)絡(luò)驅(qū)動(dòng)已經(jīng)正常運(yùn)行。
5.結(jié)束語(yǔ)
本設(shè)計(jì)以DM9000A網(wǎng)絡(luò)芯片作為樣例,介紹了網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的運(yùn)行機(jī)制,詳細(xì)分析了實(shí)現(xiàn)RTEMS平臺(tái)下網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的方法和步驟。RTEMS網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)不同于其他的設(shè)備驅(qū)動(dòng)程序,其并不由IO管理器進(jìn)行管理,但也具有自身的規(guī)律,遵循這個(gè)規(guī)律,可以設(shè)計(jì)出符合應(yīng)用需求的驅(qū)動(dòng)程序。分析了RTEMS中的網(wǎng)絡(luò)驅(qū)動(dòng)程序的工作機(jī)制,同時(shí)結(jié)合樣例,詳盡闡述了如何設(shè)計(jì)網(wǎng)絡(luò)驅(qū)動(dòng)程序以使之滿足特定的應(yīng)用要求。通過對(duì)DM9000A網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的研究,對(duì)于RTEMS平臺(tái)下添加其他類似的網(wǎng)絡(luò)設(shè)備具有一定的借鑒參考價(jià)值。
參考文獻(xiàn)
[1]RTEMS Steering Committee.RTEMS Home Page[J]. 2010.
[2]DM9000A-17-DS-F01 Data Sheet[S].Davicom Semiconductor Inc,2006.
[3]RTEMS TCP/IP Networking Supplement Guide[J].On-Line Applications Research Corporation(OAR),2013.
作者簡(jiǎn)介:
吳華中(1989—),男,中北大學(xué)儀器與電子學(xué)院碩士研究生在讀,研究方向:自動(dòng)化測(cè)試與控制技術(shù)。
陳鴻(1963—),男,博士,中北大學(xué)儀器與電子學(xué)院教授,碩士生導(dǎo)師,研究方向:動(dòng)態(tài)測(cè)試。