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