王慶吉
(吉林大學儀器科學與電氣工程學院 吉林 130061)
隨著現(xiàn)代電子技術(shù)、數(shù)據(jù)處理解釋和計算機處理技術(shù)的發(fā)展,電法探測儀器逐漸成型,并且發(fā)展成為地下資源勘探中十分有效的方式之一,對探測儀器功能的完善意義重大。
可控源電磁探測系統(tǒng)網(wǎng)絡(luò)通信技術(shù)的實現(xiàn),不但豐富了可控源電磁探測系統(tǒng)的數(shù)據(jù)保存,還為可控源電磁探測系統(tǒng)通信技術(shù)提供了技術(shù)保證。完成無線通信設(shè)備驅(qū)動程序的編寫,并調(diào)試驅(qū)動軟件模塊,將其加載到硬件平臺上工作的內(nèi)核中,調(diào)試并修改程序。系統(tǒng)整體功能框架如圖1所示包括系統(tǒng)移植以及bootloader啟動分析;數(shù)據(jù)模塊和網(wǎng)絡(luò)模塊。
圖1 系統(tǒng)功能框
嵌入式系統(tǒng)是專用的計算機系統(tǒng),在使用嵌入式系統(tǒng)之前,必須搭建嵌入式系統(tǒng)平臺。嵌入式系統(tǒng)平臺的構(gòu)建主要是系統(tǒng)移植。本文用到的嵌入式系統(tǒng)的軟件操作系統(tǒng)是Linux,并在此操作系統(tǒng)下編寫了相應(yīng)的設(shè)備驅(qū)動程序。Linux是從Unix操作系統(tǒng)發(fā)展而來的,Unix操作系統(tǒng)是由貝爾實驗室開發(fā)的。Linux已經(jīng)成為一個備受歡迎的多線程,多任務(wù)的操作系統(tǒng)。廣泛用于多種硬件平臺,操作系統(tǒng)本身僅是由高效的可開發(fā)系統(tǒng)核構(gòu)成。由于用戶間的免費共享以及系統(tǒng)源文件的開放,使得這個系統(tǒng)具有很好的流傳。Linux應(yīng)用程序主要是由兩種特殊類型的文件:可執(zhí)行文件excutables和腳本scripts??蓤?zhí)行文件直接被計算機運行,它們可以生成窗口文件Windows.exe files。腳本文件是另一個程序的指令集,按照腳本可以完成程序的解釋。
文件在系統(tǒng)環(huán)境中發(fā)揮著重要的作用,它為操作系統(tǒng)和設(shè)備提供了高效簡單的訪問接口。除了一般文件,程序可以調(diào)用硬盤文件、串口文件、打印機文件和其他設(shè)備文件。文件目錄也是一種極特殊的文件,目錄文件具有節(jié)點號和其包含文件的文件名,每一個目錄入口點就是文件節(jié)點。每個文件夾下還包括一個Makefile文件,文件包含了程序的編譯規(guī)則。庫文件為設(shè)備和硬盤文件提供了一種高級接口,使系統(tǒng)更智能。設(shè)備能夠被使用,也必須借助驅(qū)動被內(nèi)核使用。
(1)硬件初始化 CFG_HW_INIT
(2)從nandflash加載鏡像到動態(tài)內(nèi)存ram,load_nandflash(IMG_ADDRESS,IMG_SIZE,JUMP_ADDR)
(3)處理鏡像文件,decompress_image((void*)IMG_ADDRESS,(void*)JUMP_A DDR,IMG_SIZE)
(4)開始應(yīng)用程序,設(shè)置偏移量
Crt0_gnu.S文件由匯編語言構(gòu)成的初始文件。它是首先被執(zhí)行的指令集,啟動程序乃至整個軟件操作系統(tǒng)運行的第一個文件。應(yīng)用程序開始的入口點,設(shè)置了中斷向量并初始化堆棧等,最后進入main主函數(shù)中和跳到應(yīng)用程序入口。
設(shè)備驅(qū)動在操作系統(tǒng)Linux內(nèi)核發(fā)揮重要作用,使得硬件成為對某些特定程序作出相應(yīng)反應(yīng)的內(nèi)部可編程程序接口,在執(zhí)行過程中完全隱藏了設(shè)備工作的具體細節(jié)。通過一系列依賴特定驅(qū)動程序的標準指令來實現(xiàn)用戶要完成的行為功能,將這些標準指令組織起來,讓實際硬件根據(jù)指令發(fā)揮相應(yīng)的作用,這就是設(shè)備驅(qū)動要完成的。這個所謂的可編程的接口驅(qū)動能夠獨立于內(nèi)核存在,也可以在內(nèi)核運行需要時進行加載。事實上許多設(shè)備驅(qū)動和用戶程序一起發(fā)行用來幫助構(gòu)造和使用目標設(shè)備。這些程序包含很多種,從簡單公用程序到完全的圖形化應(yīng)用程序。
Linux將設(shè)備驅(qū)動分為 3種,每個模塊至少完成其中的一種設(shè)備驅(qū)動類型。這三種設(shè)備驅(qū)動的類型分別是:字符型設(shè)備模塊、塊設(shè)備模塊、網(wǎng)絡(luò)設(shè)備模塊。設(shè)備驅(qū)動的模塊化使得設(shè)備驅(qū)動劃分成不同的類型,不同類型之間并不是孤立的,可以用一系列的代碼將不同的設(shè)備驅(qū)動整合成一個大的模塊具備更強大的功能。通過insmod和rmmod可以對模塊進行加載和卸載,而且只有超級用戶才有權(quán)限加載和卸載模塊。通過insmod命令調(diào)用模塊中的init_module函數(shù)通知內(nèi)核有模塊進行注冊,然后直接引用內(nèi)核函數(shù)register_capability( ),一旦內(nèi)核有空閑就發(fā)送響應(yīng)請求執(zhí)行模塊程序。此時,模塊程序中可以直接調(diào)用內(nèi)核函數(shù)進行內(nèi)核操作。模塊注銷時,不用申請響應(yīng)而是直接通過unregister_capability( )注銷。鏈接模塊到內(nèi)核過程如圖2。
圖2 鏈接模塊到內(nèi)核圖
Makefile文件是一種腳本文件,把各級目錄下的文件有規(guī)則的組織在一起;它是一種程序編譯規(guī)則。它的獨特優(yōu)勢在于“自動化編譯”,就是腳本代碼寫好后,執(zhí)行命令就會按照腳本進行編譯。在腳本語言中,我們首先要把源文件編譯成中間代碼文件也就是.o文件,然后把.o文件鏈接成可執(zhí)行文件。書寫規(guī)則如下:
(1)如果工程沒有編譯過,所有源文件都要編譯并鏈接。
(2)如果工程中有文件被修改,只編譯和鏈接被修改的文件。
(3)如果工程中頭文件被修改,只編譯引用頭文件的源文件。
網(wǎng)絡(luò)通信的發(fā)展方便了我們的生活,因為地形復(fù)雜的山地不方便儀器的架設(shè)。而通過網(wǎng)絡(luò)通信大大豐富了系統(tǒng)的功能。設(shè)備發(fā)送隊列dev_queue_xmit( )申請傳輸數(shù)據(jù),在設(shè)備結(jié)構(gòu)描述中找到相應(yīng)的設(shè)備發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包函數(shù)和設(shè)備名,發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包函數(shù)hard_start_xmit( )通過物理設(shè)備發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包。和前兩種驅(qū)動類型不同,網(wǎng)絡(luò)驅(qū)動能夠異步接收和發(fā)送數(shù)據(jù)包文件。它還要完成發(fā)地址,修改傳輸參數(shù),阻塞處理和錯誤統(tǒng)計等任務(wù)。內(nèi)核網(wǎng)絡(luò)子系統(tǒng)完全依賴網(wǎng)絡(luò)協(xié)議和硬件協(xié)議。網(wǎng)絡(luò)協(xié)議是實現(xiàn)網(wǎng)絡(luò)傳輸?shù)母鞣N協(xié)議;硬件協(xié)議是網(wǎng)絡(luò)設(shè)備硬件驅(qū)動程序,負責與硬件設(shè)備通信與數(shù)據(jù)傳輸驅(qū)動接口都被結(jié)構(gòu)體struct net_device表示:
初始化的主要作用是為網(wǎng)絡(luò)設(shè)備提供一個設(shè)備結(jié)構(gòu)文件;網(wǎng)絡(luò)設(shè)備和結(jié)構(gòu)文件緊密連接,相互依賴。結(jié)構(gòu)包含:打開設(shè)備,關(guān)閉設(shè)備,設(shè)備配置,硬件傳輸,I/O控制,設(shè)備狀態(tài),重建文件頭,網(wǎng)絡(luò)硬件結(jié)構(gòu)件頭,傳輸超時,看門狗超時,地址解析協(xié)議禁用標志,設(shè)置模塊所有者等參數(shù)。網(wǎng)絡(luò)硬件結(jié)構(gòu)件頭包含:設(shè)備名,設(shè)備內(nèi)存信息,網(wǎng)絡(luò)接口的I/O地址,中斷號,接口選擇,DMA通道,設(shè)備狀態(tài),指向下一個設(shè)備的指針,初始化。網(wǎng)絡(luò)硬件結(jié)構(gòu)文件的很多參數(shù)都可以在ifconfig中看到。除了以上網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)文件可見的參數(shù)外,網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)文件中還有很多不可見的參數(shù),這些參數(shù)在結(jié)構(gòu)中也都發(fā)揮著重要作用。內(nèi)核網(wǎng)絡(luò)子系統(tǒng)即網(wǎng)絡(luò)接口是系統(tǒng)初始化時實時自動生成的,內(nèi)核支持而實際不存在的網(wǎng)絡(luò)物理設(shè)備。而對于字符設(shè)備和塊設(shè)備,無論有沒有實際的物理設(shè)備,內(nèi)核都生成其接。當驅(qū)動鏈接到內(nèi)核時,網(wǎng)絡(luò)驅(qū)動不在內(nèi)核里聲明此網(wǎng)絡(luò)設(shè)備結(jié)構(gòu);而是在drivers/net/space.c里聲明設(shè)備結(jié)構(gòu)文件,這個文件的下有很多網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)的聲明。系統(tǒng)啟動時,網(wǎng)絡(luò)初始化代碼把所有的網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)都初始化,初始化時僅僅是給設(shè)備本身一個指針。另外,網(wǎng)絡(luò)設(shè)備驅(qū)動的注冊也不需要創(chuàng)建設(shè)備文件,而是直接通過設(shè)備名從設(shè)備描述結(jié)構(gòu)鏈表中找到對應(yīng)的struct net_device結(jié)構(gòu),可以直接用此結(jié)構(gòu)對應(yīng)的操作函數(shù)進行注冊。
以太網(wǎng)MAC模塊兼容IEEE802.3標準,包含地址檢測,統(tǒng)計和控制寄存器,收發(fā)塊,DMA接口。地址檢測辨認4個標準的48位地址,它還包含一個64位應(yīng)急寄存器來匹配廣播和單發(fā)地址。統(tǒng)計寄存器塊對收發(fā)操作相關(guān)的各種類型事件計數(shù),能讓軟件產(chǎn)生網(wǎng)絡(luò)管理統(tǒng)計兼容 IEEE802.3,它和狀態(tài)字被存在接收緩存表中。DM 9161A是具有網(wǎng)絡(luò)功能,工作在物理層,低功率收發(fā)芯片。從而決定物理層設(shè)備的職能,但這些功能依然由協(xié)議完成。串口管理接口包括管理數(shù)據(jù)時鐘和管理數(shù)據(jù)輸入輸出信號。自動識別媒體功能能夠讓它自動識別是直連還是交叉雙絞線,通過置位某特定寄存器的設(shè)置位即可。圖3網(wǎng)絡(luò)芯片硬件電路9161原理圖。
圖3 網(wǎng)絡(luò)芯片9161原理圖
進行網(wǎng)絡(luò)編程,套接字是至關(guān)重要的;套接字代表通信的端口,通過套接字建立通信的橋梁。套接字有描述符,應(yīng)用程序可以通過描述符操作套接字。通過 socket( )創(chuàng)建套接字;同時套接字只有和地址綁定之后才有意義,通過bind( )進行地址綁定。函數(shù) socket( )有四個參數(shù),分別表示通信域,套接字類型,制定協(xié)議。通過套接字和connect( )函數(shù)建立一個連接,建立連接之后,我們就可以通過send( )和recv( )發(fā)送和接收數(shù)據(jù)了。函數(shù)send( )有四個參數(shù):第一個表示通信,連接套接字;第二個是設(shè)置發(fā)送緩沖區(qū);第三個表示發(fā)送內(nèi)容字節(jié)數(shù);第四個是傳輸數(shù)據(jù)標志。發(fā)送成功則返回已發(fā)送數(shù)據(jù)的字節(jié)數(shù),否則返回-1。函數(shù) recv( )也有四個參數(shù):第一個用來通信的套接字;第二個讀緩沖區(qū)設(shè)置;第三個讀最大字節(jié)數(shù);第四個接收數(shù)據(jù)標志。而返回值有三種情況:大于零表示成功接收數(shù)據(jù)返回已接收字節(jié)數(shù)目;等于零表示無數(shù)據(jù)接收;小于零表示接收數(shù)據(jù)出錯。網(wǎng)絡(luò)驅(qū)動程序客戶端仔程序流程如圖4。
圖4 網(wǎng)絡(luò)通信客戶端流
[1]楊建華.嵌入式 Linux設(shè)備驅(qū)動程序開發(fā)[D].華南理工大學碩士論文,2010.
[2]王巖,王子牛.嵌入式Linux設(shè)備驅(qū)動的研究與開發(fā)[J].貴州工業(yè)大學學報(自然科學版),2006,32(19):283-285.
[3]張靜.嵌入式ARM 9200與MCP2510的通信研究[D].太原科技大學碩士論文,2008.
[4]吳岳.Linux c程序設(shè)計大全.清華大學出版社[M].北京:2009年3月第一版.