引言
隨著Internet的發(fā)展和應(yīng)用,越來越多的嵌入式系統(tǒng)接入網(wǎng)絡(luò),。然而,,大部分嵌入式系統(tǒng)都是作為B/S模式中的應(yīng)用服務(wù)器,必須隨時對客戶機的請求做出回應(yīng),,要求具有較強的實時性,。mC/OS-II是近年來發(fā)展迅速的一個開放源碼實時操作系統(tǒng),具有移植性好,、可裁剪,、可固化的優(yōu)點。將mC/OS-II引入網(wǎng)絡(luò)嵌入式系統(tǒng),,既可以實現(xiàn)系統(tǒng)的實時性要求,,同時可以提高系統(tǒng)的可靠性,易于調(diào)試程序,。
圖1 系統(tǒng)硬件結(jié)構(gòu)框圖(點擊圖片放大)
圖2 系統(tǒng)TCP/IP協(xié)議部分程序流程圖(點擊圖片放大)
系統(tǒng)硬件設(shè)計
本系統(tǒng)設(shè)計中采用美國Cygnal公司生產(chǎn)的集成混合信號SoC芯片C8051F020,,其內(nèi)核與8051兼容。當(dāng)它工作在最大系統(tǒng)時鐘頻率 25MHz 時,,峰值速度可以達到 25MIPS,。C8051F020除了256B的內(nèi)部 RAM,還另有位于外部數(shù)據(jù)存儲器地址空間的 4KB的 XRAM,,以及64KB可在系統(tǒng)編程的 FLASH 存儲器,。因此,它有足夠的RAM空間用于存放1500B的以太幀,,以及μC/OS-II中再入函數(shù)的模擬棧,。C8051F020除了有標(biāo)準(zhǔn)8051的端口( P0、P1,、P2和P3)外,,還附加4個端口(P4、P5,、P6和P7),,內(nèi)部還有很多的功能器件,。
系統(tǒng)的硬件結(jié)構(gòu)框圖如圖1所示。網(wǎng)卡芯片使用臺灣 Realtek 公司生產(chǎn)的RTL8019AS,。在系統(tǒng)中用到的網(wǎng)卡地址為十六進制的0300H~0310H,因此,,C8051F020的P7口采用復(fù)用方式與RTL8019AS的數(shù)據(jù)/地址線相接,,網(wǎng)卡的SA8腳則直接與高電平相接。C8051F020的 P5.2與RTL8019AS的復(fù)位端相連,,用來復(fù)位網(wǎng)卡,。RTL8019AS則外接一個隔離LPF濾波器,通過RJ45接口接入以太網(wǎng),。多個單總線溫度傳感器DS18B20共享一條總線,,由 P3.0口進行控制。
系統(tǒng)軟件實現(xiàn)
TCP/IP協(xié)議實現(xiàn)
介質(zhì)訪問層主要由以太網(wǎng)控制器 RTL8019AS來實現(xiàn),,其數(shù)據(jù)通信協(xié)議采用IEEE802.3 標(biāo)準(zhǔn),,只處理接收地址與本機物理地址相符或為廣播地址的以太幀,并只對ARP,、IP數(shù)據(jù)報進行處理,。
網(wǎng)絡(luò)層實現(xiàn)IP、ARP和ICMP 協(xié)議:IP 數(shù)據(jù)報的首部保留 20 字節(jié)的基本控制信息,,每個IP數(shù)據(jù)報包含一個分片,;實現(xiàn)完整的ARP 協(xié)議;對于ICMP協(xié)議,, 只實現(xiàn) ICMP 中類型號為 0 ,,代碼為 0 的 Ping 應(yīng)答協(xié)議。
傳輸層實現(xiàn)TCP協(xié)議,。在系統(tǒng)中,,TCP 協(xié)議只用于支持 HTTP 協(xié)議,由于在連接時一直處于被動服務(wù)的狀態(tài),,因此在設(shè)計中省去了SYN - SENT 狀態(tài)和CLOSED狀態(tài),,讓它一開始就處于 LISTEN 狀態(tài),來監(jiān)聽客戶端的連接請求,,避免了主動打開的操作,,可更高效地服務(wù)于客戶機。而當(dāng)服務(wù)器發(fā)出數(shù)據(jù)報時,,系統(tǒng)并不存儲,,只是記錄下該數(shù)據(jù)報的狀態(tài)信息。由于系統(tǒng)中數(shù)據(jù)傳輸量少,,滑動窗口可設(shè)置為一個固定值(1 500 字節(jié) ),。
應(yīng)用層實現(xiàn)HTTP 協(xié)議?,F(xiàn)場監(jiān)測設(shè)備與用戶的交互式數(shù)據(jù)交換通過 HTTP 協(xié)議來實現(xiàn),HTTP在端口80上使用TCP的服務(wù),。系統(tǒng)TCP/IP協(xié)議部分程序的流程圖如圖2所示,。
uC/OS-II對TCP/IP協(xié)議及溫度監(jiān)測的實時管理
uC/OS-II在C8051F020單片機上的移植
uC/OS-II的移植,要求所用的C編譯器支持混合編程,,在這里選用 KEIL C51集成開發(fā)環(huán)境,。由于uC/OS-II是可剝奪的實時操作系統(tǒng),任務(wù)隨時會被另一任務(wù)中斷,,一段時間后再可以運行,。為了防止在任務(wù)切換過程中相應(yīng)數(shù)據(jù)被破壞,mC/OS-II中使用了大量的可重入函數(shù),。在KEIL C51中,,Cx51編譯器為再入函數(shù)生成模擬棧,通過這個模擬棧完成參數(shù)傳遞和存放局部變量,。根據(jù)再入函數(shù)所采用的編譯模式(SMALL,、COMPACT、LARGE),,模擬??梢晕挥谄瑑?nèi)或片外存儲空間。對于本系統(tǒng),,模擬棧對RAM空間的要求較大,,故選用LARGE模式??芍苯永眯酒霞傻腦RAM(4K),,無須另外擴展外部數(shù)據(jù)存儲器。通過配置STARTUP.A51文件進行設(shè)置:
XBPSTACK EQU 1 ; //選用LARGE模式
XBPSTACKTOP EQU 1000H ; //設(shè)置再入棧棧頂指針
在移植過程中主要完成對以下五個文件的修改:與CPU相關(guān)的文件OS_CPU_A.ASM,、OS_CPU_C.C,、OS_CPU.H和與應(yīng)用相關(guān)的文件OS_CFG.H、INCLUDES.H,。
其移植過程在這里不是重點,,下面簡要介紹與應(yīng)用相關(guān)較緊密的部分設(shè)置。
0S-CPU.H:
#define OS_CRITICAL_ METHOD 1 //中斷方式1
#if OS_CRITICAL_METHOD == 1
#define OS_ENTER_ CRITICAL() EA=0
//關(guān)中斷
#define OS_EXIT_CRITICAL() EA=1 //開中斷
#endif
OS_CFG.H:
OSTimeDlyHMSM()函數(shù)使應(yīng)用程序無需知道延時時間對應(yīng)的時鐘節(jié)拍數(shù),,直接按小時,、分、秒,、毫秒來定義時間,,方便對任務(wù)運行時間進行管理。
#define OS_TIME_DLY_ HMSM_EN 1
//允許使用函數(shù)OSTimeDly HMSM(),。
由于每個嵌入式監(jiān)測系統(tǒng)可以同時與多個PC機連接,,向不同用戶提供信息,,因此可在OS_CFG.H頭文件中定義一個包含各種連接信息的結(jié)構(gòu)變量。當(dāng)TCP報文到時,,使用連接狀態(tài)信息檢查是否與已存在的連接相符,,如果不存在則建立新的連接。這種處理可以使嵌入式監(jiān)測系統(tǒng)同時處理來自同一或不同PC機的連接,。
typedef struct
{
INT32U ipaddr;
INT16U port;
INT8U timer;
INT8U inactivity;
INT8U state;
char query[20];
} CONNECTION;
在ARP協(xié)議部分,,嵌入式系統(tǒng)將收到的IP數(shù)據(jù)報的物理地址存放在一結(jié)構(gòu)變量中。如果是向同一PC機發(fā)送數(shù)據(jù)報,,不需要再次發(fā)送ARP請求就可得到目的主機的物理地址,減少了建立連接的時間,。
typedef struct
{
INT32U ipaddr;
INT8U hwaddr[6];
} ARP_CACHE;
在其中設(shè)置每個嵌入式系統(tǒng)的MAC地址,、IP地址、子網(wǎng)掩碼和網(wǎng)關(guān)地址,。
uC/OS-II中任務(wù)創(chuàng)建及優(yōu)先級設(shè)置
C8051F020的XRAM做輸入/輸出數(shù)據(jù)的內(nèi)部緩沖區(qū),,RTL8019AS內(nèi)部的16K SRAM做單片機的外部數(shù)據(jù)緩沖區(qū),存儲輸入/輸出以太幀隊列,。這樣C8051020就可以采用查詢方式讀取以太幀,,并有充足的時間處理數(shù)據(jù)。由于輸入幀的大小不定,,同時在ARP數(shù)據(jù)報發(fā)送或接收時,,輸出幀必須存在輸出緩沖區(qū)中,因此,,輸入/輸出數(shù)據(jù)緩沖區(qū)在C8051F020的XRAM中使用動態(tài)分配,,由KEIL C51 提供的malloc()和free()函數(shù)完成。網(wǎng)頁存儲于單片機的FLASH存儲器中,。當(dāng)嵌入式系統(tǒng)向PC機發(fā)送網(wǎng)頁時,,先將網(wǎng)頁從FLASH存儲器中取出放入XRAM,再根據(jù)用戶請求進行整理后放入RTL8019AS的SRAM,,并發(fā)送到以太網(wǎng)上,。
作為網(wǎng)絡(luò)服務(wù)器,C8051F020需要注意以下幾點:
1) 服務(wù)器向一客戶機發(fā)送ARP查詢分組后,,如果在0.5秒內(nèi)未收到ARP響應(yīng)分組,,則重發(fā)。
2) 如果TCP連接在0.5秒內(nèi)未被激活,,則調(diào)用初始化斷開連接程序,,防止兩個TCP之間的連接處理長時期空閑。
3) 為了控制丟失數(shù)據(jù)報,,TCP在規(guī)定時間(0.5秒)內(nèi)如果沒有收到確認包 ,,就重組這個包并發(fā)送 ,,這樣不需要占用存儲區(qū)來存儲包。當(dāng)收到客戶機接收到信息包的確認報后 ,,就斷開連接,。
uC/OS-II對系統(tǒng)的管理是通過對任務(wù)的管理來實現(xiàn)的。它把整個程序分成許多任務(wù),,每個任務(wù)相對獨立,。然后在每個任務(wù)中設(shè)置超時函數(shù),一旦任務(wù)的延時時間到,,任務(wù)必須交出 CPU 的使用權(quán),。根據(jù)需要,系統(tǒng)中創(chuàng)建了5個任務(wù),,設(shè)置如下:
任務(wù)1:OSTaskCreate(eth_ arive,,0,&mystack1[0],,4);// 查詢RTL8019AS,,是否有以太幀到達。
OSTimeDlyHMSM(0,,0,,0,500);// 延時0.5秒
任務(wù)2:OSTaskCreate(arp_ retran,,0,,&mystack2[0],5);//重發(fā)ARP分組
OSTimeDlyHMSM(0,,0,,1,0); // 延時1秒
任務(wù)3:OSTaskCreate(tcp_ inact,,0,,&mystack3[0],6);// 初始化斷開連接
OSTimeDlyHMSM(0,,0,,1,500);// 延時1.5秒
任務(wù)4:OSTaskCreate(read _temp,,0,,&mystack3[0],7);// 讀溫度值
OSTimeDlyHMSM(0,,0,,2,0); // 延時7秒
任務(wù)5:OSTaskCreate(tcp_ retran,,0,,&mystack3[0],,8);//TCP數(shù)據(jù)報重發(fā)
OSTimeDlyHMSM(0,0,,2,,500);// 延時2.5秒
結(jié)語
將網(wǎng)絡(luò)功能嵌入到溫度監(jiān)測系統(tǒng)中,可在網(wǎng)絡(luò)中接入多個節(jié)點,,每個節(jié)點連接多個單總線傳感器,,以此實現(xiàn)真正的多點溫度監(jiān)測,以滿足用戶的需要,。由于DS18B20是單總線溫度傳感器,,本身的溫度測量有些延時,因此在傳輸溫度數(shù)據(jù)時需要幾秒鐘的等待時間,,但對整個系統(tǒng)的影響不大,。采用嵌入式實時操作系統(tǒng)mC/OS-II,提高了系統(tǒng)的實時性和可靠性,,有利于用戶的管理和對溫度的實時監(jiān)測。
用戶可以利用廣泛存在的以太網(wǎng)資源,,通過瀏覽器直接訪問節(jié)點,,提高系統(tǒng)的開放性和互操作性,降低監(jiān)控運行維護成本,、提高監(jiān)控運行維護效率,。因此,基于嵌入式實時操作系統(tǒng)的嵌入式網(wǎng)絡(luò)有著廣闊的發(fā)展前景,。