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