基于A(yíng)RM uCLinux的網(wǎng)絡(luò )控制系統設計與實(shí)現
隨著(zhù)網(wǎng)絡(luò )和通信技術(shù)的發(fā)展,嵌入式系統現已進(jìn)入高速發(fā)展階段。并在社會(huì )各個(gè)領(lǐng)域得到了廣泛的應用。本文介紹了一種采用ARM+uCLinux作為開(kāi)發(fā)平臺。實(shí)現基于TCP/IP的遠程系統監控.從而取代傳統單片機來(lái)實(shí)現數據采集、預處理和通信功能;并依靠互聯(lián)網(wǎng)將數據向上位機傳送,同時(shí)支持遠端客戶(hù)對設備進(jìn)行遠程控制,從而實(shí)現遠程監控功能的具體方法。
1 系統平臺的構建
本系統由嵌入式平臺服務(wù)器、前端控制器、前端傳感器、客戶(hù)端和配置PC 組成。開(kāi)發(fā)時(shí)可通過(guò)配置PC來(lái)下載系統和應用軟件。嵌入式系統平臺能夠收集現場(chǎng)數據。并傳送到遠端客戶(hù)機,之后由遠端客戶(hù)機對數據進(jìn)行處理,接著(zhù)發(fā)送控制信號給系統服務(wù)器,以便通過(guò)前端控制器對設備進(jìn)行遠程控制。其系統結構如圖1所示。
1.1 硬件開(kāi)發(fā)平臺
該系統的硬件開(kāi)發(fā)平臺可選擇SmartARM2200。該嵌入式設備的核心是ARM7TDMI的LPC2210.開(kāi)發(fā)板自身具有A/D轉換器和多個(gè)GPIO(通用I/O)口,可對工業(yè)現場(chǎng)的各種設備、儀表進(jìn)行數據采集和監控。使用時(shí),只要將相應的傳感器信號接入控制器的端口即可。其開(kāi)發(fā)板系統的硬件配置如圖2所示。
1.2 uCLinux操作系統
操作系統是嵌入式設備軟件的核心部分。本系統采用 uCLinux系統平臺來(lái)完成對硬件系統的管理和維護。uCLinux是廣泛應用于微控制領(lǐng)域的一種嵌入式Linux操作系統。它通過(guò)對標準Linux內核的裁減,可去除虛擬內存管理部分代碼,以對內存分配進(jìn)行優(yōu)化。從而達到提高系統運行效率的目的。uCLinux則可經(jīng)過(guò)各方面的小型化改造形成一個(gè)高度優(yōu)化、代碼緊湊的嵌入式Linux,它保留了Linux的大多數優(yōu)點(diǎn),包括穩定、良好的移植性、優(yōu)秀的網(wǎng)絡(luò )功能、完備的文件系統支持、豐富的API等。
1.3 uCLinux在A(yíng)RM平臺上的移植
若將uCLinux移植到SmartARM2200上,需要進(jìn)行以下四個(gè)步驟:
(1)下載源碼,建立交叉編譯環(huán)境
uCLinux是自由軟件(完全開(kāi)放代碼)。用戶(hù)可以直接從http://www.uclinux.org/pub/uclinux處下載源代碼并安裝到Red Hat9.0系統下,以便正常在Red Hat9.0建立起交叉編譯環(huán)境。
(2)配置和編譯內核
進(jìn)入到安裝好的uCLinux目錄,依次執行下面的命令:
make menuconfig;進(jìn)入配置菜單后,選擇Vendor/Product(廠(chǎng)商/產(chǎn)品)下的PHILIPS/lpc2200;用Kernel Version(內核版本)選擇Linux-2.4.x,Libc Version(函數庫版本)選擇uClibc:其余內核和應用程序選項可根據情況選擇。
make dep
make clean
make lib_only
make user_only
make romfs
make image
make
編譯結束后會(huì )在uCLinux安裝目錄下生成romfs.img文件,利用它可以制作RAM Disk,然后在linux-2.4.X目錄下生成elf格式的Linux內核文件,并以下列方式將其轉換成bin格式:
#arm-elf-objcopy-O binary linux linux.bin
從而生成下載用的uCLinux內核鏡像文件linux.bin。
(3)制作Ram Disk掛栽根文件系統
首先創(chuàng )建一個(gè)512 kB的虛擬磁盤(pán),并將虛擬磁盤(pán)文件格式轉化成ext2格式:
dd if/dev/zero of="initrd".img bs="1024" count="512"
mkfs.ext2-c init.img
然后將init.img和romfs.img加載到主機文件系統上,并在RAM中建立需要的目錄:/bin,/dev,/etc,/var,進(jìn)而拷貝ROM中的文件到ram目錄中。
下來(lái)在RAM盤(pán)dev目錄下創(chuàng )建設備節點(diǎn):
#mknod ram/dev/ttyS0 c 4 64
#mknod ram/dev/console c 5 1
最后卸載init.img和romfs.img,并應確保init.img修改已保存,至此,RAM DISK便創(chuàng )建完成。
(4)下載內核和文件系統
正確設置主板啟動(dòng)選擇跳線(xiàn)。主板加電后,在超級終端上便可以看到BootLoader引導信息,可選擇默認的FTP連接,并使用BootLoader默認的 IP進(jìn)行下載,然后啟動(dòng)gftp,輸入主板默認的IP和端口號。這樣,linux主機就可以和主機連接,最后選擇需要下載的Linux內核文件和RAM盤(pán)及相關(guān)的配置文件即可。
2 監控系統功能的實(shí)現
監控系統主要由3個(gè)部分組成:數據采集部分,設備控制部分,數據傳輸部分。數據采集部分可對傳感器信號進(jìn)行A/D轉換,并對采集到的數據進(jìn)行簡(jiǎn)單的處理,同時(shí)提供調整運行參數的接口。數據傳輸部分可將采集的數據傳送到遠端的主機,并接收遠端主機的控制信息。遠端主機則對傳輸過(guò)來(lái)的遠程數據進(jìn)行處理、存儲和顯示,并可以修改數據采集部分的參數以控制數據采集,同時(shí)依據采集到的數據對設備發(fā)出操作指令,或對遠端的設備進(jìn)行控制,從而實(shí)現遠程監控功能。
2.1 數據采集
使用A/D轉換設備前,首先要創(chuàng )建設備節點(diǎn),并加載ADC驅動(dòng),然后通過(guò)open()和close()將其打開(kāi)和關(guān)閉.主要的數據采集程序如下:
……
ioctl(fd,ADC_SET_CLKDIV,(Fpclk+fadc1)/fadc-1);//設置A/D轉換速度;
ioctl(fd,ADC_SET_BITS,10);//設置A/D轉換精度;
while(1) {
ad_data=0;
read(fd,&ad_data,sizeof(ad_data));//讀取A/D轉換的值;
……
2.2 GPIO設備控制
同A/D轉換設備類(lèi)似,使用GPIO也需先創(chuàng )建設備節點(diǎn)并加載驅動(dòng)。對GPIO操作前,應通過(guò)open()打開(kāi),使用后應通過(guò)close()關(guān)閉。
首先。選定開(kāi)發(fā)板上沒(méi)有使用過(guò)的GPIO端口,設定其輸入/輸入狀態(tài),然后根據客戶(hù)端返回的信息對端口進(jìn)行操作,輸出0/1的電平,以使其外部連接的繼電器動(dòng)作。從而控制設備的運轉。程序主要通過(guò)函數ioctl來(lái)實(shí)現。ioctl是設備驅動(dòng)程序中對設備的I/O通道進(jìn)行管理的函數,通過(guò)它可對設備的一些特性進(jìn)行控制.其函數原形為:
int ioctl(int fd,ind cmd,…);
其中,fd是用程序打開(kāi)設備時(shí),使用open函數返回的文件標示符;cmd是用戶(hù)程序對設備的控制命令;至于后面的省略號,則是一些補充參數(一般最多一個(gè),有或沒(méi)有是和cmd的意義相關(guān)的)。在這里,可通過(guò)如下一組函數來(lái)實(shí)現:
ioctl(fd1,GPIO_SET_PIN_IN,devicel);
//設置管角為輸出狀態(tài);
ioctl( fd2, GPIO_SET_PIN_OUT, devicel_state);
//設置管角為輸入狀態(tài);
ioctl(fd2,GPIO_READ_PIN,&devicel_state);
//讀取設備狀態(tài)管角;
ioctl(fd1,GPIO_CLR_PIN,device);
//清除設備管角控制信號;
2.3 網(wǎng)絡(luò )通信程序
網(wǎng)絡(luò )通信程序可使用TCP/IP協(xié)議下標準的socket套接字編寫(xiě)。套接字(socket)是網(wǎng)絡(luò )通信的基本操作單元。它提供了不同主機間進(jìn)程雙向通信的端點(diǎn)。這些進(jìn)程在通信前應各自建立一個(gè)socket,并通過(guò)對 socket的讀/寫(xiě)操作實(shí)現網(wǎng)絡(luò )通信功能。常用的套接字有兩種:流式套接字(Stream Socket)和數據報套接字(Datagram Socket)。其中,流式套接字是可靠的面向連接的通信數據流,是無(wú)錯誤的傳輸;而數據報套接字則使用UDP來(lái)傳送數據包,數據包的順序是沒(méi)有保障的。本系統采用流式套接字進(jìn)行程序設計。
流式套接字的服務(wù)進(jìn)程和客戶(hù)進(jìn)程建立連接及通信的程序流程如圖3所示?,F具體說(shuō)明如下:
(1)服務(wù)進(jìn)程首先調用socket()創(chuàng )建一個(gè)流式套接字,并調用bind()將服務(wù)器地址捆扎在該套接字上,接著(zhù)調用listen()監聽(tīng)連接請求,隨后調用accept()做好與客戶(hù)進(jìn)程建立連接的準備。無(wú)連接請求時(shí),服務(wù)進(jìn)程被阻塞;
(2)客戶(hù)進(jìn)程先調用socket()創(chuàng )建流式套接字,然后調用connect()向服務(wù)進(jìn)程發(fā)出連接請求;
(3)當連接請求到來(lái)后,服務(wù)進(jìn)程被喚醒,并生成一個(gè)新的流式套接字。同時(shí)用新套接字同客戶(hù)進(jìn)程的套接字建立連接,而服務(wù)進(jìn)程最早生成的套接字則繼續用于監聽(tīng)網(wǎng)絡(luò )上的服務(wù)請求;
(4)服務(wù)進(jìn)程和客戶(hù)進(jìn)程通過(guò)調用send()和recv()來(lái)交換數據,服務(wù)器可向客戶(hù)端傳送所收集的數據??蛻?hù)端則向服務(wù)器反饋控制信息和參數調整信息;
(5)服務(wù)進(jìn)程或客戶(hù)進(jìn)程可通過(guò)調用close()來(lái)撤消套接字并中斷連接。
服務(wù)器端的程序通過(guò)交叉編譯環(huán)境編譯后??赏ㄟ^(guò)NFS(網(wǎng)絡(luò )文件系統)下載到開(kāi)發(fā)板中,然后手動(dòng)加入到rc引導文件中。即可實(shí)現開(kāi)機自動(dòng)運行。
3 結束語(yǔ)
基于A(yíng)RM和CLinux嵌入式系統代表了目前嵌入式系統的發(fā)展方向。嵌 入式系統與網(wǎng)絡(luò )技術(shù)和控制技術(shù)相結合.是嵌入式系統發(fā)展的必然趨勢。本文討論了基于A(yíng)RM+uCLinux平臺的網(wǎng)絡(luò )控制系統設計與實(shí)現方法。并對該平臺下應用 TCP/IP協(xié)議進(jìn)行網(wǎng)絡(luò )通信進(jìn)行了探討。該方法對于自動(dòng)化樓宇、工業(yè)控制、智能家居等方面都有一定的借鑒意義。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)linux相關(guān)文章:linux教程
評論