??? 摘 要: 介紹了基于GPRS網(wǎng)的數(shù)據(jù)傳輸,、嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II" title="C/OS-II">C/OS-II以及小型TCP/IP" title="TCP/IP">TCP/IP協(xié)議棧μIP;深入論述了基于8051嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)的GPRS終端的實(shí)現(xiàn),。提供了一種較為簡(jiǎn)單,、廉價(jià)和實(shí)用的GPRS終端的實(shí)現(xiàn)方案,說明了在8051中如何進(jìn)行μC/OS-II和μIP的移植,。
??? 關(guān)鍵詞: GPRS終端? 嵌入式系統(tǒng)? 實(shí)時(shí)操作系統(tǒng)? TCP/IP
?
??? 隨著數(shù)據(jù)無線傳輸需求的驟增和中國(guó)移動(dòng)GPRS業(yè)務(wù)全面投入運(yùn)營(yíng),無線數(shù)據(jù)通信的應(yīng)用越來越廣泛,。GPRS網(wǎng)不但具有覆蓋范圍廣,、數(shù)據(jù)傳輸速度快,、通信質(zhì)量高,、永遠(yuǎn)在線和按流量計(jì)費(fèi)等優(yōu)點(diǎn),且其本身就是一個(gè)分組型數(shù)據(jù)網(wǎng),支持TCP/IP協(xié)議,無需經(jīng)過PSTN等網(wǎng)絡(luò)的轉(zhuǎn)接,可直接與Internet網(wǎng)互通,。因此GPRS業(yè)務(wù)在無線上網(wǎng)、環(huán)境監(jiān)測(cè),、交通監(jiān)控,、移動(dòng)辦公等行業(yè)中具有無可比擬的性價(jià)比優(yōu)勢(shì)。
??? 為了滿足GPRS終端的低成本,、小型化和移動(dòng)靈活等要求,現(xiàn)在廣泛采用單片機(jī)對(duì)GPRS終端進(jìn)行控制,并且引入嵌入式系統(tǒng)實(shí)現(xiàn)TCP/IP協(xié)議棧,。目前主要的困難在于:運(yùn)行TCP/IP協(xié)議對(duì)計(jì)算機(jī)存儲(chǔ)器、運(yùn)算速度等要求較高,會(huì)占用大量的系統(tǒng)資源;而嵌入式系統(tǒng)大多采用8位單片機(jī),硬件資源非常有限,支持TCP/IP協(xié)議非常困難,。本文采用了在嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II中移植一種小型TCP/IP協(xié)議棧μIP的方法,使基于8051嵌入式系統(tǒng)的GPRS終端能夠在網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)傳輸;同時(shí)改善了系統(tǒng)的性能,提高了系統(tǒng)的可靠性,增強(qiáng)了系統(tǒng)的可擴(kuò)展性和產(chǎn)品開發(fā)的可延續(xù)性,。
1 基于GPRS網(wǎng)的數(shù)據(jù)傳輸
??? GPRS是在GSM的基礎(chǔ)上引入了分組控制單元(PCU)、服務(wù)支持節(jié)點(diǎn)(SGSN)和網(wǎng)關(guān)支持節(jié)點(diǎn)(GGSN)等新部件而構(gòu)成的無線數(shù)據(jù)傳輸系統(tǒng),其用戶能夠在端到端分組方式下發(fā)送和接收數(shù)據(jù)?眼1?演,?;贕PRS網(wǎng)的數(shù)據(jù)傳輸系統(tǒng)如圖1所示。具體的數(shù)據(jù)傳輸流程為:
?
??? ·GPRS終端通過接口從客戶系統(tǒng)中取出用戶數(shù)據(jù);
??? ·處理后以GPRS分組數(shù)據(jù)的形式發(fā)送到GSM基站(BSS);
??? ·分組數(shù)據(jù)經(jīng)SGSN封裝后,發(fā)送到GPRS IP骨干網(wǎng);
??? ·若分組數(shù)據(jù)是發(fā)送到另一GPRS終端,則先發(fā)送到目的SGSN,再經(jīng)BSS發(fā)送到GPRS終端;若分組數(shù)據(jù)是發(fā)送到外部網(wǎng)絡(luò)(如Internet),則將分組數(shù)據(jù)包經(jīng)GGSN進(jìn)行協(xié)議轉(zhuǎn)換后,發(fā)送到外部網(wǎng)絡(luò),。
2 嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II
??? μC/OS-II是由Jean J. Labrosse先生編寫的,、現(xiàn)在流行的一種免費(fèi)公開源代碼的實(shí)時(shí)操作系統(tǒng)。它可廣泛應(yīng)用于從8位到64位單片機(jī)的各種不同類型,、不同規(guī)模的嵌入式系統(tǒng),。帶有詳細(xì)注解的μC/OS-II源代碼只有200頁(yè)左右;其中95%左右是用C語言編寫的,與MCU類型相關(guān)的代碼用8088匯編寫成,不超過200行。μC/OS-II不僅具有結(jié)構(gòu)小巧,、可固化,、可裁剪、多任務(wù)和可剝奪型的實(shí)時(shí)內(nèi)核等特點(diǎn);而且其實(shí)時(shí)性,、穩(wěn)定性和可靠性也得到了廣泛認(rèn)可,。μC/OS-II的最小內(nèi)核可編譯至2KB,一般情況占用內(nèi)存在10KB數(shù)量級(jí),適用基于8051的嵌入式系統(tǒng)的需要。在系統(tǒng)中嵌入μC/OS-II可以把整個(gè)程序分成許多任務(wù),每個(gè)任務(wù)相對(duì)獨(dú)立,然后在每個(gè)任務(wù)中設(shè)置超時(shí)函數(shù),時(shí)間用完后,必須交出MCU的使用權(quán),。即使一個(gè)任務(wù)發(fā)生問題,也不會(huì)影響其他任務(wù)的運(yùn)行,。在單片機(jī)系統(tǒng)中嵌入μC/OS-II提高了系統(tǒng)的可靠性,并使調(diào)試程序變得簡(jiǎn)單,同時(shí)也增強(qiáng)了系統(tǒng)的可擴(kuò)展性和產(chǎn)品開發(fā)的可延續(xù)性。
??? 不過μC/OS-II僅僅是一個(gè)實(shí)時(shí)操作系統(tǒng)內(nèi)核,與商業(yè)實(shí)時(shí)操作系統(tǒng)軟件包比較,它缺少Utilities部分,如文件系統(tǒng)、遠(yuǎn)程函數(shù)調(diào)用庫(kù),、通信軟件庫(kù),。通信軟件包括:TCP/IP軟件庫(kù)、藍(lán)牙通信軟件庫(kù),、IrDA紅外通信軟件庫(kù)等,。這一類軟件的解決有兩種途徑:一個(gè)是購(gòu)買第三方軟件;另一個(gè)是自己編寫。如果只是用單片機(jī)實(shí)現(xiàn)TCP/IP協(xié)議中的某些功能,可以選用免費(fèi)公開源代碼的小型TCP/IP協(xié)議棧,把它移植到μC/OS-II,。目前μC/OS-II的最新版本為V2.70,但現(xiàn)在廣泛學(xué)習(xí)和應(yīng)用的是V2.52,。
3 小型TCP/IP協(xié)議棧μIP
??? μIP是由瑞士計(jì)算機(jī)科學(xué)院的Adam Dunkels等開發(fā)的一種免費(fèi)公開源代碼的小型TCP/IP協(xié)議棧,它專門為8位和16位MCU編寫。μIP完全是用C語言編寫,它在保證一個(gè)完整的TCP/IP棧的前提下,只保留了最必要的一系列特征,使其代碼最少,、占用的RAM最小;它只能處理單一的網(wǎng)絡(luò)接口,。通常的TCP/IP棧采用BSD socket API,需要來自下層的多任務(wù)操作系統(tǒng)的支持,而且任務(wù)管理、語境切換以及堆??臻g的分配都要占用很大的開銷,超出了8位機(jī)系統(tǒng)的能力。μIP采用了一個(gè)事件驅(qū)動(dòng)接口,通過調(diào)用應(yīng)用程序響應(yīng)事件,。而相應(yīng)的應(yīng)用程序作為C函數(shù)調(diào)用,。通常情況下,μIP的源代碼雖然只有幾KB,RAM占用僅幾百字節(jié),但μIP提供了網(wǎng)絡(luò)通信所必須的協(xié)議,包括:ARP、SLIP,、IP,、UDP、ICMP(PING)和TCP;能夠滿足8位MCU接入TCP/IP網(wǎng)絡(luò)(如Internet)的需要,。目前μIP最新的版本為V0.9,符合Internet標(biāo)準(zhǔn),。
4 GPRS終端的工作原理及硬件實(shí)現(xiàn)
??? GPRS終端由控制模塊" title="控制模塊">控制模塊控制TCP/IP模塊和無線發(fā)送模塊實(shí)現(xiàn)。其結(jié)構(gòu)框圖如圖2所示,。
?
4.1 控制模塊
??? 控制模塊的作用主要有:
??? ·控制模塊通過AT指令初始化GPRS無線模塊,使之附著在GPRS網(wǎng)上,獲得網(wǎng)絡(luò)運(yùn)營(yíng)商動(dòng)態(tài)分配給GPRS終端的IP地址,并與目的終端或服務(wù)器之間建立連接;
??? ·控制模塊通過RS232串口" title="串口">串口向客戶系統(tǒng)收發(fā)數(shù)據(jù)或指令;
??? ·控制模塊通過RS232串口向TCP/IP模塊收發(fā)數(shù)據(jù);
??? ·控制模塊自主或根據(jù)遠(yuǎn)程控制指令采取其他操作,。
??? 控制模塊的MCU選用華邦的八位機(jī)WINBOOD W77E58。W77E58是臺(tái)灣華邦公司生產(chǎn)的,、與MCS51系列單片機(jī)兼容的,、可多次編程的快速微處理器,在其內(nèi)部集成有32KB的可重復(fù)編程的Flash ROM、256字節(jié)的片內(nèi)存儲(chǔ)器,、1KB用MOVX指令訪問的SRAM,、可編程看門狗定時(shí)器、三個(gè)16位定時(shí)器,、二個(gè)增強(qiáng)型的全雙工串行口,、片內(nèi)RC振蕩器、雙16位數(shù)據(jù)指針等諸多功能,。在很多場(chǎng)合,幾乎不用擴(kuò)展外圍芯片就能夠滿足系統(tǒng)要求,。由于其采用了全新設(shè)計(jì)的微處理器內(nèi)核,去除多余的時(shí)鐘和存儲(chǔ)周期,在相同的晶振頻率下,根據(jù)不同的指令類型,其運(yùn)行速度一般比傳統(tǒng)8051系列快1.5~3倍。一般情況下,平均可達(dá)2.5倍以上。另外,由于W77E58采用全靜態(tài)CMOS設(shè)計(jì),能工作在低速晶振頻率下,。與普通的8051相比,若W77E58采用低速工作頻率,在相同的指令吞吐量下,W77E58的節(jié)電性能也將大大提高,。
4.2 TCP/IP模塊
??? TCP/IP模塊通過RS232串口與GPRS無線模塊通信,提供非透明和透明兩路通道。相對(duì)應(yīng)地,該模塊有兩種傳輸模式:透明模式和非透明模式,。通過軟件切換,模塊在處于不同的傳輸模式時(shí),數(shù)據(jù)流向也有所不同,。當(dāng)傳送AT指令集時(shí),模塊進(jìn)入透明模式,可以直接訪問GPRS無線模塊;當(dāng)模塊進(jìn)入非透明傳輸方式時(shí),用戶數(shù)據(jù)從串口進(jìn)入TCP/IP模塊后,先打成TCP/IP包,再經(jīng)串口發(fā)送給GPRS模塊;GPRS無線模塊把其封裝成GPRS分組數(shù)據(jù)包傳到GPRS網(wǎng)上。TCP/IP模塊由基于單片機(jī)8051的嵌入式系統(tǒng)實(shí)現(xiàn),。選用WINBOOD W77E58作為嵌入式系統(tǒng)的微處理器,嵌入式實(shí)時(shí)操作系統(tǒng)選用μC/OS-II,然后在μC/OS-II中移植μIP實(shí)現(xiàn)TCP/IP協(xié)議棧,。
4.3 GPRS無線模塊
??? GPRS無線模塊作為GPRS終端的無線收發(fā)模塊,把從TCP/IP模塊接收的TCP/IP包和從基站接收的GPRS分組數(shù)據(jù)進(jìn)行相應(yīng)的協(xié)議處理后再轉(zhuǎn)發(fā)。GPRS無線模塊采用了SIEMENS公司的MC35 GPRS 模塊,。MC35模塊主要由射頻天線,、內(nèi)部Flash、SRAM,、GSM基帶處理器,、匹配電源和一個(gè)40腳的ZIF插座組成。GSM基帶處理器是核心部件,其作用相當(dāng)于一個(gè)協(xié)議處理器,用來處理外部系統(tǒng)通過串口發(fā)送過來的AT指令,。射頻天線部分主要實(shí)現(xiàn)信號(hào)的調(diào)制與解調(diào)?熏以及外部射頻信號(hào)與內(nèi)部基帶處理器之間的信號(hào)轉(zhuǎn)換,。匹配電源為處理器及射頻部分提供所需的電源。MC35 GPRS模塊支持GSM900和GSM1800雙頻網(wǎng)絡(luò),接收速率可達(dá)86.20kbps?熏發(fā)送速率可達(dá)21.5kbps,并且很容易集成,。當(dāng)然最大的數(shù)據(jù)吞吐量還要依賴于GPRS網(wǎng)絡(luò)的支持,。
5 TCP/IP模塊的軟件實(shí)現(xiàn)
5.1 μC/OS-II在8051上的移植
??? μC/OS-II是自由軟件,非商業(yè)的運(yùn)用如科研、教學(xué)都是免費(fèi)的,。任何使用者都可以從互聯(lián)網(wǎng)上下載其源代碼,通過適當(dāng)?shù)男薷募右砸浦?使其滿足自己硬件和系統(tǒng)的需要,。為了移植,需要先了解μC/OS-II操作系統(tǒng)的總體結(jié)構(gòu),圖3所示是μC/OS-II的結(jié)構(gòu)及與硬件的關(guān)系[2]。
?
??? 與處理器無關(guān)的代碼中包含了μC/OS-II的系統(tǒng)函數(shù),在進(jìn)行系統(tǒng)移植時(shí)一般不需要對(duì)這部分進(jìn)行修改;只要將UCOS-II.C文件包含在自己的項(xiàng)目中,即可將μC/OS-II中所有與MCU無關(guān)的代碼包含到移植的代碼中,。
??? 與應(yīng)用相關(guān)的代碼是用戶根據(jù)自己的應(yīng)用系統(tǒng)定制合適的內(nèi)核服務(wù)功能,它包括兩個(gè)文件:OS_CFG.H,、INCLUDES.H。其中OS_CFG.H用來配置內(nèi)核,用戶根據(jù)需要對(duì)內(nèi)核進(jìn)行定制,設(shè)置系統(tǒng)的基本情況,例如系統(tǒng)可提供的最大任務(wù)數(shù)量,、是否定制郵箱服務(wù),、是否需要系統(tǒng)提供任務(wù)掛起功能、是否提供任務(wù)優(yōu)先級(jí)動(dòng)態(tài)改變功能等,。而INCLUDES.H則是系統(tǒng)頭文件,。
??? 處理器相關(guān)的代碼中包含了對(duì)各種不同類型MCU的支持,需要根據(jù)自己的MCU對(duì)這部分進(jìn)行修改。針對(duì)Keil C51編譯器和8051芯片的技術(shù)特點(diǎn),μC/OS-II的移植與三個(gè)文件相關(guān):處理器相關(guān)C文件(OS_CPU.H,、OS_CPU_C.C)和匯編文件(OS_CPU_A.ASM),。
??? (1)修改OS_CPU.H?
??? 文件OS_CPU.H中包括了用#define語句定義的與處理器相關(guān)的常數(shù)、宏以及類型,。移植時(shí)主要修改的內(nèi)容有:
??? ·與編譯器相關(guān)的數(shù)據(jù)類型的設(shè)定,。參考Keil C51編譯器中的幫助文件C51.PDF,具體路徑為KeilC51HLPC51.PDF,。
??? ·用#define語句定義了兩個(gè)宏開關(guān)中斷,具體實(shí)現(xiàn)為:
??? #define OS_ENTER_CRITICAL() EA=0? //關(guān)中斷
??? #define OS_EXIT_CRITICAL()?? EA=1? //開中斷
??? ·根據(jù)8051堆棧的方向定義OS_STK_GROWTH。
??? #define OS_STK_GROWTH 0?? //8051堆棧從下向上遞增
??? 置OS_STK_GROWTH為0,表示堆棧從下(低地址)向上(高地址)遞增;置OS_STK_GROWTH為1,表示堆棧從上(高地址)向下(低地址)遞減,。
??? ·μC/OS-II從低優(yōu)先級(jí)任務(wù)切換到高優(yōu)先級(jí)任務(wù)時(shí)需要用到OS_STK_SW(),通過執(zhí)行OS_STK_SW()模仿中斷的產(chǎn)生,。絕大多數(shù)CPU會(huì)提供軟中斷或指令陷阱(TRAP)完成這項(xiàng)功能。中斷服務(wù)子程序或指令陷阱處理函數(shù)(也叫異常處理函數(shù))的中斷向量地址必須指向匯編語言函數(shù)OSCtxSw(),。因?yàn)?051沒有軟中斷指令,所以用程序調(diào)用代替,。
??? #define OS_TASK_SW()?? OSCtxSw()
??? (2)修改OS_CPU_C.C
??? μC/OS-II的移植范例要求用戶編寫10個(gè)簡(jiǎn)單的C函數(shù),其中OSTaskStkInit()是必要的,其他9個(gè)函數(shù)必須聲明,但不一定包含任何代碼。因?yàn)镵eil C51在缺省情況下把函數(shù)編譯為不可重入的結(jié)構(gòu),而多任務(wù)系統(tǒng)要求并發(fā)操作導(dǎo)致重入,所以要在每個(gè)C函數(shù)及其聲明后標(biāo)注reentrant關(guān)鍵字,使編譯器生成的代碼在運(yùn)行中支持函數(shù)可重入,。另外,“pdata”,、“data”在μC/OS-II中用做一些函數(shù)的形參,但它同時(shí)又是Keil C51的關(guān)鍵字,這樣會(huì)導(dǎo)致編譯錯(cuò)誤。通??砂选皃data”改成“ppdata”,“data”改成“ddata”解決此問題,。具體修改的代碼如下:
??? void?* OSTaskStkInit?( void????(*task) (void *pd),?
?????????????????????????? void? *ppdata,
????????????????? ???????? void? *ptos,
????????????????? ???????? INT16U opt) reentrant
????/*μC/OS-II通過調(diào)用OSTaskStkInt?穴?雪初始化任務(wù)的堆棧結(jié)構(gòu),使堆棧看起來就像剛發(fā)生過中斷,所有的寄存器保存到堆棧中,并返回棧頂指針給調(diào)用該函數(shù)的函數(shù)*/
??? void OSTaskCreateHook*OS_TCB *ptcb) reentrant
??? void OSTaskDelHook(OS_TCB *ptcb) reentrant
??? void OSTaskSwHook(void) reentrant
??? void OSTaskIdleHook(void) reentrant
??? void OSTaskStatHook(void) reentrant
?? ?void OSTimeTickHook(void) reentrant
??? void OSInitHookBegin(void) reentrant
??? void OSInitHookEnd(void) reentrant
??? void OSTCBInitHook(void) reentrant
??? (3)編寫OS_CPU_A.ASM
??? μC/OS-Ⅱ的移植范例要求用戶編寫四個(gè)簡(jiǎn)單的匯編語言函數(shù):
?? ?OSStartHighRdy()
?? ?OSCtxSw()
?? ?OSIntCtxSw()
?? ?OSTickISR()
5.2 μC/OS-II下μIP的實(shí)現(xiàn)
??? 在基于8051的μC/OS-II中,移植μIP不需要對(duì)現(xiàn)有的TCP/IP源代碼做任何修改,但是必須為網(wǎng)絡(luò)設(shè)備(如網(wǎng)卡芯片,、串口等)寫一個(gè)驅(qū)動(dòng)程序,。同時(shí),現(xiàn)有系統(tǒng)的集成部分也要進(jìn)行相應(yīng)的處理,例如當(dāng)有數(shù)據(jù)到達(dá)或者周期性的定時(shí)器計(jì)數(shù)滿等情況下,主控制系統(tǒng)應(yīng)該調(diào)用μIP函數(shù)[3]。移植的具體步驟如下[4]:
??? ·在目錄uip-0.9/下創(chuàng)建一個(gè)自己的目錄,例如uip-0.9/8051/;
?? ?·把uip_arch.c文件從目錄uip-0.9/unix/中復(fù)制到目錄uip-0.9/8051中;它包含了用C語言實(shí)現(xiàn)的32位加法,、校驗(yàn)和算法;
??? ·把uipopt.h文件從目錄uip-0.9/unix中復(fù)制到目錄uip-0.9/8051中,并對(duì)其進(jìn)行修改,以滿足系統(tǒng)的需要,。uipopt.h是μIP的配置文件,其中不僅包含了諸如μIP網(wǎng)點(diǎn)的IP地址和同時(shí)可連接的最大值等設(shè)置選項(xiàng),而且還有系統(tǒng)結(jié)構(gòu)和C編譯器的特殊選項(xiàng);
??? ·參考例子unix/tapdev.c和uip/slipdev.c,為串口編寫驅(qū)動(dòng)程序;
??? ·參考例子unix/main.c,寫自己的主控制系統(tǒng),以便在適當(dāng)?shù)臅r(shí)候可以調(diào)用μIP函數(shù);
??? ·編譯源代碼。
??? 本文闡述了基于8051嵌入式系統(tǒng)的GPRS終端的實(shí)現(xiàn),并詳細(xì)介紹了嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II基于8051的移植以及小型TCP/IP協(xié)議棧 uIP的移植,。該GPRS終端利用GPRS網(wǎng)和Internet能夠與相應(yīng)的GPRS終端以及相應(yīng)的Internet終端進(jìn)行數(shù)據(jù)傳輸。在GPRS終端的TCP/IP模塊中引入時(shí)實(shí)操作系統(tǒng)不但改善了系統(tǒng)的性能,提高了系統(tǒng)的可靠性,而且增強(qiáng)了系統(tǒng)的可擴(kuò)展性和產(chǎn)品開發(fā)的可延續(xù)性,。
參考文獻(xiàn)
1 李 華. 現(xiàn)代移動(dòng)通信新技術(shù).GPRS系統(tǒng). 廣州:華南理工大學(xué)出版社,2001
2 Labrosse Jean J著?熏邵貝貝譯.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ(第2版). 北京:北京航天航空大學(xué)出版社,2003
3 Adam Dunkels. μIP documentation
4 Adam Dunkels. μIP source code