摘? 要: TCP/IP協(xié)議棧大規(guī)模集成電路S7600A的結(jié)構(gòu)、功能,、硬件接口和應(yīng)用程序接口;介紹一個(gè)基于實(shí)時(shí)多任務(wù)操作系統(tǒng)μC/OS的S7600A應(yīng)用方案,此方案實(shí)現(xiàn)了嵌入式系統(tǒng)的Internet接入。?
關(guān)鍵詞: TCP/IP API 實(shí)時(shí)操作系統(tǒng)(RTOS) 多任務(wù)嵌入式系統(tǒng)?
?
隨著電子設(shè)備智能化要求的提高和各種功能強(qiáng)大的微處理器的推出,嵌入式系統(tǒng)逐漸成為許多電子設(shè)備不可缺少的一部分,并處在前所未有的發(fā)展期;而互聯(lián)網(wǎng)概念的深入人心更為嵌入式系統(tǒng)與互聯(lián)網(wǎng)的結(jié)合提出了要求。嵌入式系統(tǒng)接入Internet以后,不僅實(shí)現(xiàn)了設(shè)備的遠(yuǎn)程控制,、維護(hù)和升級,而且從另外一層意義上講,接入Internet的設(shè)備已經(jīng)成為網(wǎng)絡(luò)共享資源的一部分。可以說這是自電子設(shè)備智能化以來設(shè)計(jì)思想的又一次飛躍。?
嵌入式系統(tǒng)接入Internet的關(guān)鍵是滿足TCP/IP協(xié)議,。TCP/IP協(xié)議是建立在數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層,、傳輸層和應(yīng)用層上的協(xié)議族,是Internet的基礎(chǔ),。各種型號計(jì)算機(jī)運(yùn)行在不同操作系統(tǒng)之上,TCP/IP協(xié)議族允許它們互相通信。通常,一個(gè)嵌入式系統(tǒng)接入Internet,可選擇一個(gè)提供TCP/IP協(xié)議的嵌入式操作系統(tǒng),或是在現(xiàn)有操作系統(tǒng)之上加入TCP/IP軟件協(xié)議棧,實(shí)現(xiàn)TCP/IP連接,。對于嵌入式系統(tǒng),TCP/IP軟件協(xié)議棧也構(gòu)成了系統(tǒng)成本的一部分,而這部分投入占有不小的比例,。同時(shí),軟件協(xié)議棧的引入無疑要占用更多的系統(tǒng)資源,對于嵌入式系統(tǒng)來說是很可觀的。S7600A TCP/IP硬件協(xié)議棧芯片很好地解決了資源和成本有限的嵌入式系統(tǒng)的Internet接入問題,。?
1 S7600A的內(nèi)部結(jié)構(gòu)?
S7600A內(nèi)部結(jié)構(gòu)如圖1所示,它由網(wǎng)絡(luò)棧,、物理層接口、微控制器接口,、SRAM接口和片內(nèi)SRAM組成,。(1)網(wǎng)絡(luò)棧是該芯片的核心,。它建立在物理層上,包含有實(shí)現(xiàn)TCP/IP協(xié)議的特殊的層次化的數(shù)據(jù)結(jié)構(gòu),并完成數(shù)據(jù)的包裝或剝離,。其內(nèi)部又可以分為PPP(點(diǎn)對點(diǎn)協(xié)議)、IP(網(wǎng)際協(xié)議),、TCP(傳輸控制協(xié)議)/UDP(用戶數(shù)據(jù)報(bào)協(xié)議)幾個(gè)層次,。(2)物理層接口是實(shí)現(xiàn)協(xié)議的最底層接口。在這里以UART的形式提供對外連接,可以通過外接Modem實(shí)現(xiàn)Intenet接入,。(3)微控制器接口提供了與68k/x86(Motorola/Intel)MPU的標(biāo)準(zhǔn)并行接口和非標(biāo)準(zhǔn)的串行接口(串/并模式由PSX來選擇),。在x86/68k并行模式下,由C86來選擇x86或68k。SD[7:0]為地址/數(shù)據(jù)復(fù)用總線,CS為片選輸入,READX和WRITEX為讀寫信號,RS為寄存器選擇輸入,用來指示地址和數(shù)據(jù),。在串行模式下,SD7為串行數(shù)據(jù)輸入,SD6為串行時(shí)鐘輸入,SD5為串行數(shù)據(jù)輸出,WRITEX用來切換讀和寫,。另外芯片提供了中斷輸出,用來給MPU發(fā)特定請求。BUSYX用做忙指示,。?
?
?
2 S7600A內(nèi)部寄存器和數(shù)據(jù)傳輸實(shí)例?
S7600A有36個(gè)內(nèi)部寄存器,有單字節(jié),、多字節(jié),也有變長的(如PPP_String寄存器,用來存放PAP用戶名和指令,其長度與用戶名和口令的實(shí)際長度相關(guān))。對內(nèi)部寄存器的讀寫可以實(shí)現(xiàn)對S7600A的各種操作,其中若干寄存器用來做TCP/IP的協(xié)議接口,。由于寄存器數(shù)量較多,這里不一一介紹,僅舉一個(gè)TCP數(shù)據(jù)的傳輸實(shí)例來說明對該芯片的操作,。?
一個(gè)IP地址和一個(gè)端口號可以稱為一個(gè)插口(Socket)。而一個(gè)插口對可以唯一地確定互聯(lián)網(wǎng)絡(luò)里的一個(gè)TCP連接,。在進(jìn)行以下操作之前事先要建立一個(gè)TCP連接,。?
首先,將Serial_Port_Config寄存器(08H)里的SCTL標(biāo)志位置1,把對串口的控制權(quán)交給硬件(S7600A),把要傳輸?shù)臄?shù)據(jù)寫到Socket_Data寄存器(2EH)里,S7600A就會把數(shù)據(jù)通過該寄存器放到輸出緩沖區(qū)(1K字節(jié)長度)。注意輸出緩沖區(qū)地址在Buffer_Out_Length寄存器(30H-31H)里。當(dāng)輸出緩沖區(qū)為全空時(shí),該寄存器里的值是3FFH,用戶每向Socket_Data寄存器里寫一個(gè)字節(jié)的數(shù)據(jù),Buffer_Out_Length寄存器的值就會自動減一,。?
當(dāng)用戶要發(fā)送TCP數(shù)據(jù)時(shí),只要向Data_Send寄存器(30H)里寫任意一個(gè)字節(jié)的數(shù)據(jù),S7600A就會對輸出緩沖區(qū)里的數(shù)據(jù)進(jìn)行TCP數(shù)據(jù)處理(自動加入TCP首部,形成TCP段;再加入IP首部,形成IP數(shù)據(jù)報(bào);最后在串行鏈路上封裝IP數(shù)據(jù)報(bào),形成PPP數(shù)據(jù)幀,如圖2所示,。),然后通過UART接口發(fā)送出去。同時(shí)Buffer_Out_Length寄存器的值會復(fù)原到3FFH,。注意輸出緩沖區(qū)最大1K字節(jié),超過該值是不允許的,。?
?
?
3? 基于S7600A的接入方案?
3.1 系統(tǒng)構(gòu)成?
基于S7600A的接入方案如圖3所示,系統(tǒng)采用通用單片機(jī)AT89C51為控制核心。單片機(jī)既可以通過并行總線又可以通過串行總線與S7600A相連(在串行時(shí)用I/O口實(shí)現(xiàn)串行時(shí)序),通過對S7600A的操作實(shí)現(xiàn)TCP/IP協(xié)議,。S7600A經(jīng)UART接口與嵌入式Modem相接,經(jīng)電話線接入Internet,。應(yīng)用程序與遠(yuǎn)程服務(wù)器或客戶機(jī)建立TCP或UDP連接,在此基礎(chǔ)上實(shí)現(xiàn)多種應(yīng)用,如FTP、SMTP,、POP3,、Telnet、IP電話服務(wù)等,。從網(wǎng)上獲取的信息可以經(jīng)系統(tǒng)總線傳給嵌入系統(tǒng)的其他部分或者直接顯示在LCD上,同樣系統(tǒng)產(chǎn)生的信息也可以發(fā)送到網(wǎng)絡(luò)上,。?
?
?
3.2 系統(tǒng)的軟件設(shè)計(jì)?
(1) 嵌入式實(shí)時(shí)多任務(wù)操作系統(tǒng)?
在這個(gè)系統(tǒng)里,引入了實(shí)時(shí)操作系統(tǒng)(RTOS)。通常對單片機(jī)的開發(fā)是在硬件的基礎(chǔ)上直接進(jìn)行編程,這種方法一般用于規(guī)模較小,、較簡單的系統(tǒng),對于規(guī)模較大,、較為復(fù)雜的系統(tǒng)會產(chǎn)生一定的隱患,屬于較低層次的開發(fā)。近年來,在嵌入式應(yīng)用中使用實(shí)時(shí)多任務(wù)操作系統(tǒng)已經(jīng)成為一個(gè)熱點(diǎn),、一種時(shí)尚,從本質(zhì)意義上講,是系統(tǒng)開發(fā)層次的一種提高,。在實(shí)時(shí)多任務(wù)操作系統(tǒng)的支持下,多個(gè)任務(wù)可以按照一定關(guān)系并行工作,CPU資源得到充分利用,系統(tǒng)可靠性得到很好的保證,同時(shí)方便組織開發(fā)任務(wù)。?
當(dāng)前出現(xiàn)了很多商業(yè)的RTOS,但一般價(jià)格比較昂貴,代碼不公開,。本系統(tǒng)使用開放源代碼的RTOS μC/OS,這個(gè)RTOS已經(jīng)在很多系統(tǒng)上進(jìn)行了成功的應(yīng)用,同時(shí)已經(jīng)被移植到8051上,。?
(2) S7600A應(yīng)用程序接口(API)?
S7600A以硬件的形式提供了TCP/IP協(xié)議的簡單端口。即便如此,,對其內(nèi)部眾多寄存器進(jìn)行尋址操作也并不容易,建立TCP/IP連接仍然是比較復(fù)雜的過程,。幸運(yùn)的是,廠商為其提供了API函數(shù)集,通過調(diào)用該函數(shù)集,可以實(shí)現(xiàn)S7600A的所有功能。這個(gè)函數(shù)集是建立在RTOS上的,。但是這套API又具有硬件和平臺的獨(dú)立性,非常有利于在各種系統(tǒng)上移植,這種特性為實(shí)際開發(fā)項(xiàng)目的層次化組織創(chuàng)造了非常有利的條件,。其硬件獨(dú)立性是通過API里的兩個(gè)文件iHwIFace.h和iHwIFace.c實(shí)現(xiàn)的,用戶在重寫這兩個(gè)文件后,可以使API用在不同的CPU上,它實(shí)際相當(dāng)于S7600A的底層驅(qū)動程序。在這個(gè)系統(tǒng)里要根據(jù)AT89C51和S7600A的編址連接來確定這兩個(gè)文件,。其平臺獨(dú)立性是通過API里的iSys.h和iSys.c實(shí)現(xiàn)的,用戶在重寫這兩個(gè)文件后,可以使API運(yùn)行在不同的操作系統(tǒng)上,在該公司提供的這套API里已經(jīng)附帶了基于μC/OS的這兩個(gè)文件,。?
該API包括兩個(gè)主要部分:iStacApi(實(shí)現(xiàn)PPP)和iSockApi(實(shí)現(xiàn)Socket連接),對S7600A的功能進(jìn)行了簡單而有效的封裝,為應(yīng)用軟件的開發(fā)提供了方便,。如表1,、表2所示。?
?
?
?
?
(3)應(yīng)用程序?
應(yīng)用程序建立在RTOS和API之上,并可以實(shí)現(xiàn)多任務(wù),在編譯完畢后和RTOS庫以及API庫一起連接生成可執(zhí)行代碼,如圖4所示,。?
在系統(tǒng)需要接入Internet傳輸數(shù)據(jù)的時(shí)候,首先要通過Modem撥號,建立PPP連接,然后再根據(jù)數(shù)據(jù)傳輸?shù)木唧w需要決定建立TCP連接還是UDP連接,。一般情況下,TCP 建立可靠的連接,可以實(shí)現(xiàn)諸如FTP,、SMTP等服務(wù);而像IP電話這樣強(qiáng)調(diào)實(shí)時(shí)性的場合,需要建立UDP連接。?
在需要上網(wǎng)的時(shí)候,運(yùn)行以下程序,可以實(shí)現(xiàn)與ISP(網(wǎng)絡(luò)服務(wù)提供商)之間的撥號連接,。首先,程序調(diào)用IsInitStack(),初始化S7600A的硬件協(xié)議棧子系統(tǒng),。如果初始化成功(得到RET_CODE_OK的返值),就開始進(jìn)行撥號連接。調(diào)用IsPPPCheck()檢查是否已經(jīng)連接,如果還沒有連接,就調(diào)用IsPPPConnect()進(jìn)行撥號(該函數(shù)的參數(shù)含有進(jìn)行撥號連接的要素:pdata.name表示撥號上網(wǎng)的用戶名,例如撥169時(shí),用戶名就指定為“169”;pdata.passwd表示用戶口令,例如撥169時(shí),該口令就指定為“169”;pdata.modemInitStrings存放初始化Modem用的指令,符合Modem AT指令集,“AT”為Modem指令的前綴,。例如,“AT+FAE=0”表示關(guān)閉data/fax自動應(yīng)答模式,“ATE0”表示禁止指令回應(yīng);pdata.baudRate為波特率;pdata.modemDialString為撥號號碼,此處為電話號碼169,“DT”表示用雙音頻撥號);如果已經(jīng)建立了連接,就調(diào)用IsGetOurIP()得到IP地址或者調(diào)用IsPPPKeepAlive()保持連接,。?
??? #include
??? #include
??? #define L_Time 10000?
??? static int do_connect=1, was_connect=0;?
??? static iIPAddr ip;?
??? ppp_task(void)?
??? {?
????? RET_CODE rc;??????? ? //RET_CODE為API函數(shù)執(zhí)行狀態(tài)返值的數(shù)據(jù)類型?
??? ? iPPPData pdata;??? ?? //該數(shù)據(jù)結(jié)構(gòu)包含建立PPP連接的必要數(shù)據(jù)?
??? ? static char *initStrings[5];?
??? ? initStrings[]=“AT+FAE=0n”; //在字符串?dāng)?shù)組里存放Modem初始化指令?
??? ? initStrings[]=“ATE0n”; ?
??? ? initStrings[]=0;?????????? ?? //設(shè)定該字符為NULL?
??? ? initStrings[]=0;?
??? ? initStrings[]=0;?
??? ? pdata.name=“169”;?? ??? //撥號上網(wǎng)的用戶名?
??? ? pdata.passwd=“169”;??? //撥號上網(wǎng)的用戶口令?
??? ? pdata.baudRate=28800;?? ? //設(shè)置波特率?
??? ? pdata.hwFlowCtrl=1;???? ? //啟用硬件流控制?
??? ? pdata.useModem=1;?
??? ? pdata.modemDialString=“ATDT 169”; //ATDT為雙音頻撥號指令?
??? ? pdata.auth=IPPP_AUTH_PAP;? ?????? //提供PAP驗(yàn)證?
??? ? pdata.modemInitStrings=initstrings; ? //Modem初始化的系列指令,必須以NLLL結(jié)尾?
??? ? rc=IsInitStack();???? ??? //初始化硬件棧子系統(tǒng)?
??? ? if{rc==RET_CODE_OK}?
??? ? {?
??? ? ? while(do_connect)?
??? ? ? {?
??? ? ????? rc=IsPPPCheck();? //檢查PPP 連接是否激活?
??? ??????? if(rc==RET_CODE_OK)?
??? ? ????? {?
??? ??? ??????????? if(was_connect==0)?
??? ??? ??????????? {?
??? ??? ??????????????? rc=IsGetOurIP(&ip);? //獲取IP地址?
??? ??? ??????????????? was_connect=1;?
??????? ?? ???????? }?
??? ? ????? }?
??? ? ????? else if(was_connect)?
??????????? {?
??????? ????? ????? was_connect=0;?
????? ????????? ??? rc=IsPPPKeepAlive(L_TIME)//在連接失效時(shí)重新建立連接?
??? ????? ? }?
??? ??? ??? else?
??? ????? ? {?
??????? ????? ????? rc=IsPPPConnect(&pdata,,L_TIME);//撥號并與ISP建立PPP連接?
??????? ????? ????? continue;?
??? ????? ? }?
??? ? ????? smallSleep(L_TIME);?
???????? }?
??? }?
}?
基于RTOS和S7600A的嵌入式系統(tǒng)Internet接入方案硬件上簡潔可靠,、成本適中;軟件開發(fā)上體現(xiàn)了較好的層次思想和較高的技術(shù)水準(zhǔn),可維護(hù)性好,可擴(kuò)展性好。?
參考文獻(xiàn)?
1 Seiko Instruments Inc. S7600A Datasheet.2000.?
2 Seiko Instruments Inc.S7600A Network Stack Driver APIs.?
3 W.Richard Stevens. TCP/IP Illustrated Vol.1 The Protocols?
4 Miller Freeman,,Inc. μC/OS-II:the Real Time Kernel.